参数设置
重置
A 是 2×2 对称正定矩阵(非对角 A[0][1]=A[1][0]=1、b[1]=−1 固定)。CG 沿共役(A-正交)方向在椭圆等高线上前进,最多 n=2 次迭代到达中心(精确解)。拖动滑块改变 A 的对角元素,等高线形状与收敛随之变化。
A =
b =
2D 等高线上的共役梯度迭代
椭圆=f 的等高线/蓝=CG(最多 n=2 次迭代到达中心的精确解)/红=最速下降法(之字形)/白点=当前迭代点
理论与主要公式
CG 法通过在 A-直交(共役)条件下保持残差 $r_k = b - A x_k$ 和搜索方向 $p_k$,迭代求解对称正定线性方程。
初始化: $r_0 = b - A x_0$, $p_0 = r_0$。迭代步骤:
$$\alpha_k = \frac{r_k^\top r_k}{p_k^\top A p_k}, \quad x_{k+1} = x_k + \alpha_k p_k$$
$$r_{k+1} = r_k - \alpha_k A p_k, \quad \beta_k = \frac{r_{k+1}^\top r_{k+1}}{r_k^\top r_k}$$
$$p_{k+1} = r_{k+1} + \beta_k p_k$$
在理想算术下,n 维对称正定系统最多 n 次迭代即可得到精确解。误差收敛率由条件数 $\kappa = \lambda_\max/\lambda_\min$ 决定,满足 $\left(\frac{\sqrt{\kappa}-1}{\sqrt{\kappa}+1}\right)^k$ 的界。
共役梯度法模拟器简介
🙋
我在看 FEM 参考书的时候,总是看到用 CG 法求解刚度方程 Kd=f,CG 法是什么呀?
🎓
简单说,就是对对称正定矩阵 A 求解 Ax=b 的"迭代"方法。每一步都用过去步骤与 A-直交(共役)的搜索方向 $p_k$,沿着最优步长 $\alpha_k$ 前进。在模拟器中,把"迭代次数"从 1 拉到 10,你会看到蓝色曲线急剧下降——残差范数在对数标度下呈现阶跃式下降。
🎓
那是最速下降法,一种"傻"的方法——每次只看当前残差方向,就往那个方向走。CG 和最速下降法直接对比,差别一目了然。如果你把 A[0][0] 设成 10,A[1][1] 设成 1(制造大条件数),最速下降法在细长的谷里会呈之字形振荡,都下不来。而 CG 有个性质叫"不在同一方向重复搜索",4 维问题只需 4 次迭代就精确到达。
🙋
真的呀!我看第 4 次迭代的时候,蓝色点突然掉下来了,残差变成 1e-15 这样。这是巧合吗?
🎓
不是巧合,这是理论。n 维的对称正定系统,CG 在理想算术下最多 n 次迭代就到精确解——因为 Krylov 子空间 $\mathrm{span}\{r_0, Ar_0, A^2r_0, \ldots\}$ 到了 n 维,里面必然包含真解。实际用浮点数时,舍入误差会破坏共役性,迭代数会略增,但仍比最速下降法快得多。
🙋
那个"条件数 cond(A)"卡片显示 11 左右,这是什么数字?
🎓
条件数是 $\kappa = \lambda_\max / \lambda_\min$,最大特征值和最小特征值的比。这个数大了,等高线就变成细长的谷,最速下降法会呈之字形。CG 的误差收敛率被 $\left(\frac{\sqrt\kappa - 1}{\sqrt\kappa + 1}\right)^k$ 这个界限制——平方根很关键,条件数 100 的问题,CG 比最速下降法快差不多 10 倍。实际工程中我们用"前处理共役梯度法(PCG)"来人工把条件数降下来,再加速。
常见问答
CG 法能用的条件是什么?
矩阵 A 必须是对称的(A^T = A)且正定的(任意非零向量 x 满足 x^T A x > 0)。实际中 FEM 的刚度矩阵、拉普拉斯算子、协方差矩阵等很多问题自然就是对称正定。非对称系统用 Bi-CGSTAB 或 GMRES,对称不定的系统用 MINRES 等 CG 的变体。
直接法(LU、Cholesky)比较有什么好处?
CG 法只需要做矩阵-向量乘法,能保持稀疏矩阵的结构。直接法分解后会产生"填充(fill-in)",内存爆炸,百万量级自由度的 FEM 里直接不现实;而 PCG(前处理共役梯度法)是标准做法。但如果需要对同一个 A 解多个不同的 b,LU 的可复用性更强。
前处理子 M 怎么选?
M 要"接近 A 又便宜计算"。Jacobi(对角缩放)最便宜但效果有限,不完全 Cholesky 分解(IC(0)、ICT)在结构力学中广泛,复杂物理用代数多重网格(AMG)能让条件数无关收敛。Trilinos、PETSc 等库里有很多预制前处理子。
收敛判定标准选什么?
最常见是相对残差 ‖r_k‖_2 / ‖b‖_2 < tol,tol 取 1e-6~1e-10。但条件数很大时,残差小了真的误差 ‖x_k - x_*‖ 还是大,所以要配合 A-范数误差估计或有效数字判断。最多迭代次数(如 2n 或 500~2000)也要设,收敛失败时考虑换前处理子。
实际应用
有限元法(FEM)结构分析: 汽车、飞机、建筑的应力分析要解大规模刚度方程 Kd=f,K 对称正定且稀疏,数百万自由度很常见。前处理共役梯度法(IC-PCG、AMG-PCG)是商业软件(Abaqus、Ansys、Nastran)和开源(FreeFEM、FEniCS)的标准求解器。
偏微分方程离散化: 热传导、Poisson 方程、椭圆型 PDE 用有限差分或有限体积离散后产生对称正定系统。多重网格+CG 的组合在地球流体、气象模拟中实现条件数无关的 O(n) 伸缩性。
机器学习与优化: 二次型最小化 min (1/2)x^T A x - b^T x 等价于求解 Ax=b,CG 本质上是优化算法。神经网络的"无 Hessian 优化"用 CG 的无矩阵形式来解 Hessian 方程,深度学习和强化学习中有应用。
影像处理、层析: CT 重构、图像复原需解法方程 (A^T A) x = A^T b。A^T A 对称正定(或正则化后),所以 CGLS、LSQR 等 CG 系列方法是高效低内存的标准手段。
常见误解与注意事项
最常见的误解:无条件相信"CG 法 n 次迭代必然精确到达"。这是理想算术 的结果;浮点运算中舍入误差逐渐破坏共役性 $p_i^\top A p_j = 0$,n 次后仍有残差。实际做法是"相对残差 < 容差"才停,需要时用"重启"或"再正交化"。模拟器的 4 维小问题几乎看不到舍入效应,但数百万维的真实问题里条件数一大,表现会完全不同。
第二常见的误解:条件数大就放弃 CG。实际上前处理子 M 的选择能巨大改变 情况——不完全 Cholesky、对称 Gauss-Seidel、AMG 等能把实效条件数降到 $\sqrt{\kappa}$ 或 $O(1)$。"CG 慢"往往是"前处理子没选好"。模拟器里把 A[0][0]=10、A[1][1]=1 拉开条件数,CG 比最速下降法快很多,但如果加个简单前处理 CG 再快 1-2 迭代。
第三个坑:非对称或不定系统上用 CG。CG 设计时假设 A 对称正定,用在非对称(如含对流项的流体系统)或不定矩阵上,$p_k^\top A p_k$ 会变负、分母为零导致发散。非对称用 Bi-CGSTAB、GMRES、IDR(s);对称不定用 MINRES、SYMMLQ。CG 是"对 SPD 最优化的解法"这个认识很重要。
具体计算例子
当 A=[4.0, 0; 0, 1.0]、b=[2.0; 1.0] 时,条件数 cond(A)=4.0。最速下降法 8 次迭代降到 ‖r‖_2=1.2e-3,而 CG 法 2 次迭代就到机器精度 ‖r‖_2=2.1e-16。2×2 系统理论上 CG k≤n=2 即得精确解。对大型 FEM 刚度矩阵(n=1000、cond≈100),CG 比最速下降法快约 10 倍。