首页 > 其他分享 >高斯消元

高斯消元

时间:2023-04-07 21:11:11浏览次数:46  
标签:dots 1.00 未知数 cdot 线性方程组 int 高斯消

\(\color{black}高斯消元\)

题意

输入一个包含 \(n\) 个方程 \(n\) 个未知数的线性方程组。

方程组中的系数为实数。

求解这个方程组。

下图为一个包含 \(m\) 个方程 \(n\) 个未知数的线性方程组示例:

\[\left\{\begin{matrix}a_{1,1} \cdot x_1 + a_{1,2} \cdot x_2 + \dots + a_{1, n} \cdot x_n = b_1 \\a_{2,1} \cdot x_1 + a_{2,2} \cdot x_2 + \dots + a_{2, n} \cdot x_n = b_2 \\ \dots \dots \dots \dots \dots \dots \dots \dots \dots \dots \dots \dots\\a_{m,1} \cdot x_1 + a_{m,2} \cdot x_2 + \dots + a_{m, n} \cdot x_n = b_m \end{matrix}\right. \]

输入格式

第一行包含整数 \(n\)。

接下来 \(n\) 行,每行包含 \(n+1\) 个实数,表示一个方程的 \(n\) 个系数以及等号右侧的常数。

输出格式

如果给定线性方程组存在唯一解,则输出共 \(n\) 行,其中第 \(i\) 行输出第 \(i\) 个未知数的解,结果保留两位小数。

如果给定线性方程组存在无数解,则输出 Infinite group solutions

如果给定线性方程组无解,则输出 No solution

样例输入输出

3
1.00 2.00 -1.00 -6.00
2.00 1.00 -3.00 -9.00
-1.00 -1.00 2.00 7.00
1.00
-2.00
3.00

转化

将方程组化成 1 个 \(n \cdot (n+1)\) 的系数矩阵,可以将其执行以下 3 种初等行列变换操作。

  1. 把某一行乘一个非零的数;
  2. 交换某 2 行;
  3. 把某行的若干倍加到另一行上去;

操作后,可以将其消成类似上三角的形式,即:

\[\left\{\begin{matrix}a_{1, 1} \cdot x_1 + a_{1, 2} \cdot x_2 + \dots + a_{1, n} \cdot x_n = b_1 \\a_{2,2} \cdot x_1 + a_{2,3} \cdot x_2 + \dots + a_{2, n} \cdot x_n = b_2 \\ \dots \dots \dots \dots \dots \dots \dots \dots \dots \dots \\a_{n-1, n-1} \cdot x_{n-1} + a_{n-1, n} \cdot x_n = b_{n-1} \\x_n = b_n\end{matrix}\right. \]

无解/有无穷多种解/有唯一解

  • 有唯一解 : 消后是一个完美的阶梯型,即第 \(1\) 行有 \(n\) 个未知数,第 \(2\) 行有 \(n-1\) 个未知数,\(\cdots\cdots\) ,第 \(n\) 行有 \(1\) 个未知数。
  • 无解 : \(0 = 非0\)
  • 有无穷多组解 : \(0 = 0\)

求解

  1. 枚举每一列 \(c\),找到本列绝对值最大的一行.
  2. 将该行换到最上面
  3. 将该行的第 \(1\) 个数变成 \(1\),即将等式两边同时除以这个数
  4. 把第 \(c\) 列除了第 \(1\) 个数全部消成 \(0\)。
  5. 固定第 \(c\) 列,以后的操作将不影响第 \(1\) 到第 \(c\) 列的数值。
  6. 迭代操作结束后,将所有第 \(i\) 列第 \(i\) 行的数值消成 \(1\),再依次求解。

代码

int gauss(){
    int c, r;   // c 是列,r 是行
    
    for(c = r = 0; c<n; c++){   // 枚举每一列
        // 找到 c 列绝对值最大的一行
        int t = r;
        for(int i=r; i<n; i++){
            if(fabs(a[i][c]) > fabs(a[t][c])){
                t = i;
            }
        }
        if(fabs(a[t][c]) < eps){
            continue;
        }
        
        // 交换这两行
        for(int i=c; i<=n; i++){
            swap(a[t][i], a[r][i]);
        }
        
        //将该行的第 1 个数变成 1,即将等式两边同时除以这个数
        for(int i=n; i>=c; i--){
            a[r][i] /= a[r][c];
        }
        
        // 把第 c 列除了第 1 个数全部消成 0
        for(int i=r+1; i<n; i++){
            if(fabs(a[i][c]) > eps){
                for(int j=n; j>=c; j--){
                    a[i][j] -= a[r][j] * a[i][c];
                }
            }
        }
        
        r++;
    }
    
    if(r < n){
        for(int i=r; i<n; i++){
            if(fabs(a[i][n]) > eps){
                return 2;  // 无解
            }
        }
        
        return 1;   // 有无穷多种解
    }
    
    for(int i=n-1; i>=0; i--){
        for(int j=i+1; j<n; j++){
            a[i][n] -= a[i][j] * a[j][n];
        }
    }
    
    return 0;   // 有唯一解
}

标签:dots,1.00,未知数,cdot,线性方程组,int,高斯消
From: https://www.cnblogs.com/2huk/p/17297341.html

相关文章

  • 【模板】高斯消元
    #include<bits/stdc++.h>usingnamespacestd;constdoubleeps=1e-10;doubleuu,a[52][52],b[52];intn,l[52];boolpd;inlinevoidzzd(int&maxx,inti,intcnt){ for(intj=cnt+1;j<=n;++j){//找系数最大值 if(fabs(a[j][i])>fabs(a[maxx][i])) max......
  • 【洛谷】P4457 [BJOI2018]治疗之雨(期望+高斯消元)
    原题链接题意初始时玩家有\(p\)滴血,满血\(n\)滴,每个回合会进行如下操作:若当前还没有满血,则以\(\frac{1}{m+1}\)的概率增加一滴血;\(k\)次判定,每次以\(\frac......
  • 【YBT2023寒假Day3 A】千与千寻(期望DP)(高斯消元)
    千与千寻题目链接:YBT2023寒假Day3A题目大意一个n*m的平面,你要从(0,0)走到(x,y),你等概率的向上或向右走,然后当你走到(n-1,i)再往右走,就是(0,i),走到(i,m-1)再......
  • 高斯消元法
    高斯消元法心情不好,来写博客...思想一种通过消元求解线性方程组的方法,时间复杂度为\(n^3\)和普通的消元法无二,选定一个自变量为主元,将一行的主元系数化为一,再通过乘......
  • 高斯消元
    简述高斯消元法(Gauss-Jordanelimination)是求解线性方程组的经典算法,它在当代数学中有着重要的地位和价值,是线性代数课程教学的重要组成部分。高斯消元法除了用于线性方......
  • C++ 数学与算法系列之高斯消元法求解线性方程组
    1.前言什么是消元法?消元法是指将多个方程式组成的方程组中的若干个变量通过有限次地变换,消去方程式中的变量,通过简化方程式,从而获取结果的一种解题方法。消元法主要有代......
  • 数值分析·学习 | 解线性方程组的直接方法(高斯消去法以及LU求解)matlab实现
    ​ 目录一、前言:二、算法描述:三、实现代码:1、高斯消去法:2、高斯消去法-列主元消去法:3、LU分解:4、求逆矩阵:四、总结:一、前言:个人学习内容分享二、算法描述:1......
  • 高斯消元+组合数+卡特兰数
    高斯消元+组合数+卡特兰数高斯消元\(O(n^3)\)的线性时间内求解n元线性方程组\[\\\begin{cases}\a_{11}x_1+a_{12}x_2+...+a_{1n}x_n=b_1\\\a_{21}x_1+a_{22}x_2+.......
  • 算法学习笔记(39)——高斯消元
    高斯消元高斯消元高斯消元解线性方程组高斯消元解异或线性方程组高斯消元解线性方程组通过初等行变换把增广矩阵化为阶梯型矩阵,并回代得到方程的解适用于求解......
  • 高斯消元与线性基
    高斯消元与线性基Guass—约旦消元消元算法简介:这是求解线性方程组(也就是M个N元一次方程组)的方法思想:我们可以把方程组看作一个系数矩阵例如:\[\left\{\begin{aligned......