数值分析实验报告Sor法分析
数值分析实验报告
实验目的
会使用Sor法求解一个线性方程组
熟悉matlab语言并结合原理编程求方程组
改变的值观察实验结果
会分析实验结果
二、实验题目
编制Sor迭代格式程序进行求解一个线性方程组的迭代计算情况,运行中要选用不同的松弛因子进行尝试
实验原理
Jacobi迭代和seidel迭代对具体的线性方程组来说,逼近的速度是固定不变的,遇到收敛很慢的情况时就显得很不实用。
Sor法是一seidel迭代为基础,并在迭代中引入参数以增加迭代选择的灵活性,具体为:
用seidel迭代算出的再用参数乘之再加上,由seidel迭代的公式可以得到Sor法的迭代格式为
式中称为松弛因子。
实验内容
用matlab编程得到Sor法求线性方程组的算法为:
function [x,n]=SOR(A,b,x0,w,eps,M)
if nargin==4
eps= 1.0e-4;
M = 200;
elseif nargin<4
error
return
elseif nargin ==5
M = 200;
end
if(w<=0 || w>=2)
error;
return;
end
D=diag(diag(A)); %求A的对角矩阵
L=-tril(A,-1); %求A的下三角阵
U=-triu(A,1); %求A的上三角阵
B=inv(D-L*w)*((1-w)*D+w*U);
f=w*inv((D-L*w))*b;
x=B*x0+f;
n=1; %迭代次数
while norm(x-x0)>=eps
x0=x;
x =B*x0+f;
n=n+1;
if(n>=M)
disp('Warning: 迭代次数太多,可能不收敛!');
return;
end
end
>> A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5];
b=[1;2;10;-1];
x0=[0;0;0;0];
w=1;
eps=1e-4;
M=100;
>> [x,n]=SOR(A,b,x0,w,eps,M)
x =
0.0687
0.1645
0.2352
-0.1667
n =
5
error;
>> A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5];
b=[1;2;10;-1];
x0=[0;0;0;0];
w=1.5;
eps=1e-4;
M=100;
[x,n]=SOR(A,b,x0,w,eps,M)
x =
0.0687
0.1645
0.2352
-0.1667
n =
21
>>A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5];
b=[1;2;10;-1];
x0=[0;0;0;0];
w=2.5;
eps=1e-4;
M=100;
[x,n]=SOR(A,b,x0,w,eps,M)
??? Error using ==> error
Not enough input arguments.
Error in ==> SOR at 13
用实验3中的线性方程组作为例子比较得
当=1.5时,x =0.0687 0.1645 0.2352 -0.1667 迭代次数为n=21
当=1时,x =0.0687 0.1645 0.2352 -0.1667 迭代次数为n=5
当=2.5时,出现error
五、实验分析
由定理,Sor法收敛的必要条件是0<<2,因此,当=1.5和1时,算法收敛,能够求出根,并且迭代次数根据的不同而不同,在求方程组的根时,只要选择恰当的,收敛是很快的。而当>2 时,算法不收敛,因此程序出现错误,不能求出根。
当=1时,根据Sor法的构造方法知,此时的Sor法就是seidel法