1. 程式人生 > >Gauss消元模板

Gauss消元模板

const double eps = 1e-15;
//高斯消元模板
//-----------------------------------------------------------------------------------
//把對應得係數矩陣化為對角矩陣,然後直接回代即可
const int maxn=100+5;
const int maxm=100+5;
//a為增廣矩陣,ans為一組特解,n為未知數個數,free_x[i]=false表示該變數為自由變數
double a[maxn][maxm],ans[maxn];
int n;
bool free_x[maxn];
int Gauss(){
    
int res=0,r=0; for(int i=0;i<n;i++) free_x[i]=false; for(int i=0;i<n;++i){ for(int j=r;j<n;++j) //尋找該列中不等於0的元素,然後交換行 if(fabs(a[r][i])>eps) { for(int k=i;k<=n;++k){ swap(a[j][k],a[r][k]); break; } }
if(fabs(a[r][i])<eps) { //該列中元素全為0,自由變元增加一 ++res;continue; } for(int j=0;j<n;++j){//用第r列將該列其他元素全部化為0 if(j!=r&&fabs(a[r][i])>eps){ double tmp=a[j][i]/a[r][i]; for(int k=i;k<=n;++k) a[j][k]-=tmp*a[r][k]; } } free_x[i]
=true;++r; } for(int i=0;i<n;++i) if(free_x[i]) { for(int j=0;j<n;++j) if(fabs(a[j][i])>eps) ans[i]=a[j][n]/a[j][i]; } return res; } //-----------------------------------------------------------------------------------