第三十四章 数论——高斯消元解线性方程组

news2024/10/5 18:13:15

第三十四章 数论——高斯消元解线性方程组

  • 一、高斯消元
    • 1、线性方程组
    • 2、高斯消元步骤
      • (1)数学知识铺垫
        • 增广矩阵和阶梯矩阵
        • 初等变换
      • (2)高斯消元步骤
  • 二、代码模板
    • 1、问题:
    • 2、代码

一、高斯消元

1、线性方程组

我们在小学的时候接触过二元一次方程组,我们可以用带入消元的方式去解方程,当然我们也可以通过对式子做等价变形,然后两个式子通过加减法的运算消元。
不管我们采取哪一种方式,我们的目的就是转化为一元一次方程组,这样我们就能够解出来了。

那么当我们的元数增多的时候,也就是我们的未知数增多的时候,我们的方程数目也会增多,那么我们现在先不管运算结果,我们先来讨论一下,多元一次方程组什么时候有解,什么时候无解

很明显,n个未知数需要n个不同的方程求解。

如果说其中两个方程矛盾了,那么就是无解

如果我们方程组中,有几个方程是一样的,那么说明我们的方程的数量是少于我们的未知数的数量的,此时我们的方程就有多个解。那么什么叫方程是一样的呢?

比如:
x + y = 1 x+y=1 x+y=1 2 x + 2 y = 2 2x+2y=2 2x+2y=2这两个方程就是一样的,我们可以通过后面的这个方程推导出前面的这个方程。
那么此时就有多个解。

如果说我们恰好n个未知数,n个不同的方程,那么此时就有唯一解

了解了解的个数之后,我们来思考一下,如何去解呢?

其实本质还是如何利用消元去解方程。而高斯消元算法就给出了一个统一的步骤消元。我们接着往下看。

2、高斯消元步骤

(1)数学知识铺垫

增广矩阵和阶梯矩阵

对于方程组:

{ a 11 x 1 + a 12 x 2 + . . . + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + . . . + a 2 n x n = b 2 . . . a n 1 x 1 + a n 2 x 2 + . . . + a n n x n = b 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+...+a_{2n}x_n=b_2\\ ...\\ a_{n1}x_1+a_{n2}x_2+...+a_{nn}x_n=b_n \end{cases} a11x1+a12x2+...+a1nxn=b1a21x1+a22x2+...+a2nxn=b2...an1x1+an2x2+...+annxn=bn

我们将每个方程的系数拿出来,我们能写出一个 n ∗ n n*n nn的矩阵。如果在加上方程右侧的结果,我们就能写出一个 n ∗ ( n − 1 ) n*(n-1) n(n1)的矩阵。如下图所示:

{ a 11      a 12      . . .      a 1 n      b 1 a 21      a 22      . . .      a 2 n      b 2 . . . a n 1      a n 2      . . .      a n n      b n \begin{cases} a_{11}\;\;a_{12}\;\;...\;\;a_{1n}\;\;b_1\\ a_{21}\;\;a_{22}\;\;...\;\;a_{2n}\;\;b_2\\ ...\\ a_{n1}\;\;a_{n2}\;\;...\;\;a_{nn}\;\;b_n\\ \end{cases} a11a12...a1nb1a21a22...a2nb2...an1an2...annbn

我们可以通过方程之间的等价变形,加减消元,消去一些系数,然后将增广矩阵中的一些数字去掉,就构成了我们的阶梯矩阵,如下图所示。

{ a 11      a 12      . . .      a 1 n      b 1                a 22      . . .      a 2 n      b 2 . . . . . .                                        a n n      b n \begin{cases} a_{11}\;\;a_{12}\;\;...\;\;a_{1n}\;\;b_1\\ \;\;\;\;\;\;\;a_{22}\;\;...\;\;a_{2n}\;\;b_2\\ ......\\ \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;a_{nn}\;\;b_n\\ \end{cases} a11a12...a1nb1a22...a2nb2......annbn

当变成阶梯矩阵的时候,我们最后一个方程是不是就可以求解了。然后我们依次向上逐步求解方程

而将增广矩阵转化为阶梯矩阵的过程就需要用到我们的高斯消元

初等变换

初等变换可以理解为对上述的增广矩阵做等价变形。
以下三种变换是不影响结果的:

  • 把某一行乘一个非零的数字。
  • 交换某两行。
  • 把某行的若干倍加到另一行上去。

上述三种初等变换是高斯消元的基础,大家务必要理解。其实对矩阵变换,就是对方程组变换,因此,大家通过方程组去理解这三行就会发现是等价的了。

(2)高斯消元步骤

枚举增广矩阵的每一列C:

  • step1:找到该列绝对值最大的一行
  • step2:将该行换到最上面(未确定阶梯型的行,并不一定是第一行)
  • step3:将该行的第一个数变成1
  • step4:将下面所有行的第C列消成0
  • step5:当转化为阶梯矩阵的时候,从最后一行开始,向上捯,将上面行的该位变成0,当前n列只含有一个1,这个1所对的未知数就等于第n+1列的值。

二、代码模板

1、问题:

在这里插入图片描述

2、代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 110;
const double eps = 1e-8;
int n;
double a[N][N];
int gauss() 
{
    int c, r;//c是当前系数需要变成1的列,r是未确定的行。
    for (c = 0, r = 0; c < n; c ++ )
    {
        int t = r;//默认当前行就是C列的系数的绝对值最大的行。
        //去遍历剩下的行,寻找C列系数的绝对值最大的行
        for (int i = r; i < n; i ++ )  
            if (fabs(a[i][c]) > fabs(a[t][c]))
                t = i;
         /*如果第C列的最大值是0,说明无需进行后续的操作了。说明该行所对的方程与别的方程重复了,或者是矛盾的。
         若重复了,则是多个解,若矛盾了则是无解。
         */
        if (fabs(a[t][c]) < eps) continue;
        //将系数绝对值最大的行放到r行。
        for (int i = c; i <= n; i ++ ) swap(a[t][i], a[r][i]); 
        //将该行的第C列所对的系数变成1
        for (int i = n; i >= c; i -- ) a[r][i] /= a[r][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++             
        r ++ ;
    }
    //如果r<n,说明有几个方程是不确定的,那么我们就看是矛盾了还是多解了。
    if (r < n)
    {
    	/*0-n-1列都是0,如果n列不是0,说明0=一个数,则矛盾,无解*/
        for (int i = r; i < n; i ++ )
            if (fabs(a[i][n]) > eps)
                return 2;//矛盾返回2
        return 1; //反之有无限个解。
    }
    /*若有解,从最后一行网上计算消元,最后第n-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; 
}
int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < n + 1; j ++ )
            scanf("%lf", &a[i][j]);
    int t = gauss();
    if (t == 2) puts("No solution");
    else if (t == 1) puts("Infinite group solutions");
    else
    {
        for (int i = 0; i < n; i ++ )
        {
            if (fabs(a[i][n]) < eps) a[i][n] = 0;  
            printf("%.2lf\n", a[i][n]);
        }
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

P3884 [JLOI2009]二叉树问题

题目 如下图所示的一棵二叉树的深度、宽度及结点间距离分别为&#xff1a; 深度&#xff1a;44宽度&#xff1a;44结点 8 和 6 之间的距离&#xff1a;88结点 7 和 6 之间的距离&#xff1a;33 其中宽度表示二叉树上同一层最多的结点个数&#xff0c;节点 u, vu,v 之间的距离…

算法工程师需要学习的基础

文章目录应该早点系统地了解算法工程师需要学习的东西的&#xff0c;B站上的up主&#xff1a;梁唐讲的很好&#xff0c;大家可以去看一下&#xff0c;只截了一部分图做一个记录

MySQL5.7 多主一从(多源复制)同步配置

主从复制有如下一些优势&#xff1a; 分担负载&#xff1a;对业务进行读写分离&#xff0c;减轻主库I/O负载&#xff0c;将部分压力分担到从库上&#xff0c;缩短客户查询响应时间。 增加健壮性&#xff1a;在主库出现问题时&#xff0c;可通过多种方案将从库设置为主库&#…

100%全国产龙芯2K1000设计方案

国产工业处理器&#xff0c;龙芯2K1000主板&#xff0c;100%全国产化方案 可实现100%国产元器件方案&#xff0c;国产处理器 信迈2k1000开发板采用龙芯 2k1000处理器&#xff0c;处理器集成 2 个 GS264 处理器核&#xff0c;主频 1GHz&#xff0c;64 位 DDR3 控制器&#xff…

Vue与VueComponent的内置关系

上一节讲到了 Vue.extend 与 VueComponent 的区别&#xff0c;这一节讲一讲 Vue 与 VueComponent的内置关系。 原型与原型链 这里需要用到原型与原型链中的知识点&#xff0c;具体文章链接在这里。js中的原型与原型链 这里只需要理解一个点&#xff0c;那就是构造函数的protot…

【idea2022.3】安装教程2022-12

教程目录教程简介所需环境和版本软件下载执行过程安装激活开始使用前的配置结束语教程简介 换电脑了&#xff0c;又经历了一遍软件和环境的安装&#xff0c;已经安装好了jdk和对应版本的maven&#xff0c;所以接下来该安装idea等软件了 所需环境和版本 系统&#xff1a;win1…

软件测试人员30K的月薪,是个什么段位?

大家可以参照BAT等一线大厂的职级&#xff0c;一般是高级测试工程师和资深测试开发工程师的职位&#xff0c;下面是在字节跳动年薪40W的测试工程师 掌握的技能树主要包含哪个方面&#xff1f; 现在的行情&#xff0c;大家想要拿到30k这个薪资&#xff0c;不妨审视自己&#xf…

跨平台备份工具Duplicati

本文软件得到了网友 冷心 的推荐&#xff1b; 什么是 Duplicati &#xff1f; Duplicati 是一个免费的开源备份客户端&#xff0c;可将加密的、增量的、压缩的备份安全地存储在云存储服务和远程文件服务器上。支持 Amazon S3、IDrive e2、Backblaze (B2)、Box、Dropbox、FTP、G…

【Flask框架】——27 SQLAlchemy高级

1、排序 order_by方法排序&#xff1a;可以指定根据模型中某个属性进行排序&#xff0c;"模型名.属性名.desc()"代表的是降序排序。 # 根据年龄降序 lst session.query(Student).order_by(Student.age.desc()).all() # 根据年龄升序 lst session.query(Student).…

WinNTSetup V5.3.0 Bata5 单文件版

前言 WinNTSetup 是一款Windows系统硬盘安装器&#xff0c;支持从PE和本地安装系统&#xff0c;支持支持NT内核的系统。 WinNTSetup 包括XP、Win7、Win8、Win8.1、Win10等这些系统。直接从硬盘安装系统&#xff0c;不需要光盘。WinNTSetup 还附加一些系统优化功能&#xff0…

Android---简易的底部导航栏

目录 一、activity_main.xml布局 二、给ViewPager2 创建适配器 三、ViewPager2 数据源 四、MainActivity.java类 1、初始化数据源。 2、ViewPager2 页面改变监听 3、BottomNavigationView 的每个 item 点击的监听 这里简单演示实现效果&#xff0c;实现快速开发&#xff…

mmdetection从入门到精通(一)-汇总目录

&#xff11;.简介 MMDetection 是商汤出品的集成了目标检测&#xff0f;实例分割分割&#xff0f;全景分割几个方面顶级模型组合的,模块化的&#xff0c;基于 PyTorch 的目标检测开源工具箱。是深度学习工作者的必备工具&#xff0c;非常有必要深入掌握。 近期汇总一下从入…

今年最后一场官方活动

阅读本文大概需要 1.6 分钟。2022 年 12 月 26&#xff0c;新型冠状病毒肺炎正式更名为了新型冠状病毒感染&#xff0c;不再纳入《中华人民共和国国境卫生检查疫法》 规定的检疫传染病管理。文字层面上&#xff0c;这意味着我们口中的疫情&#xff0c;结束了。然而我却认为并没…

Django学习 Day9

1.F对象 一个F对象代表数据库中某条记录的字段的信息。 作用&#xff1a; 通常是对数据库中的字段的值在不获取的情况下进行操作 用于类属性&#xff08;字段&#xff09;之间的比较。 语法&#xff1a; From django.db.models import F F(‘列名’)例子: 所有Book数据表中的…

云游戏的2022:破局、新生、元宇宙

文|智能相对论 作者|青月 如果说2021年是「元宇宙元年」&#xff0c;那么2022年更像是元宇宙的「祛魅之年」&#xff0c;在这一年里&#xff0c;原本处在狂奔状态下的元宇宙正在褪去虚火。 在这样的大环境下&#xff0c;由于在实时性、兼容性、无限开创等关键特性的理念上的…

99. 激光炸弹——二维前缀和

地图上有 N 个目标&#xff0c;用整数 Xi,Yi 表示目标在地图上的位置&#xff0c;每个目标都有一个价值 Wi。 注意&#xff1a;不同目标可能在同一位置。 现在有一种新型的激光炸弹&#xff0c;可以摧毁一个包含 RR 个位置的正方形内的所有目标。 激光炸弹的投放是通过卫星定…

eclipse中安装ERMaster

eclipse中安装ERMaster 简介 参考网址&#xff1a; https://www.bilibili.com/video/BV1R4411a73T/?p22&spm_id_from333.880.my_history.page.click&vd_source42661b67a37800001020550eb4a4c45e 主要看这 3 集 ERMaster 在 jeesite 官网的介绍项目 参考网址&#x…

systemd(二)单元配置文件

概述 对于系统中的每一个单元&#xff08;unit&#xff09;都有一个配置文件&#xff0c;用于指示systemd如何启动或停止这个单元。 配置文件格式 [Unit]区块 [Unit]区块通常是配置文件的第一个区块&#xff0c;用来定义单元的元数据&#xff0c;以及配置与其他单元的关系。…

多线程模式下保证事物的一致性

目录前置InsertBatchSuccessServiceImpl.javaInsertBatchErrorServiceImpl.java效果图前置 在一些特殊的场景下, 我们需要一些特定的操作. 比如我有一个接口, 做如下操作, 需要保持事物的一致性, 即: 全部成功则提交, 一个异常则全部回滚: 1.insert订单、(耗时1秒) 2.insert订单…

4、MYSQL常用函数(字符串函数)

目录 1、concat函数&#xff1a; 2、insert(str,x,y,instr)函数&#xff1a; 3、lower(str)和upper(str)函数&#xff1a; 4、left(str,x)和right(str,x)函数&#xff1a; 5、lpad(str,n,pad) 和rpad(str,n,pad) 函数&#xff1a; 6、ltrim(str)和rtrim(str)函数&#xff…