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; } //-----------------------------------------------------------------------------------