SSOR迭代法
求解线性方程组 (MATLAB)
(数值分析作业自编)
代码如下:
*将代码分块,很容易理解。
左端是输出项,右端输入自定义项
function [R,k,x] = SSOR(A,b,error,w)
% SSOR迭代
% R为迭代矩阵B的谱半径;k为迭代步数;x为解向量
% A为系数矩阵;b为常数项;error为指定相邻两次迭代精度;w为松弛因子
%% w的输入控制
while (1)
if w>0 & w<=2
% 用谱半径判断收敛性 不满足敛散性退出程序并报错
B1=(diag(diag(A))-w*tril(-A,-1))\((1-w)*diag(diag(A))+w*triu(-A,1));
B2=(diag(diag(A))-w*triu(-A,1))\((1-w)*diag(diag(A))+w*tril(-A,-1));
R=max(sqrt(eig((B2*B1)'*(B2*B1))));
if R<1
break;
else
disp('错误,R>1迭代不收敛');
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);x1=zeros(n,1);
k=0;
%% 循环
while (1)
%x0上一次迭代的解向量 算法主体
x0=x;
for i=1:n
x1(i)=(1-w)*x0(i)+w*(b(i)-A(i,1:i-1)*x1(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i);
end
for i=n:-1:1
x(i)=(1-w)*x1(i)+w*(b(i)-A(i,1:i-1)*x1(1:i-1)-A(i,i+1:n)*x(i+1:n))/A(i,i);
end
% 用相邻两次迭代解的无穷范数作为判敛原则
if norm(x-x0,Inf)<error
break;
end
k=k+1;
end
end
输入:
A=[5 2 1; -1 4 2; 2 -3 10];
b=[-12 20 3]';
w=0.8;
error=1e-4;
调用
[R,k,x]=SSOR(A,b,error,w)
运行
>> test_SSOR
R =
0.1553
k =
6
x =
-4.0000
3.0000
2.0000
>>