求助 列主元高斯消去法解线性方程组
求助,C语言环境,列主元高斯消去法解线性方程组。我已经打好了大部分代码,但是这个代码运行起来只能计算整数,不能计算小数。
求高手帮忙,怎么改为可以计算小数、整数的代码,谢谢
(p.s 尝试过修改数据类型,结果疯狂报错……新手也是醉了)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int jueduizhizuida(int a,int M,double *A)
{
int i=0,j=0;
double max=0.0;
for(i=a;i<M;i++)
{
if(fabs(A[i*(M+1)+a])>max)
{
j=i;
max=fabs(A[i*(M+1)+a]);
}
}
return j;
}
void jiaohuanlianghang(int a,int j,double *A,int M)
{
int i=0;
double B=0.0;
for(i=0;i<M+1;i++)
{
B=A[a*(M+1)+i];
A[a*(M+1)+i]=A[j*(M+1)+i];
A[j*(M+1)+i]=B;
}
}
void shangsanjiao(double *A,int M)
{
int p=0,k=0,q=0,j=0,i;
double m=0.0,det;
for(p=0;p<M-1;p++)
{
j=jueduizhizuida(p,M,A);
jiaohuanlianghang(p,j,A,M);
if(A[p*(M+1)+p]==0)
{
printf("矩阵是一个奇异矩阵,没有唯一解!");
break;
}
for(k=p+1;k<M;k++)
{
m=A[k*(M+1)+p]/A[p*(M+1)+p];
for(q=p;q<M+1;q++)
A[k*(M+1)+q]=A[k*(M+1)+q]-m*A[p*(M+1)+q];
}
}
printf("\n增广矩阵高斯列主元消去后的矩阵如下:\n");
for(j=0;j<M;j++)
{
for(i=0;i<(M+1);i++)
printf("%lf\t",A[i+j*(M+1)]);
printf("\n");
}
det=1;
for(i=0;i<M;i++)
det=det*A[i*(M+2)];
printf("det(A)=%lf",det);
}
double* huidai(double *A,int M)
{
double* X=NULL,temp=0.0;
int k=0,i=0;
X=(double*)malloc(M*sizeof(double));
X[M-1]=A[(M-1)*(M+1)+M]/A[(M-1)*(M+1)+M-1];
for(k=M-2;k>=0;k--)
{
temp=0.0;
for(i=k+1;i<M;i++)
temp=temp+A[k*(M+1)+i]*X;
X[k]=(A[k*(M+1)+M]-temp)/A[k*(M+1)+k];
}
return X;
}
int main()
{
int M=0,i=0,j;
double *A=NULL,*X=NULL;
printf("用列主消去法求解方程组\n");
printf("\n请输入待求解方程组的增广矩阵的行数:\t");
scanf("%d",&M);
if(M>256||M<=0)
{
printf("输入的数字不再范围之内");
printf("\n");
return 0;
}
else
{
A=(double*)calloc(M*(M+1),sizeof(double));
printf("请输入待求解方程组的增广矩阵(%d行 %d列):\n",M,M+1);
for(j=0;j<M;j++)
{
printf("请输入第%d行元素: ",j+1);
for(i=0;i<(M+1);i++)
scanf("%lf",&A[i+j*(M+1)]);
}
printf("\n");
printf("方程的增广矩阵如下:\n");
for(j=0;j<M;j++)
{
for(i=0;i<(M+1);i++)
printf("%lf\t",A[i+j*(M+1)]);
printf("\n");
}
shangsanjiao(A,M);
X=huidai(A,M);
printf("\n方程组的解为:\n");
for(i=0;i<M;i++)
printf("X(%d)=\t%lf\n",i+1,X);
}
free(A);
free(X);
exit(0);
}