Jacobi 与 Gauss-Seidel 迭代
一、直观理解:用“猜—代入—更新”逼近线性方程组的解
对大型系统,直接消去可能太慢或填充太多。迭代法从初值 出发,反复用方程把新近似“洗”得更准。
Jacobi 迭代用上一轮全部旧值更新每一分量;Gauss-Seidel(G-S)则在更新第 个分量时立刻使用本轮已更新的分量,往往收敛更快。二者都像在对角占优系统上做有组织的逐坐标修正。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 严格/强对角占优或对称正定等可保证收敛的系统;教学与原型;理解更现代迭代法的起点。 |
| 核心优点 | 实现简单、内存友好;G-S 通常优于 Jacobi;易与稀疏存储结合。 |
| 局限与缺点 | 不对角占优可能发散;收敛可能很慢;实际工程更常用 CG、GMRES 等,但经典迭代仍有教学与特定结构价值。 |
三、核心原理:分裂
写 ( 对角, 严格下三角, 严格上三角,符号约定因教材而异)。
Jacobi:
分量形式:
Gauss-Seidel:
收敛
迭代 收敛的充要条件是谱半径 。充分条件包括严格对角占优;对 SPD,G-S 收敛。
四、停止准则
常用:
- ;
- 相对残差 ;
- 达到最大迭代次数。
更推荐监控残差,避免“迭代不动但方程未满足”。
五、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. 对角元为零仍套公式
必须能除以 ,必要时先重排方程。
2. 发散还硬迭代满 maxIt
应检查 或至少观察残差是否下降。
3. 用迭代增量代替残差作为唯一准则
可能假收敛。
4. 以为迭代法总优于直接法
小规模稠密问题直接法通常更好。
附:建模流程中的落地清单(迭代法)
在竞赛或课程论文中,仅写出定义式往往不够。建议按下列顺序组织材料,既能保证可复现,也便于评委快速抓住贡献。
1. 问题对齐
先用两三句话说明:题目中的哪个子问题对应本方法,输入是什么,输出要支持什么决策。避免“因为常见所以使用”。若存在更简单的替代方法,应说明为何不够用。
2. 符号与单位
列出核心符号表,强调单位一致。许多错误并非算法失败,而是日/年、米/千米、概率/百分比混用。对无量纲参数,说明取值来源(估计、文献、情景设定)。
3. 关键公式回顾
迭代形式 的收敛由谱半径 决定。对角占优是充分条件而非必要。
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 通过矩阵分裂迭代求解 ,在对角占优等条件下收敛,且 G-S 通常更快。它们是理解迭代思想的经典入口;实际大规模问题中,其思想延伸到松弛法与现代 Krylov 子空间方法。