列主元素消去法求解方程组.doc
《列主元素消去法求解方程组.doc》由会员分享,可在线阅读,更多相关《列主元素消去法求解方程组.doc(8页珍藏版)》请在冰点文库上搜索。
列主元素消去法求解方程组
[摘要]在自然科学和工程中有很多问题的解决归结为求解线性方程组或者非线性方程组的数学问题。
例如,电学中的网络问题,用最小二乘法求实验数据的曲线拟合问题,三次样条的插值问题等等。
求解线性方程组的直接法主要有选主元高斯消去法、平方根法、追赶法等。
列主元素消去法既是选主元高斯消去法的一种,也是实际计算中常用的部分选主元消去法。
本文即是讨论利用列主元素消去法求解线性方程组问题。
[关键词]按列选主元交换消元回代
一列主元素消去法背景
在科学研究和工程技术中有许多问题可归结为求解线性代数方程组,其中所产生的线性方程组,其系数矩阵大致可分为两种:
一种是低阶稠密矩阵;另一类是大型稀疏矩阵(此类矩阵阶数高,但零元素较多)。
对于这两种矩阵,我们可以把线性代数方程组的数值解法大致的分为两类:
直接法和迭代法。
迭代法一般用来求解大型稀疏矩阵方程组(本文不予讨论);直接法是目前计算机上解低阶稠密矩阵的有效方法,如果计算过程中没有舍入误差,则此种方法通过有限步四则运算可求的方程组的精确解,但实际计算中由于舍入误差的存在和影响,这种方法也只能求得方程组的近似解。
直接法主要有选主元素高斯消去法、平方根法、追赶法等。
本文所要讨论的列主元素消去法就是选主元素高斯消去法中的一种。
高斯消去法是一个古老的求解线性方程组的方法,也是解线性方程组问题中较为常见的一种数值方法。
但在采取高斯消去法解方程组时,当采用绝对值很小的主元素时,可能导致计算结果的失败,故在消去法中应避免采用绝对值很小的主元素。
对于一般的线性方程组,需要引进选主元的技巧,即在高斯消去法的每一步应该在系数矩阵或消元后的低价矩阵中选取绝对值最大的元素作为主元素,保持乘数,以便减少计算过程中舍入误差对计算解的影响。
选主元素消元法则是对高斯消去法的改进,是解低价稠密矩阵方程组的有效方法。
选主元素消元法则避免了采用绝对值很小的主元素。
选主元素消去法主要有完全主元素消去法与列主元素消去法两种。
完全主元素消去法即是每次按行列选取绝对值最大的元素作为主元素,进行行列交换,之后再完成消元计算。
在完全主元素消去法计算过程中舍入误差能得到有效的控制,对计算的影响较小,具有更好的数值稳定性。
列主元素消去法则是对完全主元素消去法的又一次改进。
列主元素消去法在完全主元素消去法的基础上减少了在选主元素时所要花费的一定的计算时间。
此论文将介绍列主元消去法的基本思想和原理。
二列主元素消去法的理论基础
设有线性方程组
其中,为非奇异矩阵。
方程组的增广矩阵为
首先在的第1列选取绝对值最大的元素作为主元素,即选择
然后交换的第1行与第行(交换后增广矩阵为简单起见仍记为,其元素仍记为)。
经过第1次消元计算得到与原方程组等价的方程组
其中
上述过程可记为
重复上述计算过程,现假设已完成第步的选主元素过程,交换两行并进行消元计
此时约化为
其中的元素仍记为,的元素仍记为.
第步选主元素(在右下角方阵的第1列内选),即确定,使
交换第行与行的元素,再进行消元计算,最后将原线性方程组化为
回代可求解得
算法描述:
对于做到(4)。
(1)按列选主元,即确定使
(2)如果,则为奇异矩阵,停止计算。
(3)如果,则交换第行与第行元素。
(4)消元计算:
(5)回代计算:
三通过计算机利用列主元素消去法求解线性方程组
计算机在科学和工程设计中应用日益广泛。
把科学和工程设计中的具体问题抽象为数学问题,建立起能描述并等价代替该实际问题的数学问题,编制出计算机程序,就能够使得复杂问题得到妥善的解决。
下面及描述列主元消去法的程序过程。
对于已给定的,其程序框图如下:
输入n,,,
按列选主元
否
换行
否
消元计算
是
是
输出
停机
回代求解
(当)
输出计算解及行列式值
及det
停机
(注:
为矩阵的行数;为输入的一精度,用于判断的行列式是否约等于0)
例求下面解方程组
利用列主元素消去法求解此方程组的程序见附件1,其结果如下图:
利用完全主元素消去法求解此方程组的程序见附件2,其结果如下图:
容易看出此方程组的精确解,由上面两图可看出列主元素消去法与完全主元素消去法的结果都接近于精确解。
二种方法的精度差不多。
四总结
列主元素消去法的提出有效的控制了舍入误差的扩散,且相对于完全主元素消去法,其选主元素比较方便。
,利用列主元素消去法解线性方程组时仅需要选出每列中绝对值最大的元素,计算量为,利用完全主元素消去法时则需要按行列选取绝对值最大的元素,其计算量为。
可看出列主元素消去法比完全主元素消去法减少了计算时间。
总之,列主元素消去法是解低阶稠密矩阵的有效方法。
从上面的例题可看出,利用计算机来求解方程组大大的减少了计算时间。
当然,利用计算机来解决工程实际和科学技术中的复杂问题,也是21世纪现代化的要求。
把建立好的数学模型用计算机描述出来,这不仅使问题变得简单化,还大大的缩减了计算所需的时间,体现了数学与计算机的紧密结合。
在以后的工作生活中我们要学会善于利用计算机与数学的关系,把复杂的问题简单化,减少计算时间,提高工作的效率。
列主元消去法只是求解线性方程组的一种方法,但由于篇幅的限制,对于解决线性方程组的其他方法就不一一叙述了。
[参考文献]
[1]BurdenRL,FairesJD,ReynoldsAC.NumericalAnalysis.AlpinePress,1981
[2]易大义,沈云宝,李有法编.计算方法.杭州:
浙江大学出版社,2002
[3]易大义,陈道琦编.数值分析引论.杭州:
浙江大学出版社,1998
[4]李庆阳,王能超,易大义编.数值分析(第四版).北京:
清华大学出版社,施普林格出版社,2001
[5]冯康等编.数值计算方法.北京:
国防工业出版社,1978
TheMainElementsOfTheColumnEliminationForSolvingEquations
[Abstract]Inthenaturalsciencesandengineering,therearemanyproblemsboileddowntosolvinglinearequationsornonlinearequationsofmathematicalproblems.Suchas,theproblemsofnetworkintheelectricity,thecurvefittingfiguringouttheexperimentaldatawiththeleastsquaremethod,computingofcubicsplineinterpolation,etc.ThedirectmethodstosolvethelinearequationsarePivotingGaussianEliminationMethod,SquareRootMethod,CatchingMethod,etc.ThemainelementsofthecolumneliminationbelongstoPivotingGaussianEliminationMethod,andalsoisusedcommonlyinthecalculationoftheactualpivotingelimination.Thisarticleisdiscussingtheuseofthemainelementsofthecolumneliminationinsolvinglinearequationsproblems.
[KeyWords]Bycolumnpivoting,Exchange,Elimination,Backsubstitution
附件1:
#include
#include
voidmain()
{intn=7,k,j,p,i;floatE,det=1.0,m,z;
floatb[7]={7,8,10,13,17,22,28},c0,temp;
floatA[7][7]={{1,1,1,1,1,1,1},{2,1,1,1,1,1,1},{3,2,1,1,1,1,1},{4,3,2,1,1,1,1},{5,4,3,2,1,1,1},{6,5,4,3,2,1,1},{7,6,5,4,3,2,1}};
printf("输入E的值:
");scanf("%f",&E);
for(k=0;k{c0=A[k][k];
for(i=k;i<7;i++)
if(A[i][k]>c0){c0=A[i][k];p=i;}
if(fabs(c0)else
{if(p!
=k){
for(j=0;j<7;j++){
temp=A[p][j];A[p][j]=A[k][j];A[k][j]=temp;}
temp=b[p];b[p]=b[k];b[k]=temp;
det=-det;}
for(i=k+1;i<7;i++)
{m=A[i][k]/A[k][k];
for(j=k;j<7;j++)A[i][j]=A[i][j]-m*A[k][j];
b[i]=b[i]-m*b[k];
}
det=A[k][k]*det;
}
}
c0=A[5][5];
for(i=5;i<7;i++)
if(A[i][5]>c0){c0=A[i][5];p=i;}
if(p!
=5)
{for(j=0;j<7;j++)
{temp=A[p][j];A[p][j]=A[5][j];A[5][j]=temp;}
temp=b[p];b[p]=b[5];b[5]=temp;
det=-det;
}
if(A[6][6]!
=0)b[6]=b[6]/A[6][6];
for(i=n-2;i>=0;i--)
{z=0;for(j=i+1;jb[i]=(b[i]-z)/A[i][i];
}
det=A[6][6]*det; printf("输出的x值:
\n");
for(i=0;i<7;i++)printf("x(%d)=%f\n",i+1,b[i]);
}
附件2
#include
#include
voidmain()
{intn=7,k,j,p,i,l;floatE,det=1.0,m,z;
floatb[7]={7,8,10,13,17,22,28},c0,temp;
floatA[7][7]={{1,1,1,1,1,1,1},{2,1,1,1,1,1,1},{3,2,1,1,1,1,1},{4,3,2,1,1,1,1},{5,4,3,2,1,1,1},
{6,5,4,3,2,1,1},{7,6,5,4,3,2,1}};
printf("输入E的值:
");
scanf("%f",&E);
for(k=0;k{c0=A[k][k];
for(i=k;i<7;i++)
for(j=k;j<7;j++)
if(A[i][j]>c0){c0=A[i][j];p=i;l=j;}
if(fabs(c0)else{if(p!
=k){
for(j=0;j<7;j++){temp=A[p][j];A[p][j]=A[k][j];A[k][j]=temp;}
temp=b[p];b[p]=b[k];b[k]=temp;
det=-det;}
if(l!
=k){
for(j=0;j<7;j++){temp=A[j][l];A[j][l]=A[j][k];A[j][k]=temp;}
}
}
for(i=k+1;i<7;i++)
{m=A[i][k]/A[k][k];
for(j=k;j<7;j++)A[i][j]=A[i][j]-m*A[k][j];
b[i]=b[i]-m*b[k];}
det=A[k][k]*det;
}
c0=A[5][5];
for(i=5;i<7;i++)if(A[i][5]>c0){c0=A[i][5];p=i;}
if(p!
=5)
{for(j=0;j<7;j++){temp=A[p][j];A[p][j]=A[5][j];A[5][j]=temp;}
temp=b[p];b[p]=b[5];b[5]=temp;
det=-det;
}
if(A[6][6]!
=0)b[6]=b[6]/A[6][6];
for(i=n-2;i>=0;i--)
{z=0;
for(j=i+1;jb[i]=(b[i]-z)/A[i][i];}
det=A[6][6]*det;
printf("输出的x值:
\n");
for(i=0;i<7;i++)printf("x(%d)=%f\n",i+1,b[i]);
}
第8页共8页