zoukankan      html  css  js  c++  java
  • 高斯消元

    O((n^{3}))
    线性方程组组成n*n的矩阵,而第n+1列是常系数
    高斯消元后第n+1行的值就是答案

    求解线性方程组的方法
    1.构造增广矩阵
    1.初等变换交换行位置
    2.加减消元化成阶梯型
    3.回带化为最简阶梯(对角线都是1)

    模板

    传送门

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn=105;
    const double eps=1e-7;
    int n;
    double a[maxn][maxn];
    bool Gauss(){//返回true表示有解,返回false表示没有解
        int r;
        double f;
        for(int i=0;i<n;i++){//因为是n*n行的矩阵,所以i两个作用
            r=i;
            for(int j=i+1;j<n;j++)//找到第i行下面第j列中最大的那个元素(此时i充当的是一行中的第i个数)
                if(fabs(a[j][i])>fabs(a[r][i])) r=j;
            if(fabs(a[r][i])<eps) return false;//都是0的情况,就是自由项的情况
            
            if(r!=i)//第r行和第i行交换
                for(int j=0;j<=n;j++) swap(a[r][j],a[i][j]);
            
            for(int k=i+1;k<n;k++){//此时i充当的是第i行
                f=a[k][i]/a[i][i];//第k行第一个非零数是第i行的对应的数的几倍
                for(int j=i;j<=n;j++) a[k][j]-=f*a[i][j];//整行都进行乘除
            }
        }
        //此时矩阵是一个阶梯型矩阵
        for(int i=n-1;i>=0;i--){//对n行的矩阵进行操作
            for(int j=i+1;j<n;j++) a[i][n]-=a[j][n]*a[i][j];
            a[i][n]/=a[i][i];//把对角线全部消成1
        }
        return true;
    }
    int main(){
        while(~scanf("%d",&n)){
            for(int i=0;i<n;i++){
                for(int j=0;j<n+1;j++){//n+1行,第n+1行是齐次方程组的常系数
                    scanf("%lf",&a[i][j]);
                }
            }
             if(!Gauss()){
                puts("No Solution");
            }else{
                for(int i=0;i<n;i++) printf("%.2lf
    ",a[i][n]);
            }
        }
        return 0;
    }
    
    

    对自由元的情况

    传送门
    有可能找不到一个(x_{i})系数为非零

  • 相关阅读:
    需求的有序化和方案的系统化
    产品 增长 口碑传播
    私域流量的价值 大悦城微信营销:14万微信会员哪来的
    产品创新阶段关口细则
    业务关键数据指标
    TOB 增长
    医美品零售门店分析
    数据赋能饮品轻食
    [已读]你不知道的JavaScript(上卷)
    [已读]移动web手册
  • 原文地址:https://www.cnblogs.com/Emcikem/p/11619672.html
Copyright © 2011-2022 走看看