SOR迭代法
求解线性方程组 (MATLAB)
(数值分析作业自编)
代码如下:
*将代码分块,很容易理解。
左端是输出项,右端输入自定义项
function [R,k,x] = SOR(A,b,error,w)
% Gauss-Seidel迭代
% R为迭代矩阵B的谱半径;k为迭代步数;x为解向量
% A为系数矩阵;b为常数项;error为指定相邻两次迭代精度;w为松弛因子
%% w的输入控制
while (1)
if w>0 & w<=2
% 用谱半径判断收敛性 不满足敛散性退出程序并报错
B=(diag(diag(A))-w*tril(-A,-1))\((1-w)*diag(diag(A))+w*triu(-A,1));
R=max(sqrt(eig(B'*B)));
if R<1
break;
else
disp('错误,迭代不收敛');
disp('请尝试重新输入一个w:');
w=input('请输入w:');
end
else
disp('请尝试重新输入一个w∈(0,2}:');
w=input('再次输入w:');
end
end
%% 初始化
n=length(b);
x=zeros(n,1);x0=zeros(n,1);
k=0;
%% 循环
while (1)
%x0上一次迭代的解向量 算法主体
for i=1:n
% 为防止代码过长,用中间变量y(i)过渡
y(i)=b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n);
x(i)=(1-w)*x0(i)+w*(y(i))/A(i,i);
end
% 用相邻两次迭代解的无穷范数作为判敛原则
if norm(x-x0,Inf)<error
break;
end
x0=x;
k=k+1;
end
end
输入:
A=[5 2 1; -1 4 2; 2 -3 10];
b=[-12 20 3]';
w=-1;
error=1e-4;
调用
[R,k,x]=SOR(A,b,error,w)
运行
当ω∉(0,2],提示再次输入
>> test_SOR
请尝试重新输入一个w∈(0,2}:
再次输入w:
当ω过大时计算不稳定,迭代不收敛
错误,迭代不收敛
请尝试重新输入一个w:
请输入w:
调试w至适宜迭代,运行类似:
再次输入w:0.8
R =
0.4939
k =
9
x =
-4.0000
3.0000
2.0000
>>