深圳大学算法设计与分析杨煊实验三
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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次高斯消元的操作。因此,在一定的意义下,还是有着它的作用。
七、实验总结