0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍一种求解线性方程组的算法-高斯消除法

云深之无迹 来源:云深之无迹 作者:云深之无迹 2022-07-08 09:17 次阅读

啊,我终于可以写文章了!最近两天好累哇,先继续写上面的算法文章。

这篇文章写的算法是高斯消元,是数值计算里面基本且有效的算法之一:是求解线性方程组的算法。

这里再细写一下:

在数学中,高斯消元法,也称为行约简,是一种求解线性方程组的算法。它由对相应的系数矩阵执行的一系列操作组成。此方法还可用于计算矩阵的秩、方阵的行列式和可逆矩阵的逆矩阵。该方法以卡尔·弗里德里希·高斯 ( Carl Friedrich Gauss ,1777-1855)的名字命名,尽管该方法的一些特例——尽管没有证明——早在公元 179 年左右就为中国数学家所知。

为了对矩阵执行行缩减,可以使用一系列基本行操作来修改矩阵,直到矩阵的左下角尽可能地用零填充。基本行操作分为三种类型:

1.交换两行,

2.将一行乘以一个非零数,

3.将一行的倍数添加到另一行。(减法可以通过将一行乘以 -1 并将结果添加到另一行来实现)

使用这些操作,矩阵总是可以转换为上三角矩阵,实际上是行梯形矩阵。一旦所有前导系数(每行中最左边的非零条目)都为 1,并且包含前导系数的每一列在其他地方都为零,则称该矩阵为简化行梯形形式。这种最终形式是独一无二的;换句话说,它与所使用的行操作序列无关。例如,在下面的行操作序列中(在第一步和第三步对不同行进行两个基本操作),第三和第四个矩阵是行梯形矩阵,最后一个矩阵是唯一的简化行梯队形式。

poYBAGLHhgeAC9icAABABfqhBms123.jpg

一个矩阵的简化

使用行操作将矩阵转换为简化的行梯形形式有时称为Gauss-Jordan 消元法。在这种情况下,术语高斯消元是指过程,直到它达到其上三角形或(未简化的)行梯形形式。出于计算原因,在求解线性方程组时,有时最好在矩阵完全约简之前停止行操作。

pYYBAGLHhiCAMBJWAADHrEKAhew355.jpg

我们对其实现的操作只有这三个

如果矩阵与线性方程组相关联,则这些操作不会更改解集。因此,如果一个人的目标是求解线性方程组,那么使用这些行操作可以使问题变得更容易。

对于矩阵中的每一行,如果该行不只包含零,则最左边的非零条目称为该行的前导系数(或枢轴)。因此,如果两个前导系数在同一列中,则可以使用类型 3的行操作使这些系数之一为零。然后通过使用行交换操作,总是可以对行进行排序,以便对于每个非零行,前导系数位于上一行的前导系数的右侧。如果是这种情况,则称矩阵为行梯形. 所以矩阵的左下部分只包含零,并且所有的零行都在非零行的下方。这里使用“梯队”一词是因为可以粗略地认为行是按大小排列的,最大的位于顶部,最小的位于底部。

例如,下面的矩阵是行梯形的,它的前导系数用红色表示:

poYBAGLHhjeAdBPzAABEx8Bk3mg017.jpg

就像这样

它是梯形的,因为零行在底部,第二行(第三列)的领先系数在第一行(第二列)的领先系数的右侧。

如果矩阵的所有前导系数都等于 1(这可以通过使用类型 2 的基本行操作来实现),并且在包含前导系数的每一列中,则称矩阵为简化行梯形。该列中的其他条目为零(可以通过使用类型 3 的基本行操作来实现)。

pYYBAGLHhkyAYZqHAABivHgE-Dk248.jpg

假如我们求解这个方程的解

下表是同时应用于方程组及其相关增广矩阵的行缩减过程。在实践中,通常不会用方程来处理系统,而是使用更适合计算机操作的增广矩阵。行缩减过程可以概括如下:从L1以下的所有方程中消除x,然后从L2以下的所有方程中消除y。这将使系统变成三角形。然后,使用反向替换,可以解决每个未知数。

poYBAGLHhn2AaCG0AADxAZnizmI601.jpg

poYBAGLHhoaAFW-KAADbhzucTD0901.jpg

就好像这样

其实还有内容,但是公式编辑实在不会哇,这里给出程序的伪代码:

高斯消元法将给定的m × n矩阵A转换为行梯形矩阵。

在下面的伪代码中,A[i, j]表示矩阵A在第i行和第j列中的条目,索引从 1 开始。转换在原地执行,这意味着原始矩阵丢失,最终被其行梯形形式替换。

poYBAGLHhrSAXLcuAAC30AsjpMU426.jpg

看不懂?没有关系,大致懂就行

pYYBAGLHhs2AWgGsAACKu13wfHk469.jpg

程序的实现上面,我们导入这些内容

poYBAGLHhuiAR1LVAACZsbKux4o979.jpg

为了精度,导入float64

pYYBAGLHhwSAJKE6AAEwqXi5tEE576.jpg

以及导入的一个N维的数组,在内部是所以ndarray封装的

这样学习的态度是不对的,我们需要看看Numpy文档写的:

pYYBAGLHhxeAbUueAACOGYto1lA497.jpg

64位精度浮点数类型:符号位、11位指数、52位尾数。

pYYBAGLHhyyActRMAACdXr_anYg160.jpg

没关系,你不懂的官网文档满足你

pYYBAGLHh0WAOttCAAB13v_N_yk224.jpg

NDarray在这里

可在运行时用于键入具有给定 dtype 和未指定形状的数组。

poYBAGLHh1uATFDZAACQwwqEdGM215.jpg

系数矩阵,向量是输入的参数,后面是返回的数据类型。

poYBAGLHh4OAGJJnAAAc6rScGHI357.jpg

pYYBAGLHh2-ARviCAADA_mc4yUg987.jpg

对shape函数感兴趣不,内部是这样的

pYYBAGLHh5eAS21XAAAg9xL7Pas833.jpg

这个也是注解的写法,意思是返回一个数组,用0填充:

poYBAGLHh62APYljAAFbzWiYmAY360.jpg

zeros函数的样子

第一个参数,元组,说明样子。后面参数是类型,这里写float。返回值是具有给定形状、数据类型和顺序的零数组。

poYBAGLHh8OAJf8PAACOvr3F_Zo594.jpg

首先,reversed 函数返回一个反转的迭代器。这个为什么倒着算呢?是因为倒着算对算法来讲有一些优点。

内部再套一个函数,内部对列处理,下面的代码就是实现使用倍数的关系对一整行处理,[]是相当于数组的index写法,下面是将处理结果应用到行,最后打印X。

上面这个函数是高斯函数的一个子函数,作用是给出最简的阶梯行列式。

pYYBAGLHh9iACEL9AAB_gCG9M08521.jpg

我们要算这个

pYYBAGLHh_CAd2WqAAAzHNCBO-I861.jpg

输入的时候这样输入,先别继续看,我们看高斯分解

poYBAGLHiAqAAay2AACU1QREN3w426.jpg

这个检查写的很简单

poYBAGLHiB6AZ3x5AABQzgMdRdg630.jpg

接下来

poYBAGLHiDuAHDrDAAFEvc6A4ec344.jpg

连接我们的矩阵,要求有相应的形状

pYYBAGLHiE6AQ-UCAAD_RsdJ8z0011.jpg

这个例子不错

0是按照行展开,1是列,None是直接接龙。

poYBAGLHiGSAdrCJAACtzaPERVI469.jpg

这段实现的是上面的伪代码

pYYBAGLHiHuAP0WdAADX17TMPg8702.jpg

一个很有趣的变量名

poYBAGLHiI6AL9ecAAAhEdt5c1Q468.jpg

调用的时候就是这样,输入一个大元组,里面有两个小元组

poYBAGLHiKSAadagAABkC7venq4857.jpg

审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    6652

    浏览量

    84573
  • 矩阵
    +关注

    关注

    0

    文章

    406

    浏览量

    34253
  • 迭代器
    +关注

    关注

    0

    文章

    43

    浏览量

    4274

原文标题:Python实现所有算法-高斯消除法

文章出处:【微信号:TT1827652464,微信公众号:云深之无迹】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MATLAB应用求线性方程组的通解

    理解线性方程组直接法与迭代法思想,掌握常用算法的设计,掌握用MATLAB实现的数值解法。1、编写列主元消去法程序,并举例子。编写LU分解法程序,并举例子。对两算法作出对比。利用MAT
    发表于 11-03 15:45

    matlab牛顿迭代法全解

    线性方程(或方程组)问题可以描述为求 x 使得f(x) = 0。在求解线性方程的方法中,牛顿迭代法是求非线性方程(非
    发表于 03-08 16:22

    matlab求解线性方程组问题

    我最近在寻找个矩阵,需要用matlab来求取一组线性方程组,而且方程当中都含有些符号参数。求取过程中出现的结果是ans=[1*1 sy
    发表于 03-29 09:06

    用fsolve求解线性方程组

    刚学matlab,用它求解个非线性方程组,结果提示如下错误:Solver stopped prematurely.fsolve stopped because it exceeded
    发表于 05-14 00:42

    请教哪里有labview解线性方程组的资料,最好有具体例子的,谢谢!

    请教哪里有labview解线性方程组的资料,最好有具体例子的,谢谢!麻烦请附个超链接或者直接上传,谢谢!
    发表于 07-27 17:38

    labview求解线性方程组

    ` 本帖最后由 shangxinol 于 2018-10-12 17:11 编辑 各位大佬好,我有个非线性方程组需要利用Labview来求解,且希望能够2ms内求解完成。精度可以
    发表于 10-12 17:05

    特定消谐PWM技术中非线性方程组解法的研究

    本文首先讨论了消谐技术与传统SPWM技术相比的优点,然后研究了特定肖谐技术中求解线性方程组的有效方法通过一定规律给出初值即可随基波变化的解的轨迹,用此方法可求出开
    发表于 11-19 18:27 28次下载

    线性方程组并行迭代解法的新思路

    针对求解大型线性方程组,利用改进后的MGS方法和分治策略,给出了一种求解任意相容性线性方程组通解或不相容性
    发表于 05-10 11:25 16次下载

    凸约束非线性方程组的非单调信赖域算法

    凸约束非线性方程组的非单调信赖域算法
    发表于 10-25 12:20 13次下载

    特定消谐PWM技术中非线性方程组解法的研究

    本文首先讨论了特定消谐技术与传统SPWM技术相比的优点,然后研究了特定消谐技术中求解线性方程组的有效方法,通过按一定规律给出初值即可解出随基波变化的解的轨迹,用此方法可求出开关角数小于100时的两组解。本文最后提出一种新颖、简
    发表于 05-11 15:26 7次下载

    变频电源特定消谐技术中非线性方程组解法的研究

    的数学模型及其非线性方程组用牛顿迭代法求解的步骤,总结出了非线性方程组中开关角两组解给初值的规律,蛤出了开关角两组解随基波幅值变化的轨迹;设计了一种新颖,简单实用的SHE技术的硬件电路
    发表于 12-15 10:05 1次下载
    变频电源特定消谐技术中非<b class='flag-5'>线性方程组</b>解法的研究

    基于压缩存储技术求解压力Poisson方程的BICGSTAB算法

    非零元素;同时,以具有优化性质的BiCCSTAB算法求解压力Poisson方程,显著提高了计算效率。在相同初始条件下,利用Fortran90完成超松弛迭代法的程序求解压力Poisson
    发表于 01-14 16:04 0次下载

    使用MATLAB编程实现里查森迭代法线性方程组求解的资料和程序免费下载

    本文档的主要内容详细介绍的是使用MATLAB编程实现里查森迭代法线性方程组求解的资料和程序免费下载。
    发表于 08-09 16:56 0次下载
    使用MATLAB编程实现里查森迭代法<b class='flag-5'>线性方程组</b><b class='flag-5'>求解</b>的资料和程序免费下载

    基于除法畸变模型的镜头线性标定方法

    针对鱼眼镜头的高精度标定需求,提岀一种基于除法畸变模型的线性标定方法。通过除法模型将题转换为线性方程组
    发表于 05-19 11:39 7次下载

    MATLAB矩阵运算、线性方程组求解、特征值与特征向量

    MATLAB是一个数学软件,它对矩阵运算、线性方程组求解、特征值与特征向量等方面提供了强大的支持。
    的头像 发表于 06-16 16:06 1617次阅读