高斯消去法是消去法的一种特殊形式,它包括消元和回带两个过程。
高斯消去法求解线性方程组分为以下两大步:
1、将系数矩阵A经过一系列的初等行变换编程右上三角矩阵,其常数向量B也同时做相应的变换,即:
在变换过程中,采用原地工作,即经变换后的元素仍存放在原来的存储单元中。
为了实现上述目标,对于k从1到N-1作以下2步
(1):归一化
这一步的作用是将主对角线上的元素变为1,为此,第k行上的所用元素a[k][j](j=k+1,...N)与常数向量b[k]都要除以a[k][k].但由于变换后的元素仍存放在原来的存储单元中,因此,为了不影响第k行其他元素的变换(都要除以a[k][k])一开始没有将
a[k][k]变为1,并且最后也没有真正将a[k][k]变为1,因为a[k][k]是否真正变为1已经无关紧要了,只要在以后得变换中将a[k][k]认为是1就可以了.
(2):消元
将第k列中主对角线以下的元素消成0,为此,第i(i=k+1,...N)行的其他元素a[i][j](j=k+1,...N)与常数向量B中的元素b[i]都要减去第k行对应元素的a[i][k]倍.同样由于变换后的元素仍然在原先的位置上,因此,为了不影响第i行上其他元素的变换,一开始并没有将a[i][k]变为0,并且最后也没有真正将a[i][k]变为0,因为a[i][k]是否真正变为1已经无关紧要了,以后得变换中已经用不到这个元素了.
回带求解:
首先从最后一个方程中解出x[n],x[n]=b[n]/a[n][n];
然后依次回带,逐个解出x[n-1],...x2,x1
算法实现:
//列选主元高斯消去法求解线性方程组 //a:线性方程组的增广矩阵 //N:N阶线性方程组 //result:方程组的解 bool LinearEquations(double *a,int N,double *result) { double maxValue; int nPos=0; for(int k=0;k<N-1;k++) { maxValue=abs(a[k*(N+1)+k]); nPos=k; for(int i=k+1;i<N;i++) { //寻找每一列中的最大值所在的行 if(abs(a[i*(N+1)+k])>maxValue) { maxValue=abs(a[i*(N+1)+k]); nPos=i; } } if(maxValue!=0) { if(nPos!=k) { //交换第nPos行与第k行的元素 for(int l=0;l<N+1;l++) { double tmp=a[nPos*(N+1)+l]; a[nPos*(N+1)+l]=a[k*(N+1)+l]; a[k*(N+1)+l]=tmp; } } } else { printf("方程组无解\n"); return false; } //归一化,消元 for(int i=k+1;i<N;i++) { for(int j=k+1;j<N+1;j++) { a[i*(N+1)+j]-=a[i*(N+1)+k]/a[k*(N+1)+k]*a[k*(N+1)+j]; } } } //回带求解 result[N-1]=a[(N-1)*(N+1)+N]/a[(N-1)*(N+1)+N-1]; for(int k=N-1-1;k>=0;k--) { double tmp=0; for(int j=k+1;j<N;j++) { tmp+=a[k*(N+1)+j]*result[j]; } result[k]=(a[k*(N+1)+N]-tmp)/a[k*(N+1)+k]; } return true; }
高斯-约当消去法是一种无回带过程的求解线性代数方程组的直接解法。这种方法的基本思想是通过一系列的初等行变换,直接将系数矩阵变换成单位矩阵,同样的变换就将常数向量变换成解向量了。这种消元法的基本过程与高斯消去法相同,只是在消元的过程中,不仅将主对角线以下的元素消成0,同时将主对角线以上的元素也消成0,因此,在这种情况下,就不需要回带过程了。