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