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

 

posted on 2018-12-03 22:25  欣崽  阅读(195)  评论(0编辑  收藏  举报

导航