计算方法实验报告.docx
《计算方法实验报告.docx》由会员分享,可在线阅读,更多相关《计算方法实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
![计算方法实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/1/cbb7bb5d-29bb-4bd7-bcd0-26d13650fc4e/cbb7bb5d-29bb-4bd7-bcd0-26d13650fc4e1.gif)
计算方法实验报告
数学软件实验任务书
课程名称
数学软件实验
班级
学号
实验课题
线性方程组的J-迭代,GS-迭代,SOR-迭代,SSOR-迭代方法
实验目的
熟悉线性方程组的J-迭代,GS-迭代,SOR-迭代,SSOR-迭代方法
实验要求
运用Matlab/C/C++/Java/Maple/Mathematica等其中一种语言完成
实验内容
线性方程组的J-迭代
线性方程组的GS-迭代
线性方程组的SOR-迭代
线性方程组的SSOR-迭代方法
成绩
教师
实验1Jacobi迭代
一实验原理
系数矩阵A的主对角元不全为0,如果A作以下分解:
A=D-L-U;其中D为A的住对角线元素构成的矩阵,L为下三角矩阵,U为上三角矩阵,得到了Jacibi迭代法,它的迭代公式为:
二数据来源
用Jacobi迭代求解下列方程组
三实验步骤
步骤一:
编写Jacobi迭代法的函数。
在打开Editor编辑器,输入以下语句:
functionJacobi
clc
clearall
max1=1000;%迭代次数
tol=10e-5;%设置迭代精度
A=[4-11;4-81;-215];
b=[7-2115]';
x0=[000]';
%计算D,L,U
n=length(A);
D=zeros(n);
L=zeros(n);
U=zeros(n);
fori=1:
n
forj=1:
n
ifi==j
D(i,j)=A(i,j);
elseifi>j
L(i,j)=-A(i,j);
else
U(i,j)=-A(i,j);
end
end
end
D;
L;
U;
Bj=inv(D)*(L+U);
f=inv(D)*b;
x=Bj*x0+f;
k=1;%迭代次数
whilenorm(x-x0)>=tol
x0=x;
x=Bj*x0+f;
k=k+1;
if(k>=max1)
disp('Warning:
迭代次数到多,可能不收敛!
');
return;
end
end
x
以文件Jacobi保持
4计算结果
运行程序可以得到运算结果
x=
2.0000
4.0000
3.0000
x是线性方程组的解
k=
11
k为迭代次数。
实验2Gauss-Seidel迭代
1实验原理
系数矩阵A的主对角元不全为0,如果A作以下分解:
A=D-L-U
其中D的意义同雅可比迭代法,L为下三角矩阵,U为上三角矩阵,得到了Gauss-Seidel迭代法,它的迭代公式为:
2数据来源
用Gauss-Seidel迭代求解下列方程组
3实验步骤
步骤一:
编写GS迭代法的函数。
在打开Editor编辑器,输入以下语句:
functiongauseidel
clc
clearall
max1=1000;%迭代次数
tol=10e-5;%近似精度
A=[4-11;4-81;-215];
b=[7-2115]';
x0=[000]';
n=length(A);
D=zeros(n);
L=zeros(n);
U=zeros(n);
%求D,L,U
fori=1:
n
forj=1:
n
ifi==j
D(i,j)=A(i,j);
elseifi>j
L(i,j)=-A(i,j);
else
U(i,j)=-A(i,j);
end
end
end
D;
L;
U;
%求G,f
G=(D-L)\U;
f=(D-L)\b;
x=G*x0+f;
k=1;
%迭代格式
whilenorm(x-x0)>=tol
x0=x;
x=G*x0+f;
k=k+1;
if(k>=max1)
disp('迭代次数过多,可能不收敛');
return;
end
end
x
文件保存名为gauseidel
4计算结果
运行程序得到运算结果:
x=
2.0000
4.0000
3.0000
x是线性方程组的解
k=
7
k为迭代次数。
实验3SOR迭代
1实验原理
对A作一些分解:
,Q,L,U的意义与Gauss-Seidel迭代法相同。
是一个事先选好的常数,称为松弛因子,当
时叫超松弛法,也叫SOR迭代法。
其迭代公式为:
2数据来源
用SOR迭代求解下列方程组
3实验步骤
步骤一:
编写SOR迭代法的函数。
在打开Editor编辑器,输入以下语句:
functionSOR
clc
clearall
max1=1000;%迭代次数
tol=10e-5;%设置迭代近似精度
A=[4-11;4-81;-215];
b=[7-2115]';
x0=[000]';
n=length(A);
D=zeros(n);
L=zeros(n);
U=zeros(n);
%求L,U
fori=1:
n
forj=1:
n
ifi==j
D(i,j)=A(i,j);
elseifi>j
L(i,j)=-A(i,j);
else
U(i,j)=-A(i,j);
end
end
end
D;
L;
U;
w=1.5;%设置松弛系数
%迭代格式
B=inv(D-L*w)*((1-w)*D+w*U);
f=w*inv((D-L*w))*b;
x=B*x0+f;
k=1;%迭代次数
whilenorm(x-x0)>=tol
x0=x;
x=B*x0+f;
k=k+1;
if(k>=max1)
disp('迭代次数过多可能不收敛');
return;
end
end
x
文件保存为SOR
4计算结果
x=
2.0000
4.0000
3.0000
x是线性方程组的解
k=
18
k为迭代次数。
实验四SSOR-迭代方法
1实验原理
超松弛迭代还有一种改进形式,叫做对称逐次超松弛迭代(SSOR),它采用的是两步迭代公式:
2数据来源
用SSOR迭代求解下列方程组
3实验步骤
步骤一:
编写SOR迭代法的函数。
在打开Editor编辑器,输入以下语句:
functionSSOR
clc
clearall
max1=1000;%迭代次数
eps=10e-5;%近似精度
A=[4-11;4-81;-215];
b=[7-2115]';
x0=[000]';
n=length(A);
D=zeros(n);
L=zeros(n);
U=zeros(n);
%计算D,L,U
fori=1:
n
forj=1:
n
ifi==j
D(i,j)=A(i,j);
elseifi>j
L(i,j)=-A(i,j);
else
U(i,j)=-A(i,j);
end
end
end
D;
L;
U;
w=1.5;%松弛因子
%迭代格式
B1=inv(D-L*w)*((1-w)*D+w*U);
B2=inv(D-U*w)*((1-w)*D+w*L);
f1=w*inv((D-L*w))*b;
f2=w*inv((D-U*w))*b;
x=x0
k=0;%迭代次数
tol=1
whiletol>=eps;
x1=B1*x0+f1;
x=B2*x1+f2;
k=k+1;
tol=norm(x-x0);
x0=x;
if(k>=max1)
disp('迭代次数太多,SOR方法可能不收敛');
return;
end
end
x
k
文件保存为SSOR
4计算结果
x=
2.0000
4.0000
3.0000
k=
11
实验结论
以上用3种迭代方法对同一个线性方程组在相同精度要求下分别进行了求解,从计算方法及最后的结果我们可以得到:
高斯—赛的尔迭代比雅可比迭代在相同精度要求下收敛的快,即高斯—赛的尔迭代所需要迭代的次数较少(雅可比迭代,k=11;高斯—赛的尔迭代,k=7),高斯—赛的尔迭代相当于是雅可比迭代的改进。
SOR迭代,从算法的设计来看它是对高斯—赛的尔迭代的改进,使得计算结果的误差降低,SSOR迭代是SOR迭代与高斯—赛的尔迭代的综合,是SOR的改进使得计算误差更小,但是SOR和SSOR引入了松弛因子
松弛因子的取值可能会使迭代速度加快也有可能使迭代速度减慢。
所以SOR、SSOR迭代虽然计算结果误差降低但是如果
松弛因子取值不合适会使迭代速度慢。
如在本实验中SOR迭代k=18(即迭代了18次),SSOR迭代,k=11(即迭代了11次),这超过了高斯—赛德尔迭代和雅可比迭代。
因此每种算法都有各自的优缺点,在实际应用中我们应根据实际要求选择合适的迭代方法。