高斯消元


高斯消元

【高斯消元】P3389 【模板】高斯消元法

#include using namespace std; int m,n; double a[1001][1001]; //数组a记录矩阵相关信息 int main() { scanf("%d",&n); for(int i=1; i<=n; i++) { for(int j=1; j<=n+1; j++) { scanf("%lf",&a[i][j]); } } int flag=1; ///flag用来判断该方程是否有解 for(int i=1; i<=n; i++)///利用矩阵的性质,对矩阵进行化简成上三角形,来对矩阵进行求解 { int pos=i; for(int j=i+1; j<=n; j++) { if(fabs(a[j][i])>fabs(a[pos][i]))///fabs来求精度比较高的浮点型数据的绝对值 { pos=j; ///找第i行及以下的矩阵中第i列的元素的绝对值的最大值,pos记录最大值所在的行数 } } if(fabs(a[pos][i])<1e-8)如果找到的最大值小于1e-8,则该方程无解,flag值赋为0 { flag=0; break; } for(int j=1; j<=n+1; j++) { swap(a[pos][j],a[i][j]); ///交换第i行与第pos行所有元素,使得第i行的元素首非零元素为最大 } for(int j=i+1; j<=n; j++) { double k=a[j][i]/a[i][i]; ///第i行以下的元素全部减为0,k为倍数 for(int t=i; t<=n+1; t++)//对第j行的元素进行处理 { a[j][t]-=k*(a[i][t]); } } } if(flag==0) { printf("No Solution\n"); return 0; } for(int i=n; i>=1; i--) { for(int j=i+1; j<=n; j++) { a[i][n+1]-=a[j][n+1]*a[i][j]; ///最后化简成最简形的矩阵,那么a[i][n+1]就是解 } a[i][n+1]/=a[i][i]; } for(int i=1; i<=n; i++) { printf("%.2lf\n",a[i][n+1]); } return 0; }

    推荐阅读