数值分析实验二(列主元Gauss消去法)
- 格式:doc
- 大小:75.00 KB
- 文档页数:3
《数值分析》实验报告
实验编号:实验二
课题名称:列主元Gauss消去法
一、算法介绍
1、输入矩阵的阶数n,方程组的增广矩阵A;
2、对k=0,1,…,n-2,循环:选取列中绝对值最大的元素,将主元所在的行的元素保存在
数组temp[n+1]中。若主元为零,则系数矩阵奇异,计算停止;否则,顺序进行。如果绝对值最大的元素就在矩阵的对角线上,则进行普通高斯消元法的第一大步,否则将方程组系数换行之后再进行普通高斯消元法的第一大步;
3、然后利用回代法求解线性方程组。
二、程序代码
#include
#include
#include
using namespace std;
int main()
{
int n=0,k=0,i=0,j=0,h=0,g=0,flag=0,i1,j1;
double max=0,m=0;
cout<<"***利用列主元Gauss消元法求解线性方程组***"< cout<<"请输入矩阵的阶数:"< cin>>n; double a[n][n+1]; double t[n+1]; double x[n]; memset(a,0,sizeof(a)); memset(x,0,sizeof(x)); cout<<"请输入方程组的增广矩阵:"< for(i=0;i { for(j=0;j { cin>>a[i][j]; } } for(k=0;k { max=0;j1=0; for(i=k;i { if(fabs(a[i][k])>max) { max=fabs(a[i][k]); i1=i; j1=k; } } if(max==0) { cout<<"该系数矩阵为奇异矩阵,计算停止"< flag=1; break; } else { cout<<"第"< <<",在线性方程组的第"< if(i1!=k) { for(j=0;j<=n;j++) { t[j]=a[i1][j]; a[i1][j]=a[k][j]; a[k][j]=t[j]; } } for(i=k+1;i<=n-1;i++) { m=a[i][k]/a[k][k]; for(j=k;j<=n;j++) a[i][j]=a[i][j]-m*a[k][j]; for(g=0;g { for(h=0;h cout< cout< } cout< } } } if(flag==0) { x[n-1]=a[n-1][n]/a[n-1][n-1] ; double sum=0; for(k=n-2;k>=0;k--) { sum=0; for(i=n-1;i>=k;i--) sum+=a[k][i]*x[i]; x[k]=(a[k][n]-sum)/a[k][k]; } cout<<"该线性方程组的解为:"< for(i=0;i cout<<"x"< } system("pause"); return 0; } 三、运算结果截屏 四、算法分析 列主元Gauss消元法避免了普通高斯消元法中出现的问题:遇到某个主元为零或者当主元绝对值很小时,计算将会停止或求出的结果将与其实际结果相差很远。但是当方程组各行系数的量级相差很大时 列主元Gauss高斯消元法就会失效,也会使方程组的结果不准确。