
高斯消元
王开岭-nexpose
2023年2月21日发(作者:物业锦旗用语)高斯列主元消元法解线性方程组
一、题目:用Gauss列主元消去法解线性方程组
Axb
,其中,
A=
17.031-0.615-2.9911.007-1.0060.000
-1.00034.211-1.000-2.1000.300-1.700
0.0000.50013.000-0.5001.000-1.500
4.5013.110-3.907-61.70512.1708.999
0.101-8.012-0.017-0.9104.9180.100
1.0002.0003.0004.5005.00021.803
0.230
-52.322
54.000
240.236
29.304
-117.818
b
TX=(0.907099-1.9617983.293738-4.5007083.029344-5.255068)
二、原理及步骤分析
设nn
ijRaA][)1(,n
n
Rbbbb],,,[)1()2(
2
)1(
1
。若约化主元素
),,2,1(0)(nkak
kk
,则通过高斯消元法将方程bAX约化为三角形方程组求解。
如果在消元过程中发现某个约化主元
0)(k
kk
a,则第K次消元就无法进行。此外,即
使所有约化主元全不为零,虽然可以完成方程组的求解,但也无法保证结果的可靠性,
因为计算过程中存在舍入误差。
为减少计算过程中的舍入误差对解的影响,在每次消元前,应先选择绝对值尽可能大的
元作为约元的主元,如果在子块的第一列中选取主元,则相应方法称为列主元消元法。
相应过程为:
(1)选主元:在子块的第一列中选择一个元)(k
ki
k
a使)(maxk
ik
nik
k
ki
aa
k
并将第k行元与第
k
i行元互换。
(2)消元计算:对k=1,2,……n-1依次计算
nkkibmbb
nkkjiamaa
nkki
a
a
m
k
kik
k
i
k
i
k
kjik
k
ij
k
ij
k
kk
k
ik
k
ik
,,2,1
,,2,1,
,,2,1
)()()1(
)()()1(
)(
)(
)(
(3)回代求解
)(
1
)()(
)(
)(
i
ii
n
ij
j
i
ij
i
i
i
n
nn
n
n
n
a
xab
x
a
b
x
1,,2,1nni
三.流程图
5,,2,1k
65
A
消元计算,即
nkkj
nkki
babb
aaaa
a
a
a
kikii
kjikijij
kk
ik
ik
,,2,1
,,2,1
输入矩阵
65
A
选主元,即确定
k
i,使
kk
i
nik
ki
aa
max
交换行,即
kik
kjji
bb
njaa
k
,2,1
回代求解,即
a
b
b
nn
n
n
四、源程序
高斯列主元消元法程序
#include
#include
#defineN6
main()
{
floatA[N][N+1]={{,,,,,,},{,,,,,,},{,,,,,,},{,,,,,,},{,,,,,,},{,,,,,,}},
total,x[6];
inti,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=%fn",x[i]); } 五、结果显示 六、结果分析: 消元必须从主元的下一行下一列开始,否则,不会得到正确结果。从结果运行情况看, 消元后不会得到三角阵,但回带求解时,程序只关心上三角阵,不会影响最终计算结果。若 从主元这一列开始,消元后会得到一个三角阵,但该三角阵并不准确。由不准确的三角阵到 的结果也不正确。