高斯列主元消去法0425121523.docx
- 文档编号:25080529
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:13
- 大小:47.97KB
高斯列主元消去法0425121523.docx
《高斯列主元消去法0425121523.docx》由会员分享,可在线阅读,更多相关《高斯列主元消去法0425121523.docx(13页珍藏版)》请在冰豆网上搜索。
高斯列主元消去法0425121523
高斯列主元消去法解线性方程组
二、算法的基本思想
大家知道,如果一个线性方程组的系数矩阵是上三角矩阵时,即这种方程组我们称之为上三角方程组,它是很容易求解的。
我们只要把方程组的最下面的一个方程求解出来,在把求得的解带入倒数第二个方程,求出第二个解,依次往上回代求解。
然而,现实中大多数线性方程组都不是上面所说的上三角方程组,所以我们有可以把不是上三角的方程通过一定的算法化成上三角方程组,由此我们可以很方便地求出方程组的解。
高斯消元法的目的就是把一般线性方程组简化成上三角方程组。
于是高斯消元法的基本思想是:
通过逐次消元将所给的线性方程组化为上三角形方程组,继而通过回代过程求解线性方程组。
存在的问题。
1.一旦遇到某个主元等于0,消元过程便无法进行下去。
2.在长期使用中还发现,即使消元过程能进行下去,但是当某个主元的绝对值很小时,求解出的结果与真实结果相差甚远。
为了避免高斯消去法消元过程中出现的上述两个问题,一般采用所谓的选择主元法。
其中又可以分为列选主元和全面选主元两种方法。
目前计算机上常用的按列选主元的方法。
因此我在这里做的也是列选主元高斯消去法。
他的特点是:
每次在系数矩阵中依次按列在主对角线及以下的元素中,选取绝对值最大的元素作为主元,将她调到主对角线上,然后用它消去主对角线以下的元素,最后化为同解的上三角形方程组去求解。
由于列主元法相对高斯消元法来说就增加了选主元操作,其他的求解步骤是一样的。
程序只能最大输入60行60列的系数矩阵。
2.程序要用到的函数
(1、)matrix_getElement(array,n,m);此函数的作用是获得用户输入的线性方程组的系数矩阵。
(2、)matrix_outputElement(array,n,m);此函数的作用是显示用户输入的矩阵。
(3、)selectMaxElement(array,n,m,row);此函数的作用是选择主元素,并把此时对角线上的那列元素与主元素行交换。
(4、)GAUSSProcess(array,n,m,row);此函数的作用是用主元素列进行高斯消元,把此行以后所有的行的,此列的元素变为0。
(5、)GAUSSProcess_result(array,n,m);此函数的作用是显示经过高斯消元后的矩阵,此时的系数矩阵为一个上下三角矩阵。
(6、)GAUSSCalculate_result(array,n,m);此函数的作用是对已经消元好的矩阵,进行回代求解。
并将结果输出。
六、程序代码
//--------------------------***************高斯列消去法*****
#include
#include
#include
#include
constintN=60;//最大
constintM=61;//60列,再加上等号右边的一列值
//------------------------------输入要计算方程组的矩阵-----------
voidmatrix_getElement(doubleARRAY[N][M],intn,intm)
{
for(inti=0;i { cout<<"请您输入第"<<"\t"<<(i+1)<<"\t"<<"row: "< for(intj=0;j { cin>>ARRAY[i][j]; } } return; } //---------------------------------------------------------- //---------------输出用户刚才用户输入的矩阵,以便用户检测是否输入正确 voidmatrix_outputElement(doubleARRAY[N][M],intn,intm) { cout<<"yourhaveinputthematrixasfllows: \n"; for(inti=0;i { for(intj=0;j { cout< } cout< } } //------------------------------------------------------- //---------------------选择主元素,并把主元行与对角线上的那一行交换 voidselectMaxElement(doubleARRAY[N][M],intn,intm,intline) { doublemax=0; doublet=0; intj=0; inti=line; max=ARRAY[line][line]; for(i=line+1;i { if(fabs(ARRAY[i][line])>fabs(max)) {max=ARRAY[i][line]; j=i; } } if(j>line) { for(i=0;i { t=ARRAY[j][i]; ARRAY[j][i]=ARRAY[line][i]; ARRAY[line][i]=t; } } } //-------------------------------------------------------- //------------------------用对角线上的元素消去后续行中此列的元素 voidGAUSSProcess(doubleARRAY[N][M],intn,intm,introw) { doubleROW1[M]; for(intt=0;t<(m-row);t++) { ROW1[t]=ARRAY[row][row+t]; } for(intj=(row+1);j { doubleROW_CHANGE[M]; for(intr=0;r<(m-row);r++) { doublemainElement=ROW1[0]; if(fabs(mainElement)<1e-7) { cout<<"Single! pressanykeyreturn...\n"; getchar(); return; } ROW_CHANGE[r]=ROW1[r]*ARRAY[j][row]/ROW1[0]; } for(inth=0;h<(m-row);h++) { ARRAY[j][h+row]=ARRAY[j][h+row]-ROW_CHANGE[h]; } } } //-------------------------------------------------------- //--------------------------用回代的方法求出线性方程组的解----------- voidGAUSSCalculate_result(doubleARRAY[N][M],intn,intm) { doublea[N]; a[n-1]=ARRAY[n-1][m-1]/ARRAY[n-1][n-1]; for(intp=n-2;p>=0;p--) { for(intq=n-1;q>p;q--) { ARRAY[p][m-1]=ARRAY[p][m-1]-ARRAY[p][q]*a[q]; } a[p]=ARRAY[q][m-1]/ARRAY[p][p]; } cout<<"-------------------------thefinalresultasfollows------------------: \n"; for(inte=0;e { cout<<"x"< } } //------------------输出经过高斯消去法处理后得到的矩阵------------ voidGAUSSProcess_result(doubleARRAY[N][M],intn,intm) { cout<<"您输入的矩阵经过高斯消去法处理后得到如下形式: \n"; for(inti=0;i { for(intj=0;j { cout< } cout< } } //-------------------------------------------------------- //--------------------------------main函数----------------------- voidmain() { doublearray[N][M]; cout<<"请输入您要运算的矩阵的大小! \n"; intn=0,m=0; cout<<"请输入您要运算的矩阵的行数: "; cin>>n; cout<<"请输入您要运算的矩阵的列数: "; cin>>m; cout<<"您所输入的行为: "< "< matrix_getElement(array,n,m);//获得矩阵的元素 matrix_outputElement(array,n,m);//显示输入的矩阵 for(introw=0;row { selectMaxElement(array,n,m,row); GAUSSProcess(array,n,m,row); } GAUSSProcess_result(array,n,m);//显示消元后的矩阵 GAUSSCalculate_result(array,n,m);//回代求解并显示解结果 cout<<"Thisistheend! "; } //-------------------------------------------------------- 七、实例 本程序可以自己选择在60个未知数的方程组,可以自己选择线性方程组的行数和列数。 例子如下: 2x1+x2-5x3+x4=8; x1-3x2-6x4=9; 2x2-x3+2x4=-5; x1+4x2-7x3+6x4=0; 输入您要运算的矩阵的大小! 请输入您要运算的矩阵的行数: 4 请输入您要运算的矩阵的列数: 5 您所输入的行为: 4您所输入的列为: 5 #include #include usingnamespacestd; #defineN4//矩阵维数,可自定义 staticdoubleA[N][N];//系数矩阵 staticdoubleB[N];//右端项 staticdoubleY[N];//中间项 staticdoubleX[N];//输出 staticdoubleS[N];//选取列主元的比较器 inti,j,k;//计数器 voidmain() { cout<<"请输入线性方程组(ai1,ai2,ai3......ain,yi): "< for(i=0;i { for(intj=0;j cin>>A[i][j]; cin>>B[i]; } for(k=0;k { //选列主元 intindex=k;for(i=k;i { doubletemp=0; for(intm=0;m { temp=temp+A[i][m]*A[m][k]; } S[i]=A[i][k]-temp; if(S[index] { index=i; } }//交换行 doubletemp; for(i=k;i { temp=A[index][i]; A[index][i]=A[k][i]; A[k][i]=temp; } temp=B[index]; B[index]=B[k]; B[k]=temp;//构造L、U矩阵 for(j=k;j { doubletemp=0; for(intm=0;m { temp=temp+A[k][m]*A[m][j]; } A[k][j]=A[k][j]-temp; //先构造U一行的向量 } for(i=k+1;i { doubletemp=0; for(intm=0;m { temp=temp+A[i][m]*A[m][k]; } A[i][k]=(A[i][k]-temp)/A[k][k]; //再构造L一列的向量 } } //求解LY=B Y[0]=B[0]; for(i=1;i { doubletemp=0; for(intj=0;j { temp=temp+A[i][j]*Y[j]; }a Y[i]=B[i]-temp; }//求解UX=Y X[N-1]=Y[N-1]/A[N-1][N-1]; for(i=N-2;i>=0;i--) { doubletemp=0; for(intj=i+1;j { temp=temp+A[i][j]*X[j]; } X[i]=(Y[i]-temp)/A[i][i]; }//打印X cout<<"线性方程组的解(X1,X2,X3......Xn)为: "< for(i=0;i { cout< } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高斯列主元 消去 0425121523