
#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
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)