您的位置:首页 > 其它

高斯消元解线性方程组

2012-08-01 23:22 309 查看
高斯消去法是消去法的一种特殊形式,它包括消元和回带两个过程。

高斯消去法求解线性方程组分为以下两大步:

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
,x
=b
/a

;

然后依次回带,逐个解出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,因此,在这种情况下,就不需要回带过程了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: