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

  • 格式:doc
  • 大小:117.00 KB
  • 文档页数:5

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

一、题目:用Gauss列主元消去法解线性方程组Axb,其中,

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

TX=(0.907099 -1.961798 3.293738 -4.500708 3.029344 -5.255068)

二、原理及步骤分析

设nnijRaA][)1(,nnRbbbb],,,[)1()2(2)1(1。若约化主元素),,2,1(0)(nkakkk,则通过高斯消元法将方程bAX约化为三角形方程组求解。

如果在消元过程中发现某个约化主元0)(kkka, 则第K次消元就无法进行。此外,即使所有约化主元全不为零,虽然可以完成方程组的求解,但也无法保证结果的可靠性,因为计算过程中存在舍入误差。

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

(1)选主元:在子块的第一列中选择一个元)(kkika使)(maxkiknikkkiaak

并将第k行元与第ki行元互换。

(2)消元计算:对k=1,2,……n-1依次计算

nkkibmbbnkkjiamaankkiaamkkikkikikkjikkijkijkkkkikkik,,2,1,,2,1,,,2,1)()()1()()()1()()()(

(3)回代求解

)(1)()()()(iiinijjiijiiinnnnnnaxabxabx

1,,2,1nni

三. 流程图

5,,2,1k65A

消元计算,即

nkkjnkkibabbaaaaaaakikiikjikijijkkikik,,2,1,,2,1 输入矩阵65A选主元,即确定ki,使

kkinikkiaamax

交换行,即

kikkjjibbnjaak,2,1回代求解,即

1,2,,1niaabbabbiiijbiinnnnj

四、源程序

高斯列主元消元法程序

#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

{

for(j=0;j

printf(" % ",A[i][j]);

printf("\n");

}

for(j=0;j

{

k=j; /*最大行号赋给k*/

for(i=j+1;i

{

if(fabs(A[i][j])>fabs(A[k][j]))

k=i;

}

if(k==j)

for(i=j+1;i

for(m=j+1;m

{

A[i][m]=A[i][m]-A[j][m]*A[i][j]/A[j][j];

}

else

{

for(n=0;n

{

A[N][n]=A[k][n]; /*换行 */

A[k][n]=A[j][n];

A[j][n]=A[N][n];

}

for(i=j+1;i

for(m=j+1;m

{

A[i][m]=A[i][m]-A[j][m]*A[i][j]/A[j][j];

}

}

}

printf("消元後的结果:\n");

for(i=0;i

{

for(j=0;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

printf("x1=%f\n",x[i]);

}

五、结果显示

六、结果分析:

消元必须从主元的下一行下一列开始,否则,不会得到正确结果。从结果运行情况看,消元后不会得到三角阵,但回带求解时,程序只关心上三角阵,不会影响最终计算结果。若从主元这一列开始,消元后会得到一个三角阵,但该三角阵并不准确。由不准确的三角阵到的结果也不正确。

精心搜集整理,只为你的需要