1. 程式人生 > >高斯消元模板

高斯消元模板

solution efi ret return space span 博客 () 高斯消元

詳解參照其他博客,簡單模板如下

 1 /*處理出的倒三角是這個形狀的
 2 x1 x2 x3=..
 3    x2 x3=..
 4       x3=..
 5 */
 6 #include<bits/stdc++.h>
 7 #define N 205
 8 using namespace std;
 9 const double eps=1e-8;
10 int n;
11 double a[N][N],del;
12 bool gauss(){
13     for(int i=1;i<=n;i++){//處理第i列,行也處理到i 
14         int k=i;//i:當前處理的列 和 行 
15 for(int j=i+1;j<=n;j++)if(fabs(a[j][i])>fabs(a[k][i]))k=j;//找到i列最大的系數在的行 16 if(fabs(del=a[k][i])<eps)return 0;//最大數的行都為0,無解或多解 del:i列最大系數 17 for(int j=i;j<=n+1;j++)swap(a[i][j],a[k][j]);//交換兩行,將大的換到上面去,底下開始消元 18 for(int j=i;j<=n+1;j++)a[i][j]/=del;//最大系數化為 1
19 for(k=1;k<=n;k++)if(k!=i){ 20 del=a[k][i]; 21 for(int j=i;j<=n+1;j++)a[k][j]-=a[i][j]*del;//也可看做a[k][j]=a[k][j]/del-a[i][j] 22 //即把a[k][i]也系數化為1,再減去i行,顯然k的第i列變成0了,即達到了消元的目的 23 } 24 } 25 return 1; 26 } 27 int main(){ 28 scanf("%d",&n);
29 for(int i=1;i<=n;i++) 30 for(int j=1;j<=n+1;j++) 31 scanf("%lf",&a[i][j]); 32 bool flag=gauss(); 33 if(!flag) puts("No Solution"); 34 else 35 { 36 for(int i=1;i<=n;i++) 37 printf("%.2lf\n",a[i][n+1]); 38 } 39 return 0; 40 }

高斯消元模板