用C程序接线性代数方程组(全主元消去法)
发布网友
发布时间:2022-05-25 18:31
我来回答
共1个回答
热心网友
时间:2024-06-04 04:04
#include <stdio.h>
#include <math.h>
#define N 3/*方程阶数*/
void myprintf(double a[][N],double *b);/*打印运算矩阵a,b*/
void hdai(double a[][N],double *b);/*回代求解*/
void lzyxq(double a[][N],double *b);/*高斯变换*/
void lzy(double a[][N],double *b,int k);/*行变换*/
void main()
{
double a[N][N]={3,2,1,5,6,4,7,8,9};
double b[N]={5,6,7};
lzyxq(a,b);
myprintf(a,b);
hdai(a,b);
}
void myprintf(double a[][N],double *b)
{
int i,j;
printf("a is:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%4.3f ",a[i][j]);
}
printf("\n");
}
printf("b is:\n");
for(i=0;i<N;i++)
{
printf("%4.3f\n",b[i]);
}
}
void lzyxq(double a[][N],double *b)
{
int i,j,k;
double l;
for(k=0;k<N-1;k++)
{
lzy(a,b,k);
for(i=k+1;i<N;i++)
{
l=a[i][k]/a[k][k];
b[i]-=l*b[k];
for(j=k;j<N;j++)
{
a[i][j]-=l*a[k][j];
}
}
}
}
void lzy(double a[][N],double *b,int k)
{
int i,j,l,t;
double tempa,tempb;
t=k;
tempa=a[t][k];
for(i=k+1;i<N;i++)
{
if(fabs(tempa)<fabs(a[i][k]))
{
tempa=a[i][k];
t=i;
}
}
if(t!=k)
{
for(j=0;j<N;j++)
{
tempa=a[k][j];
a[k][j]=a[t][j];
a[t][j]=tempa;
}
tempb=b[k];
b[k]=b[t];
b[t]=tempb;
}
}
void hdai(double a[][N],double *b)
{
double x[N];
int i,j;
double sum;
x[N-1]=b[N-1]/a[N-1][N-1];
for(i=N-2;i>=0;i--)
{
sum=0;
for(j=i+1;j<N;j++)
sum+=a[i][j]*x[j];
x[i]=(b[i]-sum)/a[i][i];
}
printf("resout:\n");
for(i=0;i<N;i++)
{
printf("x[%d]=%4.3f\n",i+1,x[i]);
}
}
--------------------------------------------
以上程序由vc6.0编译通过
N为线性方程组阶数