模板整理: 高斯消元


表示不会线性基,只会最最辣鸡的高斯消元(应该够了吧QAQ)
高斯消元只要会手动模拟考场推也是可以的。。
主要想法就是找对角线,一个个往下找,
如果当前这个(i,i)的值非0,就其它行全部消去第i列(把第i列的值都减成0)即可。
最后求解的时候,从下往上(因为是个倒三角)求解即可,
代码写得还是挺明白的。
……还有一种开关灯01啥啥的我似乎还不怎么会。。
还有自由变元,
消完之后有i行都是0,那么就有i个自由变元。。
还有无解,如果出现系数都是0而方程右边不为0,
那么显然无解了。
大概就这么几种。给一道裸题的模板。
例题:bzoj1013
模板:

//n个未知量,系数矩阵是a,n*n的
//b是值的矩阵(方程右边)
//ans[i]存储第i个变量的答案
void gauss(){
    double c[N];
    for (int k=1;k<n;k++){
        for (int i=k+1;i<=n;i++) c[i]=a[i][k]/a[k][k];
        for (int i=k+1;i<=n;i++){
            for (int j=1;j<=n;j++) a[i][j]-=a[k][j]*c[i];
            b[i]-=b[k]*c[i];
        }
    }//消元
    ans[n]=b[n]/a[n][n];
    for (int i=n-1;i;i--){
        double sum=0.0;
        for (int j=i+1;j<=n;j++) sum+=ans[j]*a[i][j];
        ans[i]=(b[i]-sum)/a[i][i];
    }//从下往上求解
}

猜你喜欢

转载自blog.csdn.net/ThinFatty/article/details/78490666