概述
用MATLAB编程实现,形成m函数文件。输入A,b矩阵,与松弛因子
ω
\omega
ω,无返回值。设置精度要求
ε
=
1
0
−
4
\varepsilon=10^{-4}
ε=10−4。所得解向量向量直接显示在命令行窗口,同时绘制出解向量的收敛曲线。
判断迭代方法收敛性时计算高斯塞德尔迭代矩阵谱半径以判断。
代码与运行结果
function [] = sor(A,b,w)
%基于高斯塞德尔的超松弛迭代求解向量
G=-(tril(A))\triu(A,1);
R=max(abs(eig(G)));
if(R>=1)
disp('SOR is not work');
else
disp('SOR is going well');
disp('x vector:')
l=length(b);
x=zeros(size(b));
xs=0;
xe=0;
for k=1:100
for i=1:l
for j=1:i-1
xs=xs+A(i,j)*x(j,k+1);
end
for j=i:l
xe=xe+A(i,j)*x(j,k);
end
x(i,k+1)=x(i,k)+(w/A(i,i))*(b(i)-xs-xe);
xs=0;
xe=0;
end
if(max(abs(x(:,k+1)-x(:,k)))<10^-4)
break;
end
end
disp(x(:,k+1));
e=1:k+1;
plot(e,x,'- o');
xlabel('generations');
ylabel('vector x');
end
end
令:
A
=
[
5
1
−
1
−
2
2
8
1
3
1
−
2
−
4
−
1
−
1
3
2
7
]
b
=
[
−
2
−
6
6
12
]
A=\begin{bmatrix} 5&1&-1&-2\\2&8&1&3\\1&-2&-4&-1\\-1&3&2&7\end{bmatrix} b=\begin{bmatrix} -2\\-6\\6\\12\end{bmatrix}\\
A=⎣⎢⎢⎡521−118−23−11−42−23−17⎦⎥⎥⎤b=⎣⎢⎢⎡−2−6612⎦⎥⎥⎤
ω
=
1.15
\omega=1.15
ω=1.15
A=[5 1 -1 -2;2 8 1 3;1 -2 -4 -1;-1 3 2 7];
b=[-2;-6;6;12];
sor(A,b,1.15);
SOR is going well
x vector:
1.0000
-2.0000
-1.0000
3.0000
与雅可比、高斯塞德尔方法比较
A
=
[
5
1
−
1
−
2
2
8
1
3
1
−
2
−
4
−
1
−
1
3
2
7
]
b
=
[
−
2
−
6
6
12
]
A=\begin{bmatrix} 5&1&-1&-2\\2&8&1&3\\1&-2&-4&-1\\-1&3&2&7\end{bmatrix} b=\begin{bmatrix} -2\\-6\\6\\12\end{bmatrix}\\
A=⎣⎢⎢⎡521−118−23−11−42−23−17⎦⎥⎥⎤b=⎣⎢⎢⎡−2−6612⎦⎥⎥⎤
ω
=
1.15
\omega=1.15
ω=1.15
雅可比方法
高斯塞德尔方法
相较之下,SOR方法迭代次数缩短,求解时间减少。但需要选择恰当的松弛因子 ω \omega ω 。