• 关于高斯消元


    关于高斯消元

    定义

    来自百度百科

    数学上,高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解。但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵。不过,如果有过百万条等式时,这个算法会十分省时。一些极大的方程组通常会用迭代法以及花式消元来解决。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。高斯消元法可以用在电脑中来解决数千条等式及未知数。亦有一些方法特地用来解决一些有特别排列的系数的方程组。

    没啥用

    适用范围

    高斯消元的时间复杂度是O(n3),一般数据范围在100左右。

    高斯消元可用于解多元线性方程组。

    具体方法

    高斯消元可以看作模拟解方程的过程,就像小学生那样,最终要削的每一个未知数只在一个式子里出现,就可以得出其中一项的解,回代得出全部解。

    在一个式子里,用这个式子的x消去其他式子里的x,然后在剩下的两个式子里再选择一个式子里的y,用这个y消去最后剩下的式子里的y。那么现在最后一个方程里就只有一个未知数z了。倘若z的系数是1,那么我们就可以直接得出答案来了。

    (摘自luogu高斯消元模板的题解)

    Code

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath> 
    using namespace std;
    
    const int MAXN = 100 + 5;
    const double eps = 0.00001;
    
    int n;
    double a[MAXN][MAXN];
    double ans[MAXN];
    
    inline void swap_judge(int x) {
        int det = x;
        for(int i = x+1;i <= n;i++) {
            if(abs(a[i][x]) > abs(a[det][x])) det = i;
        }
        if(det == x) return;
        for(int i = x;i <= n+1;i++) {
            swap(a[x][i],a[det][i]);
        }
        return;
    }
    
    inline void Gauss() {
        double tmp;
        for(int i = 1;i <= n;i++) {
            swap_judge(i);
            if(fabs(a[i][i]) <= eps) {
                puts("No Solution");
                exit(0);
            }
            for(int j = i+1;j <= n;j++) {
                if(fabs(a[j][i]) > eps) {
                    tmp = a[i][i] / a[j][i];
                    for(int k = i;k <= n+1;k++) {
                        a[j][k] = a[j][k] * tmp - a[i][k];
                    }
                }
            }
        }
        for(int i = n;i;i--) {
            for(int j = i+1;j <= n;j++) {
                a[i][n+1] -= a[i][j] * a[j][n+1];
            }
            a[i][n+1] /= a[i][i];
        }
        return;
    }
    
    int main() {
        scanf("%d",&n);
        for(int i = 1;i <= n;i++) {
            for(int j = 1;j <= n + 1;j++) {
                scanf("%lf",&a[i][j]);
            }
        }
        Gauss();
        for(int i = 1;i <= n;i++) {
            printf("%.2lf
    ",a[i][n+1]);
        }
        return 0;
    }
  • 相关阅读:
    起步X5 UI模型使用的新的JAVASCRIPT UI库 DHTMLX (简称DHX)
    行车记录仪
    牛客网——华为机试(题9:提取不重复的整数)(Java)
    牛客网——华为机试(题8:合并表记录)(Java)
    牛客网——华为机试(题7:取近似值)(Java)
    牛客网——华为机试(题6:质数因子)(Java)
    牛客网——华为机试(题5:进制转换)(Java)
    牛客网——华为机试(题4:字符串分隔)(Java)
    牛客网——华为机试(题2:计算字符个数)(Java)
    牛客网——华为机试(题1:字符串最后一个单词的长度)(Java)
  • 原文地址:https://www.cnblogs.com/floatiy/p/9810877.html
Copyright © 2020-2023  润新知