选列主元的高斯消去法实验报告2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
选列主元的高斯消去法实验报告
令狐烈
一,实验目的:
(1)掌握gauss消去法的基本算法思想和学会编写其MATLAB代码。
(2)掌握选列主元的gauss消去法的基本算法思想和学会编写其MATLAB代码。(3)分析选列主元的gauss消去法相比于gauss消去法的优点。
(4)对选列主元的gauss消去法和gauss消去法进行误差分析
二,实验原理
对于非奇异矩阵A,求解线性方程组Ax=b可以使用gauss消去法进行。但是,gauss消去法要求系数矩阵A的顺序主子式非奇异。
为此做出改进:每次消元之前,首先选出第i列(i<=k)中最大的作为列主元,这样,就能保证消元乘数
不仅不被系数矩阵A的顺序主子式非奇异的限制,还这样就能有效的防止误差的传播与放大。
算法:
(1)对增广矩阵[a b]进行第i次消元,首先选取列主元a(i,k)=Max|a(I,i:n),交换第i行与第k行;
(2)以列主元进行消元,计算公式为
a(k,i)= a(k,i)/a(i,i); (k=i+1:n)
a(k,j)=a(k,j)-a(k,i)*a(i,j); (j=i:n)
(3)回代法计算结果,计算公式为:
x(n)=b(n)/a(n,n);
x(p)=[b(p)-∑a(p,j)x(j)]/a(p,p) (j=p+1:n)
注:gauss(a,b)为选取列主元gauss消去法,gauss2(a,b)为gauss消去法。三,实验MATLAB程序代码
实验的MATLAB程序代码如下
四,实验结果与分析
1,两种算法对系数矩阵的顺序主子式奇异线性方程的效果分析
实验结果(如图一)对于顺序主子式奇异的系数矩阵,使用gauss消去法(gauss2(a,b))不能解出,而使用选列主元的gauss消去法(gauss(a,b))能够解出。主要是选列主元的gauss消去法每次都选出最大的列主元,从而保证了每次用作除数的a(I,i)≠0.
图一:两种算法对系数矩阵的顺序主子式奇异线性方程的效果
2,两种算法对舍入误差的放大效应分析
用随机生成函数random('Normal',1,7,10,10)生成10*10矩阵,分别gauss消
去法和选列主元的高斯消去法解出,并用公式er(x)=||x−x∗||
||x||≤cond(a)∗||r||
||b||
估计其误差,
结果如下图。
图二:两种算法对舍入误差的放大效应分析
可以看到,对同一个方程组,选列主元的高斯消去法得到的结果中范数norm(r=a*ans'-b,inf)= 6.6613e-016<高斯消去法得到的结果中范数norm(r=a*ans'-
b,inf)= 7.6605e-015,两者相差一个数量级,由公式 er(x)=||x−x∗||
||x||≤cond(a)∗||r||
||b||
可知,
对应的误差也就相差一个数量级。
选列主元的高斯消去法因为每次消元之前,首先选出第i列(i<=k)中最大的作为列主元,这样,就能保证消元乘数小于1,因此选列主元的高斯消去法能有效的防止误差的传播与放大。
3,对于恶性矩阵:希尔伯特矩阵,选列主元的高斯消去法的表现:
由以下代码生成希尔伯特矩阵:
for i=1:n
for j=1:n
a(i,j)=1/(i+j-1);
end
end
取方程组Hx=ones(n,1);
当n=5, 结果为:
norm(a*ans'-b,inf)= 8.7311e-011;
er(x)=||x−x∗||
||x||≤cond(a)∗||r||
||b||
= (4.7661e+005*1.4211e-014)/ 2.2361=3.0290*-09;
可见误差比较小;结果还可以接受。当n=10, 结果为:
norm(a*ans'-b,inf)=8.7311e-011;
er(x)=||x−x∗||
||x||≤cond(a)∗||r||
||b||
= (1.6025e+013*8.7311e-011)/ 3.1623=4.4720*+02;
此时,误差已经大到无法接受。
对于这样的情况,需要用以下方法改进:
(1)算出残余矩阵r= b -a*x;
(2)解出a*y=r;
(3)X’=x+y;
但是这种改进只对病态不是很严重的矩阵有帮助,对病态严重的矩阵,比如对于H10,我们有:
改进后,解得:
x=(x+y) = 1.0e+006 *[ -0.0000 0.0010 -0.0238 0.2402 -1.2611 3.7834 -6.7260 7.0006 -3.9379 0.9237],
对应误差为
er(x)=||x−x∗||
||x||≤cond(a)∗||r||
||b||
= (1.6025e+013* 8.0036e-011)/
3.1623=
4.0558*+02,
可见改进并无很好效果。
五,实验心得
(1)通过具体的实验,我真正明白了gauss消去法的原理,而且明白了选列主元的gauss消去法对于减小系数矩阵的要求和减少舍入误差的传
播方面的优点。
(2)由于MATLAB我是才开始接触,因此在编程的时候碰到了许多问题,花了不少时间,但是也让我对MATLAB的使用有了进一步的了解。