#include<stdio.h> |
#include<math.h> |
#define MAX_N 20 |
main() |
{ |
int i,j,k; |
int n; |
int i_k; //列主元所在行的指标 |
double m; //列主元的值 |
double a,b; //换行时做终结制值 |
double D=1; //行列式的值 |
double A[MAX_N][MAX_N]; |
double B[MAX_N]; |
printf ( "请输入系数矩阵的阶数n:\n" ); |
scanf ( "%d" ,&n); |
printf ( "请输入系数矩阵A:\n" ); |
for (i=0;i<n;i++) |
for (j=0;j<n;j++) |
scanf ( "%lf" ,&A[i][j]); |
printf ( "请输入右端项b:\n" ); |
for (i=0;i<n;i++) |
scanf ( "%lf" ,&B[i]); |
for (k=0;k<n-1;k++) //最后一行就不用选了 |
{ |
m=0; //开始按列选主元 |
i_k=k; |
for (i=k;i<n;i++) |
{ |
if ( fabs (A[i][k])>m) |
{ |
m= fabs (A[i][k]); |
i_k=i; //记录主元所在行的指标 |
} |
} |
if (m==0) |
{ |
printf ( "系数矩阵奇异!\ndetA=0\n" ); |
break ; |
} |
else if (i_k!=k) |
{ |
for (j=k;j<n;j++) //换行 书上的算法这里错了!!! |
{ |
a=A[i_k][j]; |
A[i_k][j]=A[k][j]; |
A[k][j]=a; |
} |
b=B[i_k]; |
B[i_k]=B[k]; |
B[k]=b; |
D=(-1)*D; //换行,行列式变号 |
} |
D=D*A[k][k]; |
for (i=k+1;i<n;i++) //计算乘子 |
{ |
A[i][k]=A[i][k]/A[k][k]; |
} |
for (i=k+1;i<n;i++) //消元 |
{ |
for (j=k+1;j<n;j++) |
{ |
A[i][j]=A[i][j]-A[i][k]*A[k][j]; |
} |
B[i]=B[i]-A[i][k]*B[k]; |
} |
} |
for (i=n-1;i>=0;i--) //回代;临时用b来存储这里的和 |
{ |
b=0; |
for (j=i+1;j<n;j++) |
{b+=A[i][j]*B[j];} |
B[i]=(B[i]-b)/A[i][i]; |
} |
D=D*A[n-1][n-1]; //在k进行循环的时候只循环到n-2(也可以在上面让k循环到n-1) |
printf ( "系数矩阵行列式的值为%lf。\n" ,D); |
printf ( "解为x_i=\n" ); |
for (i=0;i<n;i++) |
printf ( "%lf\n" ,B[i]); |
return 0; |
} |