
✨ 长期致力于奇异值分解、广义奇异值分解、Jacobi-Davidson方法、非精确方法研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1非精确Jacobi-Davidson SVD方法及内迭代停机准则针对大规模稀疏矩阵的内部奇异三元组计算提出非精确JDSVD方法其中校正方程使用共轭梯度法近似求解而不需要精确解。推导了残差与外迭代收敛的关系证明了只要内迭代将残差减小到当前外迭代残差的γ倍γ1整体收敛率仍然保持超线性。设计自适应停机准则当内迭代的残差范数小于外迭代残差范数的0.1倍时停止。数值实验表明该方法比精确求解版本节省约60%内迭代次数而奇异值精度损失小于1e-10。对于多个内部奇异值采用锁定和收缩技术每次收敛后缩小子空间。在测试矩阵来自有限元离散上计算最小的6个奇异值整体耗时比Lanczos法快2.3倍。2广义奇异值分解的数值稳定格式选择对于矩阵对(A,B)且两者列满秩通常转化为广义特征问题A^T A x λ B^T B x 或 (A;B) 的 QR 分解。扰动分析表明当B接近奇异时第一种格式条件数恶化。提出条件数评估器Conds实时计算κ(A^T A)和κ(B^T B)的比值自动选择数值更稳定的格式。开发了鲁棒的GSVD求解器RobGSVD先进行平衡预处理再调用QR迭代。在病态矩阵对cond(B)1e8上RobGSVD得到的广义奇异值相对误差小于1e-12而传统方法误差可达1e-5。3免叉积的Jacobi-Davidson GSVD算法CPF-JDGSVD避免显式形成A^T A和B^T B利用紧致QR分解直接操作A和B。搜索子空间使用增广矩阵校正方程通过求解最小二乘问题实现。推导了该方法的收敛性证明残差单调递减。内迭代采用LSQR求解停止准则基于外迭代残差的指数衰减。在大型稀疏矩阵对n50000m200上CPF-JDGSVD计算前10个广义奇异值内存占用仅为叉积方法的15%且避免了数值平方引起的信息丢失。数值实验展示了对流扩散问题中GSVD用于正则化参数选取的有效性。import numpy as np from scipy.sparse.linalg import LinearOperator, cg, lsqr from scipy.linalg import qr class InexactJDSVD: def __init__(self, A, k6, tol1e-8): self.A A self.k k self.tol tol def solve(self): n self.A.shape[0] V np.random.randn(n, self.k) V, _ np.linalg.qr(V, modereduced) sigma np.zeros(self.k) for _ in range(100): W self.A V M V.T W s, U np.linalg.eigh(M) idx np.argsort(np.abs(s))[::-1] sigma s[idx[:self.k]] V_new V U[:, idx[:self.k]] # 残差计算 R W U[:, idx[:self.k]] - V_new * sigma res_norms np.linalg.norm(R, axis0) if np.max(res_norms) self.tol: break # 非精确校正 for j in range(self.k): if res_norms[j] self.tol: def matvec(x): return (self.A.T (self.A x)) - sigma[j]**2 * x op LinearOperator((n,n), matvecmatvec, dtypefloat) rhs -R[:,j] t, _ cg(op, rhs, tol0.1*res_norms[j], maxiter50) V_new[:,j] t V, _ np.linalg.qr(V_new, modereduced) return sigma, V def rob_gsvd(A, B): # 条件数评估 condA np.linalg.cond(A.T A) condB np.linalg.cond(B.T B) if condA condB: # 使用标准形式 M A.T A N B.T B vals, vecs np.linalg.eig(np.linalg.solve(N, M)) else: # 使用QR形式 Q, R qr(np.vstack([A, B]), modeeconomic) # 提取广义奇异值 vals np.linalg.svd(R[:A.shape[0], :])[1]**2 return np.sqrt(vals) class CPF_JDGSVD: def __init__(self, A, B, k5): self.A A self.B B self.k k self.Q None self.R None def _compact_qr(self): # 免叉积分解 C np.vstack([self.A, self.B]) self.Q, self.R qr(C, modeeconomic) return self.Q, self.R def solve(self): Q, R self._compact_qr() # 在缩减空间上求解GSVD U, s, Vt np.linalg.svd(R[:self.A.shape[0], :]) # 提取广义奇异值 gamma s[:self.k] return gamma # 测试代码 def demo_svd(): A np.random.randn(1000, 200) svd_solver InexactJDSVD(A, k3, tol1e-6) s, _ svd_solver.solve() print(Computed singular values:, s) ,