You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

关键细节说明

  1. 无穷范数的作用:norm(x - x_prev, "inf")会计算两个向量对应分量差值的绝对值的最大值,确保每个未知量的变化都小于容差,比平方和范数更贴合工程上的收敛要求。
  2. 双重终止条件:同时判断容差和最大迭代次数,既保证计算精度,又能避免迭代不收敛时程序陷入死循环。
  3. 修复m变量问题:原代码中m未定义,用size(A,1)动态获取矩阵的行数(也就是未知量的个数),让代码可以适配不同维度的线性方程组。

内容的提问来源于stack exchange,提问作者Aptx Awit sayo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:22:36