// liner_solver.cpp : 定义控制台应用程序的入口点。 /* complile with gcc n为未知数的个数 A为系数矩阵 a为增广矩阵 算法:采用全选主元方法 测试:修改n、A和b,编译程序观察运行结果。 */ #include <stdio.h> #include <stdlib.h> #include <math.h> #define n 5 int main(int argc, char* argv[]) { double eps =1.0E-6; double A[n][n]={{1,1,-5,-1,1},{8,5,-1,0,4},{3,-7,-5,-1,1},{2,1,8,3,-1},{0,6,2,7,-2}}; double b[n]={9,2,4,-8,15}; double a[n][n+1]={0};/*a is [A|b]*/ int lines[n]={0}; double x[n]={0.0}; double data,xlsum,l; int i_k=0,j_k=0,line; for(int i=0;i<n;i++) { for (int j=0;j<n+1;j++) { if( j !=n) { a[i][j]=A[i][j]; } else { a[i][j]=b[i]; } } } for (int i=0;i<n;i++) lines[i]=i; for (int k=0;k<n-1;k++) { data=0.0; for(int i=k;i<n;i++) { for(int j=k;j<n;j++) { if(fabs(a[i][j] )>data) { i_k=i; j_k=j; data=fabs(a[i][j]); } } } if (data <eps) { printf("matrix is ill/n"); getchar(); exit(-1); } if (i_k !=k) { for(int j=k;j<n+1;j++) { data=a[k][j]; a[k][j]=a[i_k][j]; a[i_k][j]=data; } } if (j_k !=k) { line=lines[k]; lines[k]=j_k; lines[j_k]=line; for(int i=0;i< n;i++) { data=a[i][k]; a[i][k]=a[i][j_k]; a[i][j_k]=data; } } for(int i=k+1;i<n;i++) { l=a[i][k]/a[k][k]; for(int j=k+1;j< n+1;j++) a[i][j]=a[i][j]-l*a[k][j]; } } x[n-1]=a[n-1][n]/a[n-1][n-1]; for(int k=n-2;k>=0;k--) { xlsum=0.0; for(int j=k+1;j<n;j++) xlsum +=a[k][j]*x[j]; x[k]=1/a[k][k]*(a[k][n]-xlsum); } for(int i=0;i<n;i++) { printf("x%d is %lf/n",i+1,x[lines[i]]); } getchar(); return 0; }