深圳大学算法设计与分析杨煊实验三

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

深圳大学实验报告

课程名称:算法设计与分析

实验项目名称:高斯消元

学院:

专业、班级:

指导教师:杨烜

报告人:学号:

实验报告提交时间: 2015.5.15

教务处制

一、实验目的

1.掌握变治法思想。

2.学会高斯列主元消去法及其应用。

二、实验内容

1. 高斯列主元消去法求解线性方程组。

2. 高斯列主元消去法判断矩阵是否可逆?需要说明理由,如果可逆,求出其逆矩阵。

三、实验原理

算法:GaussElimination(A[1...n,1...n],b[1...n])

//用部分选主元法实现高斯消去法

//输入:矩阵A[1...n,1...n]和列向量b[1...n]

//输出:一个代替A的上三角形等价矩阵图,相应的右边的值位于第(n+1)列中for i<-1 to n do A[i,n+1]<-b[i] //把b作为最后一列添加到A中

for i<-1 to n-1 do

pivotrow<-i

for j<-i+1 to n do

if |A[j,i]|>|A[pivotrow,i]|

pivotrow<-j

for k<-i to n+1 do

swap(A[i,k],A[pivotrow,k])

for j<-i+1 to n do

temp<-A[j,i]/A[i,i]

for k<-i to n+1 do

A[j,k]<-A[j,k]-A[i,k]*temp

算法:GaussBackSub(A[1...n,1...n+1])

//实现高斯消去法的反向替换

//输入:一个代替A的上三角形等价矩阵图,相应的右边的值位于第(n+1)列中 //输出:方程组的n个解

for i<-n downto 1 do

temp<-0.0

for j<-n downto i+1

temp<-temp+A[i,j]*x[j]

x[i]<-(A[i,n+1]-temp)/A[i,i]

return x

算法:IsInverseMatrix(A[1...n,1...n],b[1...n])

//用高斯消去法判断是否为逆矩阵

//输入:矩阵A[1...n,1...n]

//输出:如果是逆矩阵输出1,否则输出0

for i<-1 to n do A[i,n+1]<-b[i] //把b作为最后一列添加到A中

for i<-1 to n-1 do

pivotrow<-i

for j<-i+1 to n do

if |A[j,i]|>|A[pivotrow,i]|

pivotrow<-j

for k<-i to n+1 do

swap(A[i,k],A[pivotrow,k])

for j<-i+1 to n do

temp<-A[j,i]/A[i,i]

for k<-i to n+1 do

A[j,k]<-A[j,k]-A[i,k]*temp

for i<-1 to n

if(A[i,i]=0)

return 0

return 1

算法:求矩阵的逆矩阵(伪代码篇幅较长,仅描述主要思想)

思想描述:设待求矩阵B的逆矩阵为X,根据逆矩阵的定义,满足BX=I(其中I为n阶单位矩阵)。显然,对于一个n*n的矩阵B,其逆矩阵X同样为n*n。将待求矩阵X的第i 列xi看做一组未知数,同样的将单位矩阵I的第i列ei看作方程组右边的值。(1<=i<=n) 求解 Bxi=ei;所得解即为所求可逆矩阵第i列的值。即利用高斯消元法进行n次的方程求解,最终得到的矩阵即为逆矩阵。

四、实验代码(由于篇幅有限,实验源代码作为附件上传,此处仅列出部分代码)

高斯消元法求解线性方程组部分代码:

求解逆矩阵的部分代码:

五、实验结果

程序运行截图如下:

结果一:方程组AX=B的解

结果二:矩阵B的逆矩阵

利用MATLAB计算的结果如下:

结果一:方程组AX=B的解

结果二:矩阵B的逆矩阵

实验结果:通过实验验证以及对比可以得出,实验结果和MATLAB验证结果基本一致。

六、实验分析

1.实验正确性分析:对比结果如上,理论上来说,高斯消去法要么在一个线性方程组有唯一解时生成它的精确解,要么确定该方程组不存在这样的解。在后一种情况下,该方程要么无解,要么有无穷多个解。在实践中,用该方法在计算机解一个规模比较大的方程组,最主要的困难在于如何防止舍入误差的累积。也就是说,一定的误差是在所难免的,因此,通过MATLAB的验证,可以认为,这次实验结果基本正确。

2.实验效率分析:

函数功能基本操作效率

GaussElimination(int n,double a[N][N]) 高斯消元,使系数矩

阵变为上三角矩阵

a[j][k]=a[j][k]-a[i][k]*t

emp

n^3

GaussBackSub(int n,double a[N][N]) 反向替换,利用上三

角矩阵求出解集

temp=temp+a[i][j]*x[j] n^2

IsInverseMatrix(int n,double a[N][N]) 判断是否为逆矩阵,

判断主对角线元素

a[j][k]=a[j][k]-a[i][k]*t

emp

n^3

GetInverseMatrix(int n,double a[N][N]) 求逆矩阵,通过n次

高斯消元法进行求解

进行n次的高斯消元以及反向

替换

n*(n^3+n

^2)=n^4

可以看出,无论是求解方程组的解还是求解逆矩阵,算法效率都主要取决于高斯消元的消去阶段n^3。对于求解逆矩阵,效率达到了n^4,可以肯定的是,当数据规模达到一定程度时,该算法已经失去了实际意义。因此我们可以寻找其他效率更高的算法(比如利用LU 分解来求解),当然,该算法的优点在于简单易懂,算法主要进行了n次高斯消元的操作。因此,在一定的意义下,还是有着它的作用。

七、实验总结

相关文档
最新文档