#include <stdio.h>
#include <iostream.h>
#include <math.h>
//列主元消元法求解线性方程组
int gs1(int n,float a[],float b[],float x[])
{
int i,j,k,r;
int temp; //交换数据时的临时变量
double *s;
double ar; //a[P[r]][k]
int *P;
double ax;
s=new double[n];
P=new int[n];
for(i=0;i<n;i++)
P=i;
for(k=0;k<n-1;k++)
{
ar=fabs(a[P[k]*n+k]);
r=k;
for(i=k+1;i<n;i++)
if(fabs(a[P*n+k])>ar)
{
ar=fabs(a[i*n+k]);
r=i;
}
if(a[P[r]*n+k]==0)
return(-1); //消元错误 奇异
if(k!=r)
{
temp=P[k];
P[k]=P[r];
P[r]=temp;
}
for(i=k+1;i<n;i++)
{
a[P*n+k]=-a[P*n+k]/a[P[k]*n+k];
for(j=k+1;j<n;j++)
a[P*n+j]+=a[P*n+k]*a[P[k]*n+j];
b[P]+=a[P*n+k]*b[P[k]];
}
}
x[n-1]=b[P[n-1]]/a[P[n-1]*n+n-1];
for(i=n-2;i>=0;i--)
{
ax=0;
for(j=i+1;j<n;j++)
ax+=a[P*n+j]*x[j];
x=(b[P]-ax)/a[P*n+i];
}
delete[]P;
delete[]s;
return 0;
}
//求矩阵乘积
int mul(int m,int n,float A[],float B[],float C[],float D[])
{
int i,j,k;
float temp;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
temp=0;
for(k=0;k<m;k++)
temp+=A[k*n+i]*A[k*n+j];
C[i*n+j]=temp;
}
for(i=0;i<n;i++)
{
temp=0;
for(k=0;k<m;k++)
temp+=A[k*n+i]*B[k];
D=temp;
}
return 0;
}
void main()
{
float *amn,*bm;
FILE *fp;
int m,n;
int i,j,rtn;
float *a,*b;
float *x;
if((fp=fopen("data.txt","r"))==NULL)
{
cout<<"无法打开数据文件!"<<endl;
exit(0);
}
fscanf(fp,"%d%d",&m,&n);
a=new float[m*m]; //a[i*n+j] 表示a[j] a+i*n+j 表示地址
b=new float[n];
x=new float[n];
amn=new float[m*n];
bm=new float[m];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
fscanf(fp,"%f",amn+i*n+j);
for(i=0;i<m;i++)
fscanf(fp,"%f",bm+i);
fclose(fp);
rtn=mul(m,n,amn,bm,a,b);
rtn=gs1(n,a,b,x);
if((fp=fopen("result.txt","w"))==NULL)
{
cout<<"无法打开输出数据文件"<<endl;
exit(1);
}
switch(rtn)
{
case 0:
fprintf(fp,"方程组的解为/n",n);
for(i=0;i<n;i++)
fprintf(fp,"x%d=%g/t",i+1,x);
break;
case -1:
fprintf(fp,"列主元消元法失败");
}
fclose(fp);
delete[]a;
delete[]b;
delete[]x;
delete[]amn;
delete[]bm;
}