比如
2 3 4
3 4 5
也就是2x+3y=4;3x+4y=5 求解 当然要算得没这么简单 比如求一个含10个未知数的行列式怎么算 只要有个大体的设计思路就行了
这是在Visual C++6.0环境下编写的,如果要在Turbo C中运行,可要自己多改几下,否则会不知道如何用哦! #include<stdio.h> #include<math.h>
#define N 100 #define TOTEL 1e-6
void main( ) { int i,j,k,n; double a[N][N],sum,t;
printf("请输入系数矩阵的阶数:"); scanf("%d",&n);
printf("请输入增广矩阵:\n"); for(i=0;i<n;i++) for(j=0;j<n+1;j++) scanf("%lf",&a[i][j]);
for(k=0;k<n-1;k++) {
for(i=k+1;i<n;i++) if(fabs(a[i][k])>fabs(a[k][k])) // 使得a[k][k]为a[i][k](k<=i<n)中绝对值最大的那个,为此也要调换行的顺序 for(j=0;j<n+1;j++) { t=a[k][j]; a[k][j]=a[i][j]; a[i][j]=t; }
if(fabs(a[k][k])<TOTEL) { printf("对不起,在消去过程中的第%d步因a[%d][%d]足够小而推出!\n",k+1,k,k); return; }
for(i=k+1;i<n;i++) { a[i][k]=a[i][k]/a[k][k]; // a[k][k]...a[k][j] for(j=k+1;j<n+1;j++) // a[i][k]...a[i][j] a[i][j]-=a[i][k]*a[k][j]; } }
if(fabs(a[n-1][n-1])<TOTEL) { printf("对不起,在消去过程中的第%d步因a[%d][%d]足够小而推出!\n",n,n-1,n-1); return; } // 最后一步的主对角线上之元亦不能足够小
a[n-1][n]/=a[n-1][n-1]; //x[n]; for(k=n-2;k>=0;k--) // a[k][k]*x[k]+a[k][k+1]*x[k+1]+...+a[k][n-1]*x[n-1]=a[k][n]通过递推而求 { sum=0; for(j=k+1;j<n;j++) sum+=a[k][j]*a[j][n]; a[k][n]=(a[k][n]-sum)/a[k][k]; // 用a[k][n]表示第k个未知数的值 }
printf("通过列主元Gauss消元法解得:\n"); for(k=0;k<n;k++) printf("x[%d]=%lf\n",k+1,a[k][n]);
}
编译运行如下: 请输入系数矩阵的阶数:5 请输入增广矩阵: 1 4 3 5 2 2 4 2 3 5 2 4 4 3 5 2 3 3 8 4 3 8 2 5 5 2 3 45 3 6 通过列主元Gauss消元法解得: x[1]=0.539130 x[2]=-0.191304 x[3]=-6.681159 x[4]=-0.257971 x[5]=11.779710 Press any key to continue