Scilab中Gauss-Seidel迭代:设置容差0.0001的收敛准则
给Gauss-Seidel迭代添加容差收敛准则的实现方案
要让你的迭代在近似值变化满足0.0001容差时自动终止,你需要在Iter=Iter+1之前加入迭代值差值的判断逻辑,同时修复原代码里未定义的m变量问题,让代码更健壮。具体实现如下:
核心思路
每次迭代更新完x后,先和上一次的迭代值x_prev计算差值的无穷范数(这是数值迭代中最常用的收敛判断指标,能反映每个未知量的最大变化幅度),如果这个差值小于等于设定的容差0.0001,或者迭代次数达到最大值MaxIter,就终止循环。
修改后的完整可运行代码
A = [4 1;4 6 ]; b = [6;-8]; x = zeros(2,1); MaxIter = 100; Iter = 0; P = 0; tol = 0.0001; // 定义收敛容差 m = size(A, 1); // 动态获取未知量个数,修复原代码m未定义的问题 x_prev = x; // 初始化上一次迭代的近似值 while (P == 0) for i = 1:m s = 0; for j = 1:m if i ~= j then s = s + A(i,j)*x(j); end end x(i) = (b(i)-s)/A(i,i); end // ------------ 新增的收敛判断(放在Iter=Iter+1之前)------------ // 计算新旧近似值的无穷范数差值 diff = norm(x - x_prev, "inf"); Iter = Iter + 1; // 判断终止条件:满足容差 或 达到最大迭代次数 if diff <= tol || Iter >= MaxIter then P = 1; end // ----------------------------------------------------------- x_prev = x; // 更新上一次迭代值,为下一轮判断做准备 printf("\n\n\t%d",Iter); printf("\t %f",x); end mprintf ("\n\nThe approximate solutions are: %.3f",x);
关键细节说明
- 无穷范数的作用:
norm(x - x_prev, "inf")会计算两个向量对应分量差值的绝对值的最大值,确保每个未知量的变化都小于容差,比平方和范数更贴合工程上的收敛要求。 - 双重终止条件:同时判断容差和最大迭代次数,既保证计算精度,又能避免迭代不收敛时程序陷入死循环。
- 修复
m变量问题:原代码中m未定义,用size(A,1)动态获取矩阵的行数(也就是未知量的个数),让代码可以适配不同维度的线性方程组。
内容的提问来源于stack exchange,提问作者Aptx Awit sayo
相关产品推荐
相关产品推荐

