【高斯消元】

【高斯消元】

时间复杂度\(O(n^{3})\)

高斯消元解决加法方程组

每次选绝对值最大的系数交换上来,然后消元

主元:系数不为0
自由元:系数为0
自由元之间相互独立,互不影响
主元的值可能会由自由元确定

唯一解:主元系数都不为0,值也不为0

矛盾解、多解
若主元系数为0时,值不为0->矛盾
若主元系数为0时,值为0->多解

流程图解:若该行主元为0,在看后续行的时候也要把该行纳入考虑

表达式冗余,补充变量:\(0x_{n+1}\)
表达式不足,补充表达式:\(0x_i+0x_2+...=0\)

模版题

https://www.luogu.com.cn/problem/P3389

const int N=110;
int n;
const double eps=1e-7;//判0精度
double mat[N][N];
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n+1;j++){
            cin>>mat[i][j];
        }
    }
    //选绝对值最大的系数交换上来
    for(int i=1;i<=n;i++){
        int max=i;
        for(int j=1;j<=n;j++){
            if(j<i && abs(mat[j][j])>=eps){//该行已有主元
                continue;
            }
            if(abs(mat[j][i])>abs(mat[max][i])){
                max=j;
            }
        }
        //把两行进行交换
        for(int k=1;k<=n+1;k++){
            double temp=mat[i][k];
            mat[i][k]=mat[max][k];
            mat[max][k]=temp;
        }
        //如果有找到一个主元
        if(abs(mat[i][i])>=eps){
            double tmp=mat[i][i];
            //把主元系数消成1
            for(int j=i;j<=n+1;j++){
                mat[i][j]/=tmp;
            }
            //操作其他行
            for(int j=1;j<=n;j++){
                if(i!=j){
                    double rate=mat[j][i]/mat[i][i];
                    for(int k=i;k<=n+1;k++){//i前面都变成全0了,所以不用操作
                        mat[j][k]-=mat[i][k]*rate;
                    }
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        if(mat[i][i]==0){
            cout<<"No Solution"<<endl;
            return;
        }
    }
    for(int i=1;i<=n;i++){
        cout<<fixed<<setprecision(2)<<mat[i][n+1]<<endl;
    }
}
posted @ 2026-02-08 16:08  White_ink  阅读(4)  评论(0)    收藏  举报