选列主元的高斯消去法实验报告2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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的使用有了进一步的了解。

相关文档
最新文档