如何用编程实现高斯列主元消去法?

如何用编程实现高斯列主元消去法?,第1张

用C语言编制以下程序:

#include <stdio.h>

#include <math.h>

void main()

{

int i,j,k,ik,n

float max,t,a[10][10],x[10],sum

printf("请输入方程组的阶数:")

scanf("%d",&n)

printf("请输入增广矩阵\n")

for (i=1i<=ni++)

for (j=1j<=n+1j++)

scanf("%f",&a[i][j])

for (k=1k<=n-1k++)

{

max=0.0

for (i=ki<=ni++)

if (max<fabs(a[i][k]))

{

max=fabs(a[i][k])

ik=i

}

if (max==0)

{

printf("A is singular")

break

}

if (ik!=k)

for (j=kj<=n+1j++)

{

t=a[k][j]

a[k][j]=a[ik][j]

a[ik][j]=t

}

for(i=k+1i<=ni++)

{

a[i][k]=a[i][k]/a[k][k]

for (j=k+1j<=n+1j++)

a[i][j]=a[i][j]-a[i][k]*a[k][j]

}

}

if (a[n][n]==0)

printf("A is singular")

else

x[n]=a[n][n+1]/a[n][n]

for (k=n-1k>=1k--)

{

sum=0.0

for (j=k+1j<=nj++)

sum=sum+a[k][j]*x[j]

x[k]=(a[k][n+1]-sum)/a[k][k]

}

for (i=1i<=ni++)

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

}

选列主元素消元法:在高斯消去的消元过程中第k步要求除以akk,为了防止除数为零或除数太小造成的误差过大的问题,在消元开始是先将该列最大元(绝对值)所在行移到消元第一行在除akk,然后消元。

列主元消去法虽然和高斯消去法原理一样,但是列主元消去法可以减小舍入误差,精度比较高,是解决小型稠密矩阵的一个较好的算法。而高斯消去法虽然编程简单,但是计算量大,而且对于两个相近的解时由于舍入误差的存在,使得结果误差很大。

引起其他元素

的数量级及舍人误差急剧增大,导致最终计算结果不可靠。为了避免在高斯消去法应用中可能出现的这类问题,就发展形成了列主元、全主元等多种消去法。

这些方法的基本点在于对高斯消去法的过程作某些技术性修改,全面或局部地选取绝对值最大的元素为主元素,从而构成了相应的主元(素)消去法。列主元(素)消去法以处理简单、相对计算量小的特点,在各类主元消去法中得到最为广泛的应用。

问题出在点除上(3处),如

B(p,:)=B(p,:)-B(k,:)*B(p,k)/B(k,k) 应为 B(p,:)=B(p,:)-B(k,:)*B(p,k)./B(k,k)

x(n) = b(n)/A(n,n) 应为 x(n) = b(n)./A(n,n)

x(k)=x(k)/A(k,k) 应为 x(k)=x(k)./A(k,k)

>>A=[0.729,0.8100,0.90001.000,1.000,1.0001.331,1.210,1.100]

>>b=[0.68670.83381.000]

>>gauss(A,b)

ans =

A^2/2

此方程组有唯一解

x =

0.2245

0.2814

0.3279


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7835077.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-10
下一篇2023-04-10

发表评论

登录后才能评论

评论列表(0条)

    保存