数值分析大作业.docx
《数值分析大作业.docx》由会员分享,可在线阅读,更多相关《数值分析大作业.docx(10页珍藏版)》请在冰点文库上搜索。
![数值分析大作业.docx](https://file1.bingdoc.com/fileroot1/2023-6/3/1c9b572c-6a4f-4462-a4e9-9e9d12a04056/1c9b572c-6a4f-4462-a4e9-9e9d12a040561.gif)
数值分析大作业
数值分析大作业
号:
xlxkIz
彳、
专业:
机械工程
学生姓名:
***
2014年10月
摘要:
在自然科学与工程技术中,很多问题的解决常常归结为求解线性方程组Ax=bo随着计算机的发展,利用计算机这个强有力的计算工具去求解线性方程组是一个非常实用的问题。
在求解大型线性方程组时,直接法在多次消元,回代的过程中,四则运算的误差累计与传播无法控制,致使计算结果的精度就无法保证,特别是求解大型稀松矩阵时,还要对系数矩阵进行分解。
而迭代法相对于直接法而言,具有保持迭代矩阵不变的特点,计算程序一般也比较简单,且对于许多问题收敛速度比较快。
比较常用的迭代法有雅克比迭代法、高斯一塞德尔迭代法和逐次超松弛迭代法等,本次研究LI的是通过求解一个线性方程组来比较它们的迭代效果,验证一些已有的结论。
1.数学原理
1.1雅可比迭代法
将线性方程组的系数矩A=(aij)eRf^分解为A二D+L+U,其中D是由A的
主对角元素构成的对角矩阵,L是山A的严格下三角部分构成的严格下三角矩
阵,U是曲A的严格上三角部分构成的严格上三角矩阵,即
—
0
a23
•
■
・.・
%
0
an-\.n
0
若系数矩阵A的对角元素陽H0(j=l,2,…川),则矩阵D非奇异,取M=D,
N=(L+U),则x=-D^(L+U)x+D'lb=GJx+gJ,
因而,构造的迭代法为:
(妇4)_厂⑹
x=5兀+g/,
Gj=-D~\L+U),gj=D".
1.2高斯•赛得尔迭代法
将线性方程组的系数矩A=(aij)e^1分解为A二D+L+U。
若系数矩阵A的对角元素不等于0,则矩阵D非奇异,取M二L+D,N=-U,则
x=—(2L+D)1Ux+(厶+D)1b—Ggx+gG
因而,构造的迭代法为:
严)=Gf)+g。
,G6.=-(L+D)-*C/,^=(£+/))-*/..
1.3逐次超松弛迭代法
线性方程组的系数矩A=(az)eIT"分解为A二D+L+U。
取M=丄(P+a)L\=1[(1-g))D-coU\贝ij
CDCD
x=(£>+血J[(1-co)D-coU]x+gj^D+血Jb-Gsx+gs
因而,构造的迭代法为:
d+n_厂(切
X=(jrsX+g$.,
Gg=(D+皿)"[(1一co)D-cou\gs=co{D+coLy'b.
2•程序设计
2.1雅可比迭代法求解
雅可比迭代法MATLAB程序如下:
%majacobi.m
functionx=majacobi(A,b,xO,ep,N)
%用途:
用Jacobi迭代法解线性方程组Ax=b
%格式;x=majacobi(A,b,xO,ep,N)A为系数矩阵,b为右端向量,
%x0为初始向量(默认零向量),ep为精度(默认le-6),
最大迭代次数(默认500次),x返回近似解向量
n=length(b);
ifnargin<5,N=5OO;end
ifnargin<4,ep=1e-6;end
ifnargin<3,xO=zeros(n,1);end
x=zeros(nj);k=0;
whilekfori=l:
n
x(i)=(b(i)-A(i,[1:
i-1,i+l:
n])*xO([1:
i-l,i+l:
n]))/A(ij);
end
ifnorm(x-xO,inf)xO=x;k=k+l;
end
ifk==N,Waming(,100*);end
disp([*k=\num2str(k)])
在MATLAB命令窗口执行创建的m文件
»editmajacobi
»A二[10・9,l・2,2・l,0・9;l・2,ll・2,l・5,2・5;2・l,l・5,9・&l・3;0・9,2・5,l・3,12・3]
A=
10.90001.20002.10000.9000
1.200011.20001.50002.5000
2.10001.50009.80001.3000
0.90002.50001.300012.3000
»b二卜7.0,5.3,10.3,24.6];
»x=majacobi(A.b)
k=17
X=
-0.9986
0.0071
1.0032
1.9656
2.2高斯■赛得尔迭代法求解
高斯-赛得尔迭代法MATLAB程序如下:
%maseidel.m
functionx=maseidel(A,b,xO,ep,N)
%用途:
用Gauss-Seidel迭代法解线性方程组Ax=b
%格式:
x=maseidel(A,b,xO,ep,N)A为系数矩阵,b为右端向量,
%x0为初始向量(默认零向量),ep为精度(默认le-6),
%“为最大迭代次数(默认500次),x返回近似解向量
n=length(b);
ifnargin<5,N=5OO;end
ifnargin<4xp=1e-6;end
ifnargin<3,x0=zeros(n,1);end
x=zeros(n,l);k=0;
whilekfori=l:
n
ifi==l
x
(1)=(b
(1)-A(1,2:
n)*xO(2:
n))/A(lJ);
elseifi==n
x(n)=(b(n)-A(n,l:
n-l)*x(l:
n-1))/A(n,n);
else
x(i)=(b(i)-A(i,l:
i-l)*x(l:
i-l)-A(i,i+1:
n)*xO(i+1:
n))/A(i,i);
end
end
end
ifnorm(x-xOJnf)xO=x;k=k+l;
end
ifk==N,Waming(,1OO');end
disp([fk=\num2str(k)])
在MATLAB命令窗口执行创建的m文件:
»editmaseidel
»A二[10.9,122丄0・9;121121・525;2丄1・59&1・3;0・925,1・3,12・3]
A=
10.90001.20002」0000.9000
1.200011.20001.50002.5000
2.10001.50009.80001.3000
0.90002.50001.300012.3000
»b二卜7・0,5・3,10・3,24・6];
»x=maseidel(A,b)
k=7
-0.9986
0.00711.0032
1.9656
2.3逐次超松弛迭代法求解
逐次超松弛迭代法MATLAB程序如下:
%masor.ni
functionx=masor(A,b,omega,xO,ep.N)
%用途:
用SOR迭代法解线性方程组Ax=b
%格式:
x=maseidel(A,b,xO,ep,N)A为系数矩阵,b为右端向量,
%omega为松弛因子(默认1.5),x0为初始向量(默认零向量),ep为精度(默
认le-6),
最大迭代次数(默认500次),x返回近似解向量
n=length(b);
ifnargin<6,N=500;end
ifnargin<5,ep=1e-6;end
ifnargin<4,x0=zeros(n,1);end
ifnargin<3,omega=1.5;end
x=zeros(nJ);k=0;
whilekfori=I:
n
ifi==l
xl(l)=(b
(1)-A(12n)*x0(2:
n))/A(1,1);
elseifi==n
x1(n)=(b(n)-A(n,1:
n-1)*x(1:
n-1))/A(n,n);
else
x1(i)=(b(i)-A(i,1:
i-l)*x(1:
i-1)-A(i,i+1:
n)*x0(i+1:
n))/A(i,i);
end
end
x(i)=(1-omega)*xO(i)+omega*xl(i);
end
ifnorm(xO-x,inf)k=k+l;xO=x;
end
ifk==N,WarningC1OO*);end
disp([,k=\num2str(k)])
取不同的松弛因子进行试验,在MATLAB命令窗口执行创建的m文件:
»editmasor
»A二[10.9,122」,0・9;121121・525;2丄1・59&1・3;0・925,1・3,12・3]
A=
10.9000
1.2000
2」000
0.9000
1.2000
11.2000
1.5000
2.5000
2.1000
1.5000
9.8000
1.3000
0.9000
2.5000
1.3000
12.3000
»b二卜7・0,5・3,10・3,24・6]‘;
»x二masor(AbO・4)
k=33
-0.9986
0.0071
1.0032
1.9656
取其它的松弛因子得:
取松弛因子为0.8>>x=masor(Ab0・8)得到k=12;x=-0.9986,0.0071,
1.0032,1.9656o
取松弛因子为1.2»x=masor(A,b,1.2)得到k=ll;x=-0.9986,0.0071,
1.0032,1.9656o
取松弛因子为1.6»x=masor(A,b,1.6)得到k=33;x=-0.9986,0.0071,1.0032,1.9656o
三.结果分析和讨论
由程序解得的结果可知:
雅可比迭代法在第17次迭代达到收敛,高斯-塞德尔迭代法在第7次迭代达到收敛。
从此例可以看出,高斯-塞德尔迭代法比雅可比迭代法收敛速度快(达到同样的精度所需迭代次数少)。
山雅可比迭代公式可知,在迭代的每一步计算过程中使用的是旧的分量来讣算,没有用到迭代出的新的分量。
从直观上看,最新计算出的分量可能比旧的分量接近真实值,要更好一些。
而高斯-赛德尔迭代法就在计算过程中加入了新值的因素,在每次迭代时将前面所得到的新值迅速地被利用到计算下一个值上,从而可以减少讣算的次数,节约时间。
曲本次计算和迭代公式可以得出,高斯-赛德尔迭代法在收敛速度上要优于雅可比迭代法。
而迭代序列的收敛取决于迭代矩阵的谱半径,而与初值向量的选取无关。
因为在求解同一个方程组时,雅可比迭代法和高斯-赛德尔迭代法的谱半径不一定相同,而且并无包含关系,因此,有时雅可比迭代法收敛,而高斯-赛德尔不收敛。
当然,也有雅可比迭代法不收敛,而高斯-赛德尔迭代法收敛的情形。
从超松弛迭代法的结果来看,松弛因子分别取0.4,0.&1.2,1.6时,达到最终精度要求的迭代次数分别为33,12,11,33o由此可见,超松弛迭代法中松弛因子的选择很重要。
如果选择合适的松弛因子,会使迭代法的收敛速度大大提高。
四•实验心得体会
对于线性方程组的迭代法求根,有多种迭代方法,选取合适的迭代方程和初值,有利于提高迭代方程的迭代速度,减少讣算量,较快的得到理想的答案。
通过这次研究,我学会了使用雅可比迭代法,高斯-赛德尔迭代和逐次超松弛迭代
法的编程来求解线性方程组,巩固了程疗:
设讣算法的编写,而且对这儿种迭代方
法的计算选取有了更深刻的理解,受益匪浅。