高斯消元法解线性方程组
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高斯消元法解线性方程组
C++实验报告2015年6月
一、完成人
王婧婷张子承郗滢
二、问题描述
线性方程组问题是大学阶段经常研究的问题,为了进一步熟悉理解高斯消元法的解题思路并且掌握编程语言在数学方面的应用。且为解决线性方程组问题提供便利,要求给出线性方程组的矩阵,能够输出线性方程组的解。
三、解决方案设计
基本程序流程为:
(1)输入矩阵
(2)运用初等行变换将其化为阶梯型矩阵
(3)调用一个函数:r()求其秩(有解时)及其无解情况
实验原理为:
(1)系数矩阵及其增广矩阵经过初等行变换所得到的矩阵对应的方程与原方程同解
(2)化为阶梯型矩阵过程(输入增广矩阵后,运用初等行变换,使其a[i][i]以下全为零,若a[i][i]为零,运用行变换交换使其不为零)
(3)输出阶梯型矩阵
(4)判断解情况并输出(解情况)
(5)输出解
四、模块及代码组织设计
其基本模块分为三大部分,7小部分。第一部分为输入矩阵阶段,用for语句实现。第二部分是对矩阵进行一系列的处理以求得线性方程组的解,先运用初等行变换化为阶梯型,并输出化简矩阵;然后以线性方程组的秩判断其是否有解(规定无解时秩为零)。第三部分是输出线性方程组的解情况及其解,如果无解即输出无解。
五、关键代码
(1)实现化为阶梯型的代码
实现此功能的代码是整个程序的重要内容,其需要进行的初等变换以实现校园的目的,使线性方程组得到简化。其实现如下: for( i=0; i<=n-1&&i { if(a[i][i]!=0) { m1=a[i][i]; for( j=i+1; j<=m-1; j++) { m2=a[j][i]; for( k=0; k<=n; k++ ) { a[j][k]=a[j][k]-a[i][k]*m2/m1; } } } else if(a[i][i]==0) { for( j=i+1; j<=m-1; j++) { if(a[j][i]!=0) { for(k=0; k<=n; k++)//交换i,j两行使a[i][i]!=0 { b=a[i][k]; a[i][k]=a[j][k]; a[j][k]=b; } break; } } m1=a[i][i]; for( j=i+1; j<=m-1; j++) { m2=a[j][i]; for( k=0; k<=n; k++ ) { a[j][k]=a[j][k]-a[i][k]*m2/m1; } } } } (2)求出线性方程组系数矩阵秩的代码 此代码是实现判断线性方程组解情况,其代码如下: int r(int m,int n,double c[][10000]) { int i,j,k,b,e=0,f,x; double temp; double m1,m2; for(i=0; i { b=0; for(j=0; j { b=b+c[i][j]; if (b!=0 ) { e++; break; } } } for(i=0; i { b=0; f=0; for(j=0; j { b=b+c[i][j]; if(b!=0 ) f=1; } if(f== 0 && c[i][n]!=0)//若系数全为0,非齐次项不为0; { return 0; x=1; break; } } if(x!=1) return e; } (3)分情况讨论解结构 无解直接输出,单一解调用函数求解,无穷多解输出基础解析,代码如下: if(ra==0) cout<<"无解"< if(ra==n)//有唯一解 { cout<<"唯一解"< danjie(n,a,x); for(i=0; i cout<<'x'<<(i)<<'='<<(x[i])< } else if(ra { cout<<"无穷多解"< int ra=r(m,n,a); double b[ra][n-ra+1]; double xx[ra][n-ra+1]; for(i=0; i { for(k=0; k { b[i][k]=a[i][k+ra]; } } for(i=0; i a[i][ra]=b[i][n-ra]; } danjie(ra,a,x); for(i=0; i { xx[i][0]=x[i]; } for(j=1; j<=n-ra; j++) { for(i=0; i { a[i][ra]=0; a[i][ra]=a[i][ra]-b[i][j-1]; } danjie(ra,a,x); for(i=0; i { xx[i][j]=x[i]; } } for(i=0; i { if(i { cout<<'x'<<(i+1)<<'='; for(j=0; j<=n-ra; j++) { if(j==0) { if(xx[i][j])cout< } else { if(xx[i][j]>0&&(xx[i][j-1]==0))cout< else if(xx[i][j]>0&&xx[i][j-1]!=0)cout<<'+'< else if(xx[i][j]<0)cout< } } else cout<<'x'<<(i+1)<<'='<<'k'<<(i+1-ra); cout<