跳到主要内容

Jacobi 与 Gauss-Seidel 迭代

一、直观理解:用“猜—代入—更新”逼近线性方程组的解​

对大型系统,直接消去可能太慢或填充太多。迭代法从初值 x(0)x^{(0)} 出发,反复用方程把新近似“洗”得更准。

Jacobi 迭代用上一轮全部旧值更新每一分量;Gauss-Seidel(G-S)则在更新第 ii 个分量时立刻使用本轮已更新的分量,往往收敛更快。二者都像在对角占优系统上做有组织的逐坐标修正。

二、适用场景与优缺点​

类型说明
适用场景严格/强对角占优或对称正定等可保证收敛的系统;教学与原型;理解更现代迭代法的起点。
核心优点实现简单、内存友好;G-S 通常优于 Jacobi;易与稀疏存储结合。
局限与缺点不对角占优可能发散;收敛可能很慢;实际工程更常用 CG、GMRES 等,但经典迭代仍有教学与特定结构价值。

三、核心原理:分裂 A=D−E−FA=D-E-F​

写 A=D−L−UA=D-L-U(DD 对角,LL 严格下三角,UU 严格上三角,符号约定因教材而异)。

Jacobi:

x(k+1)=D−1(b−(A−D)x(k))x^{(k+1)}=D^{-1}(b-(A-D)x^{(k)})

分量形式:

xi(k+1)=1aii(bi−∑j≠iaijxj(k))x_i^{(k+1)}=\frac{1}{a_{ii}}\left(b_i-\sum_{j\ne i}a_{ij}x_j^{(k)}\right)

Gauss-Seidel:

xi(k+1)=1aii(bi−∑j<iaijxj(k+1)−∑j>iaijxj(k))x_i^{(k+1)}=\frac{1}{a_{ii}}\left(b_i-\sum_{j<i}a_{ij}x_j^{(k+1)}-\sum_{j>i}a_{ij}x_j^{(k)}\right)

收敛​

迭代 xk+1=Gxk+cx^{k+1}=Gx^k+c 收敛的充要条件是谱半径 ρ(G)<1\rho(G)<1。充分条件包括严格对角占优;对 SPD,G-S 收敛。

四、停止准则​

常用:

  • ∥xk+1−xk∥∞<ε\|x^{k+1}-x^k\|_\infty<\varepsilon;
  • 相对残差 ∥Axk−b∥/∥b∥<ε\|Ax^k-b\|/\|b\|<\varepsilon;
  • 达到最大迭代次数。

更推荐监控残差,避免“迭代不动但方程未满足”。

五、MATLAB 示例​

%% Jacobi 与 Gauss-Seidel 比较
A = [10 -1 2 0;
-1 11 -1 3;
2 -1 10 -1;
0 3 -1 8];
b = [6; 25; -11; 15];
xTrue = A \ b;

n = length(b);
tol = 1e-10;
maxIt = 100;

% Jacobi
xJ = zeros(n,1);
histJ = zeros(maxIt,1);
for k = 1:maxIt
xNew = zeros(n,1);
for i = 1:n
xNew(i) = (b(i) - A(i,[1:i-1,i+1:n])*xJ([1:i-1,i+1:n])) / A(i,i);
end
histJ(k) = norm(A*xNew - b);
if histJ(k) < tol, histJ = histJ(1:k); xJ = xNew; break; end
xJ = xNew;
end

% Gauss-Seidel
xG = zeros(n,1);
histG = zeros(maxIt,1);
for k = 1:maxIt
for i = 1:n
xG(i) = (b(i) - A(i,[1:i-1,i+1:n])*xG([1:i-1,i+1:n])) / A(i,i);
end
histG(k) = norm(A*xG - b);
if histG(k) < tol, histG = histG(1:k); break; end
end

fprintf("真解: "); disp(xTrue');
fprintf("Jacobi 迭代 %d 次, 解: ", numel(histJ)); disp(xJ');
fprintf("G-S 迭代 %d 次, 解: ", numel(histG)); disp(xG');

figure;
semilogy(histJ, "-o"); hold on; semilogy(histG, "-s");
xlabel("迭代次数"); ylabel("残差范数");
legend("Jacobi", "Gauss-Seidel");
title("迭代法残差下降"); grid on;

六、如何解释结果​

报告迭代法类型、初值、容差、迭代次数、最终残差与和直接法对比。若收敛缓慢,讨论对角占优性或改用更好的预条件/ Krylov 方法。

七、常见误区​

1. 对角元为零仍套公式​

必须能除以 aiia_{ii},必要时先重排方程。

2. 发散还硬迭代满 maxIt​

应检查 ρ(G)\rho(G) 或至少观察残差是否下降。

3. 用迭代增量代替残差作为唯一准则​

可能假收敛。

4. 以为迭代法总优于直接法​

小规模稠密问题直接法通常更好。

附:建模流程中的落地清单(迭代法)​

在竞赛或课程论文中,仅写出定义式往往不够。建议按下列顺序组织材料,既能保证可复现,也便于评委快速抓住贡献。

1. 问题对齐​

先用两三句话说明:题目中的哪个子问题对应本方法,输入是什么,输出要支持什么决策。避免“因为常见所以使用”。若存在更简单的替代方法,应说明为何不够用。

2. 符号与单位​

列出核心符号表,强调单位一致。许多错误并非算法失败,而是日/年、米/千米、概率/百分比混用。对无量纲参数,说明取值来源(估计、文献、情景设定)。

3. 关键公式回顾​

迭代形式 xk+1=Gxk+cx^{k+1}=Gx^k+c 的收敛由谱半径 ρ(G)<1\rho(G)<1 决定。对角占优是充分条件而非必要。

4. 计算与实现要点​

  • 固定随机种子(若涉及随机);
  • 记录中间量以便手算核对小例子;
  • 用极限情形或解析特例做冒烟测试;
  • 保存主要输入输出到表格,便于敏感性分析复用。

5. 补充 MATLAB 片段​

A=[4 1 0;1 4 1;0 1 4]; b=[1;2;3]; x=zeros(3,1);
for k=1:30, for i=1:3, x(i)=(b(i)-A(i,[1:i-1,i+1:3])*x([1:i-1,i+1:3]))/A(i,i); end, end
disp(x'); disp((A\b)');

6. 结果报告模板​

建议至少报告:迭代法类型、初值、容差、迭代次数、残差历史,以及与直接法对照。

7. 何时不该使用​

系统并不对角占优仍盲目迭代;或把“迭代增量很小”误当成方程已满足。

完成以上清单后,再进入“小结”中的一句话金句,通常论文的方法段与验证段就会扎实许多。

八、小结​

Jacobi 与 Gauss-Seidel 通过矩阵分裂迭代求解 Ax=bAx=b,在对角占优等条件下收敛,且 G-S 通常更快。它们是理解迭代思想的经典入口;实际大规模问题中,其思想延伸到松弛法与现代 Krylov 子空间方法。