通俗易懂讲透共轭梯度法(CG)
通俗易懂讲透共轭梯度法CG本科生/研究生都能看懂本文用大白话图形比喻公式拆解可运行代码把共轭梯度法从原理、流程、优缺点到适用场景讲得明明白白适合数值优化、机器学习、科学计算复习。一、先搞懂我们为什么需要共轭梯度法普通梯度下降有个致命问题遇到“扁长碗”形状的函数会走成“之字形”来回震荡、收敛极慢。比如最速下降每一步只看当前最陡方向结果左右横跳几百步都走不到谷底于是就有了共轭梯度法CG每一步走的方向都和之前的方向“互不干扰、不打架”走一步就清干净一维误差。一句话总结共轭梯度法 不回头、不震荡、最快走出扁长山谷的优化算法。二、共轭梯度法是什么超形象比喻把优化看作在一个狭长山谷里找最低点最速下降像醉汉左右撞墙反复横跳共轭梯度法像沿着“互不干扰的通道”走每一步都把一个方向走到最优绝不走回头路核心逻辑方向之间满足 A-共轭A-正交→ 新方向不会破坏之前的优化结果。三、什么是“共轭”最简单解释两个方向 p 和 q如果满足pTAq0p^T A q 0pTAq0就说它们是A-共轭。直观理解普通正交方向垂直互不影响A-共轭在当前曲面A下垂直优化互不干扰四、共轭梯度法核心思想3句话每次选一个与之前所有方向共轭的新方向在这个方向上一步走到最优理论上n 维问题最多 n 步一定收敛五、CG 算法完整流程6步背会初始化x0x_0x0残差r0b−Ax0r_0 b - A x_0r0b−Ax0方向p0r0p_0 r_0p0r0计算步长αkrkTrkpkTApk\alpha_k \frac{r_k^T r_k}{p_k^T A p_k}αkpkTApkrkTrk更新位置xk1xkαkpkx_{k1} x_k \alpha_k p_kxk1xkαkpk更新残差rk1rk−αkApkr_{k1} r_k - \alpha_k A p_krk1rk−αkApk计算共轭系数βkrk1Trk1rkTrk\beta_k \frac{r_{k1}^T r_{k1}}{r_k^T r_k}βkrkTrkrk1Trk1更新方向pk1rk1βkpkp_{k1} r_{k1} \beta_k p_kpk1rk1βkpk六、为什么 CG 比最速下降快得多无折返方向共轭互不干扰有限步收敛n 维最多 n 步精确解只存 3~4 个向量内存极低只需要矩阵乘向量适合稀疏大规模问题七、代码实战共轭梯度法求解稀疏线性系统直接复制可运行包含标准 CG预条件 CGJacobi收敛曲线对比importnumpyasnpimportscipy.sparseasspimportmatplotlib.pyplotasplt# 1. 生成二维泊松稀疏矩阵 A defgenerate_poisson_2d(n):Nn*n diag4*np.ones(N)off1-np.ones(N-1)offn-np.ones(N-n)Asp.diags([diag,off1,off1,offn,offn],[0,-1,1,-n,n],shape(N,N),formatcsr)foriinrange(1,n):A[i*n,i*n-1]0returnA# 2. 共轭梯度法 CG defconjugate_gradient(A,b,tol1e-6,maxiter1000,M_invNone):nlen(b)xnp.zeros(n)rb-A.dot(x)zrifM_invisNoneelseM_inv(r)pz.copy()res[np.linalg.norm(r)]forkinrange(maxiter):ApA.dot(p)alpha(r z)/(p Ap)xalpha*p r_nextr-alpha*Ap res.append(np.linalg.norm(r_next))ifres[-1]tol:breakz_nextr_nextifM_invisNoneelseM_inv(r_next)beta(r_next z_next)/(r z)pz_nextbeta*p r,zr_next,z_nextreturnx,res# 3. 测试问题 n50Agenerate_poisson_2d(n)Nn*n bnp.ones(N)# Jacobi 预条件diag_AA.diagonal()M_invlambdar:r/diag_A# 4. 运行 CG PCG x_cg,res_cgconjugate_gradient(A,b,maxiter500)x_pcg,res_pcgconjugate_gradient(A,b,maxiter500,M_invM_inv)# 5. 收敛曲线 plt.figure(figsize(10,5))plt.semilogy(res_cg,r-,linewidth2,labelCG)plt.semilogy(res_pcg,b-,linewidth2,labelPCG (Jacobi))plt.title(CG vs PCG 收敛对比)plt.xlabel(迭代次数)plt.ylabel(残差对数)plt.grid(True,linestyle--)plt.legend()plt.show()八、共轭梯度法优点收敛极快远离“之字形”震荡内存极小只存几个向量稀疏矩阵友好只需要矩阵-向量乘法理论完美n 维最多 n 步精确收敛可预条件加速PCG 是大规模科学计算标配九、CG 缺点必须知道只适用于对称正定矩阵 A对条件数敏感病态问题收敛变慢需要合适预条件复杂问题需要设计预条件器数值误差累积长时间迭代可能需要重启十、适用场景直接照抄✅必须用 CG/PCG有限元 / 有限差分 PDE 求解大规模稀疏对称正定线性方程组内存有限、无法做矩阵分解需要快速迭代求解❌不适合非对称、不定矩阵小规模稠密矩阵无法提供 A×v 操作的问题十一、一句话总结共轭梯度法是求解大规模稀疏对称正定线性系统的最强迭代算法它用共轭方向彻底解决震荡问题是科学计算、数值优化的核心工具。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2506644.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!