高斯消元板子

struct anss{
    double s[N];
    string st;
};

anss gauss_jordan(int n,double eps,double a[N][N]){
    anss ans;
    ans.st="Yes";
    bool vis[N];
    double tmpmax;
    int maxr;
    for(int i=1;i<=n;i++){
        tmpmax=0;
        maxr=i;
        for(int j=1;j<=n;j++){
            if(!vis[j]&&fabs(a[j][i])>tmpmax){
                tmpmax=fabs(a[j][i]);
                maxr=j;
            }
        }
        if(tmpmax<=eps) continue;
        if(maxr!=i) swap(a[i],a[maxr]);
        vis[i]=true;
        for(int j=1;j<=n;j++){
            if(i!=j){
                double t=a[j][i]/a[i][i];
                for(int k=1;k<=n+1;k++) a[j][k]-=t*a[i][k];
            }
        }
    }

    bool f=false;
    for(int i=1;i<=n;i++){
        if(fabs(a[i][i])<=eps){
            f=true;
            if(fabs(a[i][n+1])>eps){
                ans.st="No Solution";
                return ans;
            }
        }
    }

    if(f){
        ans.st="Many Solutions";
        return ans;
    }

    for(int i=1;i<=n;i++){
        double sol=a[i][n+1]/a[i][i];
        if(fabs(sol)<=eps){
            ans.s[i]=0;
            continue;
        }
        ans.s[i]=sol;
    }

    return ans;
}
posted @ 2021-05-15 20:13  wsy_jim  阅读(56)  评论(0编辑  收藏  举报