1、数值分析实验报告之高斯列主消元法一、实验目的:清楚高斯列主元消去法与高斯主元素消去法的区别,以及它提出的必要性;掌握高斯列主元消去法的原理及推导过程,会用其解简单的线性方程组。二、实验内容:用高斯列主元消去法解方程组=三、实验原理:在采用高斯消去法解方程组时,小主元可能产生麻烦,即用其做除数,会导致其他元素数量级的严重增长和舍入误差的扩散,最终使得计算的解不可靠。故应避免采用绝对值小的主元素。在消元之前,选择一个绝对值最大的元素作为主元,用其做除数来进行消元,这样就具有较好的数值稳定性。这就是选主元消去法。下面详细说明列主元素消去法。 第一步:在Ax=b即的系数矩阵的第一列元素中选择一个绝对值
2、最大的元素,不妨设为。对调和及和(j=1,2,n,1ln)。以作为新的进行消元(消去对调后的第2n个方程中的)。 第k步:(1kn-1) 设第k-1步消元过程完成,得到,检查中第k列的后n-k+1个元素,从中选出绝对值最大者,不妨设是,称它为第k列主元素。若p=k,则取做除数直接进行消元。若pk,则将第p个方程与第k个方程对调,使成为新的,然后以其作为除数进行消元,继续这一过程,直至得到等价的三角形方程组,下一阶段的回代过程不变。四、 程序流程图:输入系数矩阵a,常数项b及ndet1k=0调用选列主元子程序i=k+1/(乘数 ) j=k+1jnindetdetkn-1/(求)i=n-2S10j
3、i+1j=0detdet。输出b及det结束开始否k+是是否i+是否j+否是j+是否i-回代过程消元过程选列主元的子程序流程图:有主程序转来d,pki=k+1|aik|d|daik, piind=0P=kj=ktapj apjakj akjtjntbp bpbk bktdet-det返回主程序是否选列主元否输出失败,det=0结束是否返回主程序是否j+i+五、程序代码#includestdio.h#includemath.h#define n 3void ChooseMain(double ann,double bn,int k,double *det) /选列主元int p=k;doubl
4、e d=akk,t;for(int i=k+1;ifabs(d)d=aik;p=i;if(d=0)det=0;printf(|a|=0n);elseif(p=k) return;elsefor(int j=k;jn;j+) /交换t=apj;apj=akj;akj=t;t=bp;bp=bk;bk=t;(*det)=-(*det);void Disp(double ann,double bn,double det)Double m;for(int k=0;kn-1;k+)ChooseMain(a,b,k,&det);/选主元for(int i=k+1;in;i+)m=aik/akk;/求乘数ai
5、k=m;for(int j=k+1;jn;j+)aij=aij-m*akj;bi=bi-aik*bk;det=akk*det;printf(-高斯列主消元法-n);printf(消元后,得到的上三角阵和b为:n-n);printf(aij bin);for(int i=0;in;i+)/输出for(int j=0;jn;j+)if(i=0;i-)double s=0;for(int j=i+1;jn;j+)s=s+aij*bj;bi=(bi-s)/aii;/求出xidet=an-1n-1*det;printf(-n);printf(方程组的解为:n x1 x2 x3n);for(i=0;in;i+)printf( %.4f,bi);printf(n-n);printf(行列式的值为: det=%.4fn,det);void main()double a33=0.001,2.000,3.000,-1.000,3.712,4.623,-2.000,1.072,5.643;double b3=1.000,2.000,3.000,det=1;Disp(a,b,det);六、程序结果七、实验总结 高斯列主元消去法在求解方程组时,避免了小主元对计算结果的影响,虽然花费了更多的机器时间,但这样使得求解得到的结果更加的准确。