数值分析MATLAB用SOR迭代法求解线性方程组

 

function SOORTest()

A = [3 -1 1
     3 6 2
     3 3 7];
B = [1;0;4];
w = [1];
r = SOR(A,B,w)
A*r-B


end

function r = SOR(A,B,w,varargin)
sizeA=size(A);
sizev=size(varargin);
if sizev(2) == 0
    rol = 0.000001;
    n = 1000;
    x = zeros(sizeA(1),1);
elseif sizev(2) == 1
    rol = varargin{1};
    n = 1000;
    x = zeros(sizeA(1),1);
elseif sizev(2) == 2
    rol = varargin{1};
    n = varargin{2};
    x = zeros(sizeA(1),1000);
elseif sizev(2) == 3
    rol = varargin{1};
    n = varargin{2};
    x = varargin{3};
else
    error("输入参数过多");
end
for i = 2:n
    for j = 1:sizeA(2)
        sum1=0;
        for k = 1:j
            if j == k
                sum1 = sum1 - w*(1-1/w)*x(k,i-1);
                continue;
            end
            sum1 = sum1 - w*x(k,i)*A(j,k)/A(j,j);
        end
        for k = j+1:sizeA(1)
            sum1 = sum1 - w*x(k,i-1)*A(j,k)/A(j,j);
        end
        x(j,i)=w*B(j)/A(j,j)+sum1;
    end
    if any(abs(x(:,i)-x(:,i-1))>rol) == 0
       break;
    end
end
r = x;
end

结果为:


r =

         0    0.3333    0.1111    0.0529    0.0396    0.0361    0.0354    0.0352    0.0351    0.0351    0.0351    0.0351
         0   -0.1667   -0.2222   -0.2328   -0.2360   -0.2366   -0.2368   -0.2368   -0.2368   -0.2368   -0.2368   -0.2368
         0    0.5000    0.6190    0.6485    0.6556    0.6573    0.6578    0.6579    0.6579    0.6579    0.6579    0.6579


ans =

   -1.0000    0.6667    0.1746    0.0401    0.0102    0.0024    0.0006    0.0001    0.0000    0.0000    0.0000    0.0000
         0    1.0000    0.2381    0.0590    0.0141    0.0035    0.0008    0.0002    0.0000    0.0000    0.0000    0.0000
   -4.0000         0    0.0000         0         0   -0.0000         0         0         0   -0.0000         0         0

经过11步迭代后,方程的误差接近于0,达到了容差范围,解收敛。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632