首页 > 其他分享 >高斯消元法求线性方程组

高斯消元法求线性方程组

时间:2023-07-07 20:35:21浏览次数:51  
标签:dots 元素 int 线性方程组 高斯消 include 元法 vdots

高斯消元法

  • 作用
    可以快速求解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} \]

  • 思路
    利用线性代数知识,存下方程的增广矩阵

\[\left( \begin{array}{ccc} a_{11} & a_{12} & a_{13} & \dots & a_{1n} & b_1\\ a_{21} & a_{22} & a_{23} & \dots & a_{2n} & b_2\\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots\\ a_{n1} & a_{n2} & a_{n3} & \dots & a_{nn} & b_n \end{array} \right) \]

通过初等行变换将其化为行阶梯型矩阵,即可求解。
行变换步骤:
(1)对每一列进行遍历找到绝对值最大的元素所在的行。[1]
(2)将这一行的所有元素与当前的第一行所有元素进行交换。
(3) 将当前第一行的第一个元素化为1。
(4)从第二行开始把当前第一列的元素全部消为0。

  • 代码实现
#include<iostream>
#include<algorithm>
#include<cmath>
const int N=110;
using namespace std;
const double eps=1e-6;//代表误差
int n;
double a[N][N];
int gauss()
{
    int c,r;//分别表示当前最小列,行
    for(c=0,r=0;c<n;c++)
    {
        int t=r;
        for(int i=r;i<n;i++ )
        {
            if(fabs(a[i][c])>fabs(a[t][c]))//注意浮点数是有误差的,不能直接写等于0。
            {
                t=i;
            }
        }
        if(fabs(a[t][c])<eps)
        {
            continue;
        }
        for(int j=c;j<=n;j++)
        {
            swap(a[t][j],a[r][j]);
        }
        for(int j=n;j>=c;j--)
        {
            a[r][j]/=a[r][c];
        }
        for(int j=r+1;j<n;j++)
        {
            if(fabs(a[j][c])>eps)
            {
                for(int k=n;k>=c;k--)
             {
                a[j][k]-=a[j][c]*a[r][k];
             }
            }
           
        }
        r++;
    }//其实每一次没有被continue的循环就是删去系数矩阵的一条长和一条宽,变为一个较小的正方形。
    if(r<n)//n-r等于几那么最后这几行就全为0
    {
        for(int i=r;i<n;i++)
        {
            if(fabs(a[i][n])>eps)
            {
                return 2;
            }
        }
        return 1;
    }
    for(int i=n-2;i>=0;i--)//从下往上消去每个元素上面的元素
    {
        for(int j=i+1;j<n;j++)
        {
            a[i][n]-=a[j][n]*a[i][j];
        }
    }
     return 0;
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        {
            for(int j=0;j<=n;j++)
            {
                scanf("%lf",&a[i][j]);
            }
        }
    int res=gauss();
    if(res==0)
    {
        for(int i=0;i<n;i++)
        {
            printf("%.2lf\n",a[i][n]);
        }
    }
    else if(res==2)
    {
        printf("No solution");
    }
    else if(res==1)
    {
        printf("Infinite group solutions");
    }
    return 0;
}

-代码细节
c++里的浮点数储存是有误差的,判断一个数x等于a等价于fabs(x-a)<eps。


  1. 要找当前第一列绝对值最大的元素原因是:如果最大的元素的绝对值为1则不用进行下面的步骤直接跳过即可。 ↩︎

标签:dots,元素,int,线性方程组,高斯消,include,元法,vdots
From: https://www.cnblogs.com/Taco-gu/p/17535983.html

相关文章

  • 【高斯消元】 HDOJ 5257 翻转游戏
    如果第一行的状态确定了,那么矩阵的所有状态也会随之确定。。。那么我们就将第一行写成变量,这样能够推出矩阵的m个方程。。。然后对于k,可以写出k个限制方程。。因此我们总共列出m+k个方程,高斯消元,bitset优化即可。。。#include<iostream>#include<queue>#include<stack>#inclu......
  • 2023-06-30《计算方法》- 陈丽娟 - 线性方程组的迭代解法.md
    2023-06-30《计算方法》-陈丽娟-线性方程组的迭代解法Matlab计算方法JacobiGauss-SeidelSORSSOR定常迭代法所谓迭代法实际上是求解一个关于映射的不动点问题:然后利用构造一个迭代格式这里表示T的一个复合函数,其可能随迭代次数而改变,最终目标即是得到.下面我们给出收敛......
  • 2023-06-27《计算方法》- 陈丽娟 - 线性方程组的直接解法.md
    2023-06-27《计算方法》-陈丽娟-线性方程组的直接解法Matlab计算方法高斯消元法矩阵分解线性方程组的解法这一课题我们在高等代数中已经了解过,对于一个非奇异方阵,通过求解或者克莱姆法则均可以直接得到方程的精确解,但是上述方法计算量很大,难以在实际中应用,因此引出了本章的内......
  • maltab 利用不同方式(自编高斯赛德尔迭代函数,逆矩阵,左除(\)运算)求解线性方程组的速度
    参考:matlabhelp文档:mldivide实际测试比较,这里K_Tem为一个2398*2398的稀疏矩阵,Guass_Seidal是自己写的高斯赛德尔迭代函数 ......
  • 「学习笔记」高斯消元
    简单说:高斯消元就是我们初中学的解方程组时用的加减消元法和代入消元法,只是高斯这个人最后总结了一下过程给定方程组\[\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......
  • 最小二乘法求解线性方程组公式推导
    M行N列方程组如下。其中x,y是已知量,k是未知量:$${\left\{\begin{matrix}k_{1}x_{1,1}+k_{2}x_{1,2}+\cdots+k_{N}x_{1,N}=y_{1}\\ k_{1}x_{2,1}+k_{2}x_{2,2}+\cdots+k_{N}x_{2,N}=y_{2}\\ \vdots\\ k_{1}x_{M,1}+k_{2}x_{M,2}+\cdots+k_{N}x_{M,N}=y_{M} \end{matrix......
  • 高斯消元学习笔记
    一、前言讲一下高斯-约旦消元法。它适用于处理\(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++)......