当前位置:文档之家› 高斯列主元消元法解线性方程组

高斯列主元消元法解线性方程组

高斯列主元消元法解线性方程组
一、题目:用Gauss 列主元消去法解线性方程组Ax b =,其中,
A=17.031 -0.615 -2.991 1.007 -1.006 0.000-1.000 34.211 -1.000 -2.100 0.300 -1.7000.000 0.500 13.000 -0.500 1.000 -1.5004.501 3.110 -3.907 -61.705 12.170 8.9990.101 -8.012 -0.017 -0.910 4.918 0.1001.000 2.000 3.000 4.500 5.000 21.803⎛⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭ 0.230 -52.322 54.000 240.236 29.304 -117.818b ⎛⎫ ⎪ ⎪ ⎪= ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭
T X=(0.907099 -1.961798 3.293738 -4.500708 3.029344 -5.255068)
二、原理及步骤分析

n
n ij R a A ⨯∈=][)1(,n
n R
b b b b ∈=],,,[)1()2(2)1(1 。

若约化主元素
),,2,1(0)(n k a k kk =≠,则通过高斯消元法将方程b AX =约化为三角形方程组求解。

如果在消元过程中发现某个约化主元0)
(=k kk a , 则第K 次消元就无法进行。

此外,即
使所有约化主元全不为零,虽然可以完成方程组的求解,但也无法保证结果的可靠性,因为计算过程中存在舍入误差。

为减少计算过程中的舍入误差对解的影响,在每次消元前,应先选择绝对值尽可能大的元作为约元的主元,如果在子块的第一列中选取主元,则相应方法称为列主元消元法。

相应过程为:
(1)选主元:在子块的第一列中选择一个元)
(k k i k a 使)
(max k ik n
i k k
k i a a k ≤≤=
并将第k 行元与第k i 行元互换。

(2)消元计算:对k=1,2,……n-1依次计算
()()()⎪⎪
⎪⎩
⎪⎪⎪⎨⎧++=-=++=-=++==++n k k i b m b b n k k j i a m a a n k k i a a m k k ik k i k i k kj
ik k ij k ij k kk
k ik
k ik ,,2,1,,2,1,,,2,1)
()()1()
()()1()()
()( (3)回代求解
⎪⎪⎪⎩
⎪⎪⎪⎨⎧⎪⎪⎭⎫ ⎝⎛-==∑+=)
(1)
()()()
(i ii n i j j i ij i i
i n nn
n n
n a x a b x a b x
()1,,2,1 --=n n i
三. 流程图
四、源程序
高斯列主元消元法程序
#include<>
#include<>
#define N 6
main()
{
float A[N][N+1]={{,,,,,,},{,,,,,,},{,,,,,,},{,,,,,,},{,,,,,,},{,,,,,,}}, total,x[6];
int i,j,k,m,n;
printf("方程的增广矩阵:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N+1;j++)
printf(" % ",A[i][j]);
printf("\n");
}
for(j=0;j<N-1;j++) /*di j bu xiao yuan */
{
k=j; /*最大行号赋给k*/
for(i=j+1;i<N;i++)
{
if(fabs(A[i][j])>fabs(A[k][j]))
k=i;
}
if(k==j)
for(i=j+1;i<N;i++)
for(m=j+1;m<N+1;m++)
{
A[i][m]=A[i][m]-A[j][m]*A[i][j]/A[j][j]; }
else
{
for(n=0;n<N+1;n++)
{
A[N][n]=A[k][n]; /*换行 */
A[k][n]=A[j][n];
A[j][n]=A[N][n];
}
for(i=j+1;i<N;i++)
for(m=j+1;m<N+1;m++)
{
A[i][m]=A[i][m]-A[j][m]*A[i][j]/A[j][j]; }
}
}
printf("消元後的结果:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N+1;j++)
printf(" % ",A[i][j]); printf("\n");
}
x[N-1]=A[N-1][N]/A[N-1][N-1]; for(i=N-2;i>=0;i--)
{
total=A[i][N];
for(j=N-1;j>i;j--)
total=total-x[j]*A[i][j];
x[i]=total/A[i][i];
}
printf("方程的解:\n");
for(i=0;i<N;i++)
printf("x1=%f\n",x[i]);
}
五、结果显示
六、结果分析:
消元必须从主元的下一行下一列开始,否则,不会得到正确结果。

从结果运行情况看,消元后不会得到三角阵,但回带求解时,程序只关心上三角阵,不会影响最终计算结果。

若从主元这一列开始,消元后会得到一个三角阵,但该三角阵并不准确。

由不准确的三角阵到的结果也不正确。

相关主题