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

高斯消元法

时间:2023-07-12 09:24:03浏览次数:34  
标签:系数 增广 int 矩阵 高斯消 元法

高斯消元法-约当消元法

  • \(m\)个一次方程,\(n\)个变量,可以得到\(m\)行\(n + 1\)列的增广矩阵
  • 将增广矩阵通过行初等变换为行最简形
  • 我们观察增广矩阵,线性方程组的解有\(3\)种情况
  • 唯一解
  • 有无穷多组解
  • 无解
  • 高斯-约旦消元法,是高斯消元法的一种,消元的结果是一个简化阶梯矩阵、

消元过程

  1. 从第\(1\)列开始,选择一个非\(0\)的系数(优先选择最大的的系数,避免转换为其他系数时产生过大的树数值)所在的行,把这一行移动到第\(1\)行,此时\(x_1\)是主元
  2. 把\(x_1\)的系数转换为\(1\)
  3. 利用主元\(x_1\)的系数,把其他行的这一列的主元消去
  4. 重复以上步骤,直到把每行都变成只有对角线上存在主元,且系数都为\(1\),最后得到行最简行矩阵,答案就是最后一列的数字
int n;
double a[N][N]; // 增广矩阵
/*
1 2 -4 0
0 0 3 3
0 0 2 2
*/
int Gauss(int n, int m) // n行m列的增广矩阵
{
    int r = 0;                       // 增广矩阵的秩
    for (int j = 1; j <= m - 1; ++j) // 枚举系数矩阵的列
    {
        int mx = r + 1;               // 当前所在行号
        for (int i = mx; i <= n; ++i) // 枚举行来找到该列绝对值最大非0系数
        {
            if (fabs(a[i][j]) > fabs(a[mx][j]))
                mx = i;
        }

        if (fabs(a[mx][j]) < eps) // 对角线上主元素为0,没有唯一解,矩阵的秩不用加1
            continue;

        for (int i = 1; i <= m; ++i) // 将这最大系数这一行和对角线那一行进行交换
            swap(a[r + 1][i], a[mx][i]);

        for (int i = m; i >= j; --i) // 将这一行的主元素系数变为1
            a[r + 1][i] /= a[r + 1][j];

        for (int i = 1; i <= n; ++i) // 消去主元所在列的其他行的主元
        {
            if (i != r + 1)
            {
                double t = a[i][j] / a[r + 1][j];
                for (int k = 1; k <= m; ++k)
                    a[i][k] -= t * a[r + 1][k];
            }
        }
        r++;
    }

    if (r < m - 1) // 矩阵的秩小于未知量的个数(m - 1)
    {
        for (int i = r + 1; i <= n; ++i)
        {
            if (fabs(a[i][m]) > eps)
                return 0; // 无解
        }
        return 2; // 有无穷多组解
    }
    return 1;
}

标签:系数,增广,int,矩阵,高斯消,元法
From: https://www.cnblogs.com/Zeoy-kkk/p/17546571.html

相关文章

  • 高斯消元法求线性方程组
    高斯消元法作用可以快速求解n元线性方程组:\[\begin{cases}a_{11}x_1+a_{12}x_2+a_{13}x_3+\dots+a_{1n}x_n=b_1\\a_{21}x_1+a_{22}x_2+a_{23}x_3+\dots+a_{2n}x_n=b_2\\\dots\\a_{n1}x_1+a_{n2}x_2+a_{n3}x_3+\dots+a_{nn}x_{n}=b_n\\\end{cases}\]思路利用线性代数......
  • 【高斯消元】 HDOJ 5257 翻转游戏
    如果第一行的状态确定了,那么矩阵的所有状态也会随之确定。。。那么我们就将第一行写成变量,这样能够推出矩阵的m个方程。。。然后对于k,可以写出k个限制方程。。因此我们总共列出m+k个方程,高斯消元,bitset优化即可。。。#include<iostream>#include<queue>#include<stack>#inclu......
  • 「学习笔记」高斯消元
    简单说:高斯消元就是我们初中学的解方程组时用的加减消元法和代入消元法,只是高斯这个人最后总结了一下过程给定方程组\[\left\{\begin{aligned}3x+2y+z=10\quad&(1)\\5x+y+6z=25\quad&(2)\\2x+3y+4z=20\quad&(3)\\\end{aligned}\right.\]我们用......
  • [浅谈] 高斯消元
    \(\color{purple}\text{P3389【模板】高斯消元法}\)所谓高斯消元就是解个\(n\)元一次方程。用矩阵记录每个方程的系数满足第\(i\)个方程:\(a[i][1]x_1+a[i][2]x_2+\dots+a[i][n]x_n=a[i][n+1]\)然后从消元,一个一个项消元,如消除\(i\)项。先选定一个此项系数绝对值最大的......
  • Codeforces Gym 103119B - Boring Problem(高斯消元)
    考虑建出AC自动机,朴素做法是高斯消元,\(f_i=\sum\limits_{j=0}^{k-1}f_{to_{i,j}}p_j+1\),复杂度\(O(n^3m^3)\),不能接受。考虑优化高斯消元的过程,我们定义以下节点为“关键点”:根节点对于一个trie树(也就是未经过AC自动机getfail操作得到的树)上有超过两个儿子的节点\(x......
  • 高斯消元学习笔记
    一、前言讲一下高斯-约旦消元法。它适用于处理\(n\)元1次方程组。误差较小并且好写。二、步骤主要用消元的方式求解,就是一列列处理,每一次处理消掉这一列所有其它的未知数。处理第\(i\)列:找到当前这一列的所有系数的绝对值的最大值,确定在第\(x\)行。如果这一列全......
  • 高斯消斯
      #include<bits/stdc++.h>usingnamespacestd;constintN=110;doublea[N][N];constdoubleeps=1e-8;intn;intguess(){intc,r;for(c=0,r=0;c<n;c++){intt=r;for(inti=r;i<n;i++)......
  • 【模板】高斯消元
    CODE#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])) ......
  • SGU 200 Cracking RSA (高斯消元+大数高精度)
    题目地址:SGU200这题居然还考大数高精度。。无语。。令有该因子偶数个为0,奇数个为1,这样就满足异或运算了,即奇+奇=偶,偶+偶=偶,奇+偶=奇。然后建立方程高斯消元求变元个数free_num,那么子集的个数就是2^free_num-1。减1是去掉0的情况。注意要用大数运算代码如下:#include<iostream>#in......
  • POJ 1753 Flip Game (高斯消元)
    题目地址:POJ1753第三次做这道题了。第一次是刚学搜索的时候做的,第二次是刚学状态压缩枚举的时候做的,这次是刚学高斯消元、、每次都做得很艰辛。。目测这题应该没了别的方法了吧。。。。。。这题除了高斯消元外还需要枚举变元,方法是状态压缩枚举,然后返回去迭代解方程。代码如下:#inc......