线性方程组的直接解法迭代解法.docx
- 文档编号:5421647
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:18
- 大小:35.27KB
线性方程组的直接解法迭代解法.docx
《线性方程组的直接解法迭代解法.docx》由会员分享,可在线阅读,更多相关《线性方程组的直接解法迭代解法.docx(18页珍藏版)》请在冰豆网上搜索。
线性方程组的直接解法迭代解法
广东金融学院实验报告
课程名称:
数值分析
实验编号及实验名称
线性方程组的直接解法迭代解法
系別
应用数学系
姓名
学号
班级
实验地点
实验口期
实验时数
2
指导教师
同组其他成员
无
成绩
实验目的及要求
实验目的:
题一:
通过数值实验,从中体会解线性方程组选主元的必要性和LU分解法的优点,以及方程组系数矩阵和右端向最的微小变化对解向最的影响。
比较各种直接接法在解线性方程组中的效果;
题二:
认识齐种迭代法收敛的含义、影响齐迭代法收敛速度的因素。
实验要求:
题一:
(1)在MATLAB中编写程序用列主元高斯消去法和LU分解求解上述方程组,输出曲b中矩阵A及向量b和A二LU分解中的L及U,detA及解向量X.
(2)将方程组中的2.099999改为2.1,5.900001改为5.9,用列主元高斯消去法求解变换后的方程组,输出解向最x及detA,并与
(1)中的结果比较。
(3)用MATLAB的内部函数inv求出系数矩阵的逆矩阵,再输入命令x=inv(A)*b,即可求出方程组的解。
请与列主元高斯消公法和LU分解法求出的解进行比较,体会选主元的方法具有良好的数值稳定性。
用MATLAB的内部曲数det求出系数行列式的值,并与
(1)、
(2)中输出的系数行列式的值进行比较。
(4)比较以上各种直接解法在解线性方程组中的效果。
题二:
(1)选取不同的初始向M:
X(0)及右端向最b,给泄迭代误差要求,用Jacobi迭代法和Gauss-Seidel迭代法求解,观察得到的序列是否收敛?
若收敛,记录迭代次数,分析计算结果并得出你的结论。
列岀算法清单。
(2)用SOR迭代法求上述方程组的解,松弛系数血取1<69<2的不同的三个值,在
<10"5
时停止迭代,记录迭代次数,分析计算结呆与松弛系数血的关系并得出你的结论。
(3)用MATLAB的内部函数inv求出系数矩阵的逆矩阵.再输入命令^inv(A)*b>即可求出上述各个方程组的解.并与上述三种方法求出的解进行比较。
请将比较结果列入卜表。
方程组的解
X1
Xr
■
迭代次数
误差
楮确解
Jacibi解法
Gause・seidel解法
SOR解法
00=
60=
60=
实验环境及相关情况(包含使用软件、实验设备、主要仪器及材料等)
1.Win7
2.Matlab7.0
实验内容及步骤(包含简要的实验步骤流程)实验内容:
题一:
解卜列线性方程组
'10
-7
0
‘X】、
(8、
-3
2.099999
6
2
Xr
5.900001
5
-1
5
-1
5
、2
1
0
2>
0
<1>
题二
研究解线性方程组做=b迭代法的收敛性、收敛速度以及SOR方法中/佳松弛因子的选取问题,用迭代法求解做二b,其中
・4
-1
r
■
7
A=
4
-8
1
b=
-21
-2
■
1
5
15
实验结果(包括程序或图表、结论陈述.数据记录及分析等,可附页)
题一:
直接解法解线性方程组
(1)列主兀高斯消去法与LU分解求解
列主元高斯消去法:
编写matalab程序(见附录gaosi.m),输出矩阵
-1.5
2.300
5.080
10.000-7.0000.000
=0.0002.5000-5.000
一0.0000.0006.000002
0.0000.0000.000
向量
8
b=
1
8.300
L5.0800J
解向量:
X=(0・-1,1rI)7其中系数行列式的值det(A)=762.00009
LU分解求解:
编Jmatalab程序(见附录zhjLU.m和LU・m),执行输出:
-3.0001.000000.0000
0.5000-25000001.0000
0.2000-24000000.9600
10.0000-7.00000.00001.0000
n=0.0000-0.0000010.00002.3000
—0.00000.0000150000005750000
0.00000.00000.00005.0800
在matlab命令窗II输入L*U,可以得到A二L*U,即分解结果正确。
解向量:
X=(0.-1,1,I)7其中系数行列式的值det(A)=-76200009
(2)将方程组中的2.099999改为2.1,5.900001改为5・9,使用列主元法求解后与
(1)比较结果修改程序(见附录gaosi2.m),输出解向量:
X=(0,-1,1,1)T
其中系数行列式的值det(A)=762,与⑴中结果对比:
方法
解向量
1det(A)|
列主元高斯消去法
X=(0,-1,1,l)r
762.00009
微小变化后列主元法
X=(0,-1,1,
762
从上表可以看出.微小变化后运用列主元高斯消去法输出解向彊和|det(A)|几乎不变.可以初步认为列主元高斯消去算法的稳定性絞好,且说运用该方法计算这类方程有效。
同时也町以说明这个方程是良态的。
(3)内部说数inv直接求解
直接使用inv函数编写matlab程序(如附录inv.m),输出向量解:
X=(0,-1,1,l)r其中det(A>-762.00009.
结合
(1)、
(2)>可列出全部结果表如下:
方法
解向量
1det(A)|
列主元高斯消去法
X=(0,-1,1,1/
762.00009
LU分解求解
X=(0,-1,1,l)r
76100009
微小变化后列主元法
X=(0,-1,1,1/
762
Inv内部函数法
X=(0,-1,1.l)r
76200009
由上表町看出,列主元高斯消去法.LU分解求解和Inv内部函数法求得的解向量都一致,都町以较粘确的求解原线性方程,在原方程组系数发生微小变化时,列主元法仍能稳定计算出方程组的解,说明其具有一定的稳定性。
系数行列式的值(|drt(A)|)几乎都相同。
(4)比较以上各种直接解法在解线性方程组小的效果
使用matlab内部幣数计算得出的解向Mx=inv(A)*b・閑为该方程组的解。
与列主元法和LU分解法得出的结果进行比较町知,他们都是等同的。
经过系数微小变化后列主元法仍能稳定的输出解向量,说明〕【只有良好的数值稳定性"而LU法只有较简介的优点,也讨以准确输出方程的解。
题一程序附录
——
(1)
%gaosi.m文件
%高斯消元法
clc
clear
formatlongg
A=[10-7018;-32.099999625.900001;5~15~15;2102l;]%10绘大,第一次不用选主元
A(2,:
)=A(2,:
)-A(l,:
)*A(2,1)/A(1,1)
A(3,:
)=A(3,:
)-A(l,:
)*A(3,1)/A(1,1)
A(4,:
)=A(4,:
)~A(1,:
)*A(4,1)/A(1,1)
tempo=A(3,:
),A(3,:
)=A(2,:
),A(2,:
)=tenpo%第:
次选主元
A(3,:
)=A(3,:
)-A⑵:
)*A(3,2)/A(2,2)
A(4,:
)=A(4,:
)-A(2,:
)*A(4,2)/A(2,2)%6最大,不同进行第三次选主元
A(4,:
)=A(4,:
)-A(3,:
)*A(4,3)/A(3,3)
x⑷二A(4,5)/A(4,4)
x(3)=(A(3,5)-A(3,4)*x(4))/A(3,3)
x
(2)=(A(2,5)-A(2,4)*x(4)-A(2,3)*x(3))/A(2,2)
x(l)=(A(l,5)-A(l,4)*x(4)-A(l,3)*x(3)-A(l,2)*x
(2))/A(l,1)
deta=A(l,1).*A(2,2).*A(3,3).*A(4,4)%det(A)
%zhjLU文件
%实现对矩阵A的LU分解的两数
function[L,U]二zhjLU(A)
[n,n]二size(A);
L=zeros(n,n);
U=zeros(n,n);
fori=l:
n
L(i,i)=l;
end
fork=l:
n
forj=k:
n
U(k,j)=A(k,j)-sum(L(k,l:
k~l).*U(l:
k~l,j)*);
end
fori=k+l:
n
L(i,k)=(A(i,k)_sum(L(i,l:
k_l).*U(1:
k_l,k)'))/U(k,k);
end
end
%LU.m文件
%LU分解与求解
clc
clear
A=[10-70l;-32.09999962;5-15-1;2102;];
[L,U]=zhjLU(A)%求LU
[n,m]=size(A);
b=[85.90000151]';
y(l)=b⑴;
fori=2:
n
forj=l:
i-lb(i)=b(i)-L(i,j)*y(j);
end
y(i)=b(i);
end
x(n)=y(n)/U(n,n);
fori=(n~l):
~1:
1
forj=n:
-l:
i+ly(i)=y(i)-U(i,j)*x(j);
end
x(i)=y(i)/U(i,i);
end
det=U(1,1)*U(2,2)*U(3,3)*U(4,4)
(2)
%gaosi2.m文f|
%高斯消元法
clc
clear
formatlongg
A=[10-701&-32.1625.9;5T5T5;2102l;]%10最大,第一次不用选主元
A(2,:
)=A(2,:
)-A(l,:
)*A(2,1)/A(1,1)
A(3,:
)=A(3,:
)-A(l,:
)*A(3,1)/A(1,1)
A(4,:
)=A(4,:
)-A(l,:
)*A(4,1)/A(1,1)
tempo二A(3,:
),A(3,:
)=A(2,:
),A(2,:
)=teinpo%第二次选主元
A(3,:
)=A(3,:
)-A(2,:
)*A(3,2)/A(2,2)
A(4,:
)=A(4,:
)-A(2,:
)*A(4,2)/A(2,2)%6最大,不同进行第三次选主元
A(4,:
)=A(4,:
)-A(3,:
)*A(4,3)/A(3,3)
x⑷=A(4,5)/A(4,4)
x(3)=(A(3,5)-A(3,4)*x(4))/A(3,3)
x
(2)=(A(2,5)-A(2,4)*x(4)-A(2,3)*x(3))/A(2,2)
x
(1)=(A(l,5)-A(l,4)*x(4)-A(l,3)*x(3)~A(1,2)*x
(2))/A(l,1)
deta=A(l,1).*A⑵2).*A(3,3).*A(4,4)%det(A)
(3)
%inv.m文件
%inv断数解法
clc
clear
formatlong
a=[10-70l;-32.09999962;5-15~1;2102;]
b=[85.90000151Y
x=inv(a)*b
det(a)
题一分割线
题二:
迭代解法解线性方程组
(1)选取不同的初始向量X®及右端向量b,给定迭代误差要求,用Jacobi迭代法和Gauss-Seidel迭代法求解,观察得到的序列是否收敛?
若收敛,记录迭代次数,分析计算结果并得出你的结论。
列岀算法清单。
Jacobi迭代法:
Stepl:
判断收敛
编辑程序如F:
——雅可比迭代收敛判断
clc
clear
A=[4-11;4-81;-215;];
B=[7-2115]1;
n=length(A);
D=zeros(n);
L=zeros(n);
U=zeros(n);
fori=l:
n
forj=l:
n
ifi==j
D(i,j)=A(i,j)
elseifi>j
L(i,j)=-A(i,j);
elseU(i,j)=-A(i,j);
end
end
end
J=inv(D)*(L+U)
PR=max(abs(eig(J)))
结果:
得雅可比迭代矩阵谱半径p(J)=D—1(厶+[/)=0.335 Step2: 迭代次数 编写程序如下: 雅可比迭代求解 clc clear A=[4-丄L;4-81;-215;]; B=[7-2115]1; P=[000]1;%初始向量 delta=O.000001;%JS度设置 maxl=20;%杲大迭代次数 X=jacobi(AfBfPzdelta,maxi)*雅可比迭代求解 函数 functionX=jacobi(A,BrP,deltarmaxi) fprintf(1KX (1)X (2)X(3)error\nf) N=iength(B); fork=l: maxi forj=l: N X(j)=(B(j)-A(j,[1: j-l,j+l: N])*P([1: j-l,j+l: N]))/A(j,j);end error=abs(norm(Xf-P)); fprin(壮3・%10.%10.£fr%10.%10.\nf.kzXrerror); relerr=error/(norm(X)+eps); P=Xf; if(error break end end X=Xf; 其中,初始向量选定为X°= (0-0,0): 精度设置为10=得到结果如下表 表1雅可比迭代法求解结果 KX(l) X (2) S(3) error 1 1.750000 2.625000 3.000000 4.353519 2 1.656250 3.875000 3.175000 1.265667 3 1.925000 3.850000 2.887500 0.394345 4 1.990625 3.948437 3.000000 0.163257 5 1.987109 3.995312 3.006563 0.047463 6 1.997187 3.994375 2.9957S1 0.014788 i 1.999648 3.998066 3.000000 0.006122 8 1.999517 3.999824 3.000246 0.001780 9 1.999895 3.999789 2.999842 0.000555 10 1.999987 3.999927 3.000000 0.000230 11 1.999982 3.999993 3.000009 0.000067 12 1.999996 3.999992 2.999994 0.000021 13 2.000000 3.999997 3.000000 0.000009 由表1中可以看出,当迭代次数达到13时谋差为0.9x10-5<10-5,达到收敛。 Gauss-Seidel迭代法: Stepl: 判断收敛 编写程序如下: Gauss-Seidel迭代法收敛判断 clc clear A=[4-11;4-81;-215;]; B=[7-2115]1; n=length(A); D=zeros(n); L=zeros(n); U=zeros(n); fori=l: n forj=l: n ifi==j D(i,j)=A(i,j) elseifi>j L(i,j)=-A(i,j); elseU(i,j)=-A(i,j); end end end GS=inv(D-L)*U PR=max(abs(eig(GS))) 结果: 得Gauss-Seidel&代法对应矩阵谱半径p(G)=(D-L)=0.125<1,由此可以判断 对于矩阵A实用Gauss-Seidel迭代法也町以达到收敛,而且收敛性比雅可比迭代法要好! Step2: Gauss-Seidel迭代法求解 编写程序如下: Gauss-Seidel迭代法求解 clc clear A=[4-11;4-81;-215;]; B=[7-2115]1; P=[000]1; delta=0・000001; maxl=80; det(A); eig(A) X=gseid(AfB,Pzdelta,maxi) ―函数 functionX=gseid(AfB,P,delta,maxi) fprintf(fKX(l)X (2)X(3)error\nf) N=length(B); fork=l: maxi forj=l: N ifj==l X (1)=(B (1)-A(1f2: N)*P(2: N))/A(lr1); elseifj==N X(N)=(B(N)-A(Nf1: N-1)*(X(1: N-1))・)/A(N,N); else X(j)=(B(j)-A(j,1: j-l)*X(l: jj+l: N)*P(j+l: N))/A(j,j); endend error=abs(norm(Xf-P)); fprin・Of*10.Gf%10.6f%10・,k,X,Griroir); relerr=error/(norm(X)+eps); P=Xf; if(error break end end X=Xf; 其中,初始向量选定为Xo=(0.0,0)r,精度设置为10=得到结果如下表: 表2Gauss-Seidel迭代法求解结果 K X(l) X (2) X(3) error 1 1.750000 3.500000 3.000000 4.930771 2 1.875000 3.937500 2.962500 0.456550 3 L.993750 3.992188 2.999063 0.135754 4 1.998281 3.999023 2.999508 0.008213 5 1.999879 3.999878 2.999976 0.001871 6 1.999975 3.999985 2.999993 0.000145 ■ i L.999998 3.999998 3.000000 0.000027 8 2.000000 4.000000 3.000000 0.000002 由表2可以看出,在迭代第8步时误差为0.2x10-5<10-\此时达到收敛。 相比雅可比迭代法,Gauss-Seidel迭代法收敛的速度较快,和收敛判断的结果一致。 (2) 用SOR迭代法求上述方程细的解,松弛系数69取1V^V2的不同的三个值.在 时停止迭代,记录迭代次数,分析计算结果与松弛系数血的关系并得出你的结论。 Stepl: 程序编写 超松弛迭代法程序 %函数SOR functionX=sor(AzBrP,deltazmaxlrw) fprintf(fKX(l)X (2)X(3)error\nf) N=length(B); fork=l: maxi forj=l: N ifj==l X(l)=P(l)+w*(B (1)-A(1Z1: N)*P(1: N))/A(lf1); else X(j)=P(j)+vz*(B(j)-A(jr1: j-1)*(X(1: j-1)f)-A(jr)/A(jrj); end end error=abs(norm(Xf-P)); fprintf(r%3・Of,*JLO・6tf*10.6fr*10・*丄0・lDfr\nfrkrXrerror); relerr=error/(norm(X)+eps); P=Xf; if(error break end end X=Xf; 执行命令: clc clear A=[4-1L;4-81;-215;]; B=[7-2115]*; P=[000]*;%初始向量delta=0.00001;*精度设宜maxl=200;%最大迭代步数w=1.3;辛迭代I大I子选取 X=sor(AfBfPzdeitarmaxi,w) Step2: 超松弛迭代求解 分别选取松弛因子为1.1.1.3.1.5.1.&输出结果如下: 衣3超松弛迭代求解结果 SOR解法 方程组的解 迭代次数 误差 X1 X. 69=11 1.9999992522 3.9999998267 2.9999994805 10 5.0051e一06 69=13 2.0000025600 4.0000019188 3.0000028812 16 6.1227亡一06 co=\5 2.0000016508 4.0000004596 3.0000006994 20 4.1297e-06 69=1.8 1.9999947680 3.9999987602 2.9999947661 178 9.9008e-06 由表3可以看出,选取不同的松弛因子收敛的速度也不一样,当选取松弛因子为1.1时,迭代10次即可在既定精度卜•达到收敛,当选取松弛因子为1.8时,却要迭代167次才能达到收敛。 由表中虽然明显看出松地因子越人,达到收敛所需要的迭代次数越姜,但是不能凭这
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性方程组 直接 解法
![提示](https://static.bdocx.com/images/bang_tan.gif)