#include<stdio.h>
#include<math.h>
#include<string.h>
void main(void)
{
float a[4][5]={{100005,100002,100007,100004,1000},{100008,100001,100004,100003,1000},{100004,100003,100005,100002,1000},{100006,100005,100005,100007,1000}};
float x[4];
float s,r,e;
int i,j,k,p,flag=1;
//=================================显示增广矩阵
for(i=0;i<4;i++)
{
for(j=0;j<5;j++)
{ printf("%1f",a[j]);
printf(" ");
}
printf("\n");
}
printf("\n");
//求解四元一次方程组,列主元高斯消元法,
for(k=0;k<4;k++) //进行四次处理
{ p=k;
e=a[k][k]; // 选取主元,将其所在行与当前行交换位置
for(i=k+1;i<4;i++)
{
if(fabs(a[k])>e)
{
e=fabs(a[k]);
p=i;
}
}
for(j=k;j<5;j++)//行交换
{
s=a[k][j];
a[k][j]=a
[j];
a
[j]=s;
}
if(a[k][k]==0)
{
printf("does not run");
flag=0;
break;
}
else
{
for(i=k+1;i<4;i++) //对主元所在的列进行消元
{
r=a[k]/a[k][k];
if(a[k]!=0)
{for(j=k;j<5;j++)
a[j]=a[j]-r*a[k][j];
}
}
}
for(i=0;i<4;i++) //显示 此时矩阵内容
{
for(j=0;j<5;j++)
{ printf("%1f",a[j]);
printf(" ");
}
printf("\n");
}
printf("\n");
}
//================================回代
if(flag)
{
x[3]=a[3][4]/a[3][3];
for(i=2;i>=0;i--)
{
s=a[4];
for(j=i+1;j<4;j++)
s=s-a[j]*x[j];
x=s/a;
}
for(i=0;i<4;i++)
printf("%4.6f\n",x);
}
while(1);
}
//用于单片机时,注意数据类型
用户377235 2013-9-10 20:18
用户377235 2013-9-10 20:13