Gauss消元模板
阿新 • • 發佈:2018-12-03
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; } //-----------------------------------------------------------------------------------