Scilab 中的高斯赛德尔收敛

问题描述 投票:0回答:2
A=[4 1;4 6 ]
b=[6:-8]
x=zeros(2,1]
MaxIter=100
Iter=0
P=0
while (P==0)
for i=1:1m
 s=0
  for j=1: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
printf("\n\n\t%d",Iter")
printf("\t    %f",x)
end
mprintf ("\n\nThe approximate solutions are: %.3f",x)

如果我将最新的近似值减去先前的近似值,我应该在 Iter+Iter+1 之前添加什么收敛标准,以在容差误差 0.0001 处停止 while 循环

scilab
2个回答
0
投票

最常用的标准衡量连续迭代之间差异的范数,因此,您可以在 while 循环开始时保存先前的 x 并在计算新的 x 后更新它:

A=[4 1;4 6]
b=[6;-8]
m=2;
x=zeros(m,1)
MaxIter=100
for Iter = 0:MaxIter
    prev_x = x;
    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 
    mprintf("\n\n\t%d",Iter)
    mprintf("\t    %f",x)
    if norm(x-prev_x) < 0.0001
        break
    end
    prev_x = x;
end
mprintf ("\n\nThe approximate solutions are:");
mprintf("\t    %f",x)

0
投票

0 1.500000 -2.333333 1 2.083333 -2.722222 2 2.180556 -2.787037 3 2.196759 -2.797840 4 2.199460 -2.799640 5 2.199910 -2.799940 6 2.199985 -2.799990 近似解为:2.199985 -2.799990

© www.soinside.com 2019 - 2024. All rights reserved.