✅ 操作成功!

高斯消元法

发布时间:2023-06-06 作者:admin 来源:文学

高斯消元法

高斯消元法

四步触诊法-健康管理师是干什么的

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,1nni

三.流程图

5,,2,1k

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]);

}

五、结果显示

六、结果分析:

消元必须从主元的下一行下一列开始,否则,不会得到正确结果。从结果运行情况看,

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

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

的结果也不正确。

👁️ 阅读量:0