线性代数 矩阵消元

以下是本次我们要讨论的方程组例题:

{x+2y+z=23x+8y+z=124y+z=2A=[121381041]

如果消元法奏效,方程的根就出来了。一般来说,消元法是可以解出来的,只要方程组的矩阵 A 是一个好矩阵,比如上面这个。

对于好矩阵可以粗略理解为非奇异且可逆(总之就是具有一切美好的性质

实际上,对于消元的概念,大家很容易想到。话说高斯先想到这个概念可能是因为他出生早,emm 当然他逝得也早,消元概念其实很自然(

了解了消元概念以后,我将要做的是用矩阵语言描述消元法。毕竟对于整一个章节来说,核心概念是“矩阵变换”。

好好好,现在我们来看这个方程:三个方程三个未知数,然后是 3×3 的矩阵 A , 方程组表示为 AX =b

话说在消元的时候大部分时间都是快乐的,不过呢在方程里不断重复加号和等号会很痛苦,所以我会用矩阵表示,这些都能表示为矩阵。

先不管矩阵,回想一下在幼儿园的时候我们是怎么完成消元的?第一步怎么做?我们使第一个方程成立,用该方程乘以某个数,然后从方程二中将它减去,目的是抵消掉里面的一个未知数从而简化方程。

很显然,重点是我们乘以一个什么数可以达到目的,这里的目的是抵消方程二中的 x ,这里还是用矩阵运算,矩阵更加简洁。

方程一乘以多然后用方程二减去?首先,这个 1 是消元的关键,它被称为主元。我让第一行不变因为它是主元行,但我将使用它,那么消元乘数取多少?很显然是 31×3=3 可以消掉下面的 3x

于是

[121381041][121022041]

有人可能会问:那右侧向量呢?是不是也应该放在后面?实际上 MatLab 是先算完左侧矩阵,再回头算右侧向量的。

Ok,言归正传。下一步消元是什么?严格来说这里消元的位置应该是 (2,1) 即行二列一,然后用 (3,1) 去抵消成 0,但是我们已经有 0 了,所以取 0 个方程减下来就可以了。

接下来我们继续消元,第二个主元在 (2,2) 的位置,消元乘数是多少?很显然是 2 很容易理解理解不了的话还是 退役吧

[121022041][121022005]

好的,我们来还原一下整个变换过程:

从矩阵 A 通过消元得到的矩阵记作 U , U 表示上三角矩阵,U=[121022005]

因此,这里的消元目的是从 A 得到 U ,毫不夸张,这是计算科学中最普遍的运算。顺便提一下,主元不能为 0

好好好,接下来我们讨论一下消元法失效的情况,失效指的是不能得到三个主元。

话说如果第一个数是 0 , A=[021381041] 就已经陷入麻烦,方程就是 {2y+z=23x+8y+z=124y+z=2

这难道意味着我无法解方程?显然不是。怎么办?行交换即可。这很好理解。不理解的评论问我就行(虽然可能没人会看这篇文章。

然后我突然意识到一个问题,交换行只可以解决主元为 0 的 “暂时性失效” ,但如果它不暂时的话就麻烦了,比如说:

A=[021381044] 方程是 {2y+z=23x+8y+z=124y4z=2

这样就会造成无法摆脱的麻烦,我指的是主元三为 0 ,最后一个主元为 0 就没地方换了,算到这里就可以确定消元法失效了。所以说,没有方法是万能的。

好,接下来还是讨论回消元法有效的情况。下一个主题是 “回代” 。

什么是“回代”?现在就得把右侧向量带入了。

MatLab 会怎么做呢?我们照着他来就行了。我们引入右侧向量作为新的一列 b=[2122]

有:

[1212381120442]

我将把他称为 “增广矩阵(AugmentedMatrix)”,可以想象,对方程进行消元的时候,右侧向量也会随之变化。

接着,我们按照之前的方式对新的矩阵进行消元:

[1212381120442][121202260412][1212022600510]

那么,我最终得到的右侧向量, 即 U 对应的 b[2610] 。我们将它记作 c ,这是固定记号。所以 cb 的最终结果,就像 U 对于 A 样。

所以,所谓的“回代”就是指将右侧向量带回原方程,有:

{x+2y+z=22y2z=65z=10

这就是矩阵 Uc 的方程含义,也就是 UX=c 。最后,方程解得 {x=2y=1z=2

所以你会发现“回代”就是一个很简单的东西,他是反向求解方程的简单步骤。

好的,现在讷我需要铺垫一点东西:

当我们进行矩阵变换的时候,我们可以看到大图。上一章,再讲矩阵乘以右侧向量的时候,我提到过大图。

我们随便假设一个矩阵:

[][345]=[3×col1+4×col2+5×col3]

我记得在上一章的时候,我建议大家在计算的时候用列计算。而接下来的计算用的不是列,而是行,为什么?因为这一集的文章讲的都是行变换。因此,上述列的形式是现在不需要的。所以接下来讲一下行表示法。

我还是假设一下我挚爱的矩阵:

[127][]

如图,这是一个 1×3 的矩阵乘上 3×3 的矩阵,结果是什么?矩阵乘以一列等于一列,但在这里我用一行乘以一个矩阵应该是这样:

[127][]=[1×row1+2×row2+3×row3]

接下来进入第二部分。

在第二部分中,我们将引入矩阵。

现在我要引入消元矩阵的概念。

从第一步开始,取矩阵:

[121381041]

我的问题是,第一步需要一个什么矩阵?需要一个从第二行中减去三倍的行一,其他行不变。

[][121381041]=[121022041]

好的先在就问未知的矩阵长什么样。很显然,第一行是 [1,0,0]

[100][121381041]=[121022041]

那最后一行是什么?我们只需要 1 个第 3 行,于是

[100001][121381041]=[121022041]

这里提一个概念叫 “单位矩阵” ,用上面这个例子,如果第二行是 [0,1,0] 的话

[100010001][121381041]=[121381041]

很显然,乘了就和没乘一样,这个矩阵 [100010001] 就相当于数字 1 一样,它叫做 “单位矩阵”。那我们简单做一个推广:

如果这是一个 n×n 的矩阵,那他的单位矩阵是什么?很显然是对角线是 1 其他地方是 0 的矩阵。

长这样:

[100010001]

好好好,能看懂就行。我们继续上面的话题。

我们这里并不是要让他不改变,那怎样才能得出正确的结果?

很显然

[100310001][121381041]=[121022041]

这样就解决了。这样的矩阵相当于三倍的第一行加上一倍的第二行加上零个第三行——这不就是我们想要的吗?

你很容易发现这里的矩阵形式很简单,求矩阵乘法也很顺心,所以它被称作“初等矩阵”,记作 E

E2,1 表示在位置 (2,1) 上的变换,有E2,1=[100310001],而接下来我需要用矩阵语言来描述整一个消元的过程。

接下来第二步是什么?用第三行减去两倍的第二行,同样的,什么矩阵能达到目的?

同样的:

[100010021][121022041]=[121022005]

好,因为要修正的位置是 (3,2) ,所以 E3,2=[100010021]

OKey,我来简单总结一下我们目前为止干了些什么:

E3,2(E2,1A)=U

所以现在知道我为什么喜欢矩阵了,它很简洁,放到网上也可以节省空间(

好接下来我要讲一些矩阵的重要性质

假设我有矩阵 A 想要得到矩阵 U ,什么矩阵可以一次性做到?

这个答案很简单,但是非常重要。

(E3,2·E2,1)A=U

先把这些 E 乘起来。这就是矩阵有乘法结合律

既然讲到了初等矩阵,那就来看看另一类初等矩阵——“置换矩阵”,话说就是交换行的矩阵。

我举一个置换矩阵的例子:

行交换

(交换第一行和第二行)

[0110][abcd]=[cdab]

[0110] 这种矩阵被称为 P

列交换

[abcd][0110]=[badc]

一定要注意,列变换的时候矩阵右乘。至于为什么左变换的时候左乘而右变换相反可以自行体会,很容易理解。

我们还是讨论回行变换,但是要强调的一点是两个矩阵 ABA×BB×A

回到:

E3,2(E2,1A)=U

我们把矩阵 E3,2E2,1 相乘就可以得到致命一击的消元矩阵,但这个你们可以自己去做,不过多讲解,因为那是非常好理解的。

OKey,话说我不讲的原因是还有更好的方法。这个方法不是关于如何从 A 变成 U ,而是如何从 U 变回 A 。所以,下面进行逆变换。这里用到了“逆”,这就是了解逆矩阵的第一步。

至今为止,提到的所有矩阵都是可逆的。接下来,我先讲一下可逆的含义。

我举个例子:

就拿这个 E2,1=[100310001] 来说。

我们一开始是通过这个矩阵乘上系数矩阵来达到消元的目的:

[100310001][121381041]=[121022041]

而现在我想取消这次消元应该拿什么样的矩阵去乘可以达到目的?这是问题的关键。

很显然(emm也许不显然),

[100310001][100310001]=[100010001]

而矩阵 [100310001] 就是它的逆矩阵,也就是说这个矩阵乘以它可以得到单位矩阵。

如果矩阵[100310001]记作 E ,矩阵 [100010001] 记作 I ,则矩阵 [100310001] 记作 E1 ,即 E 的逆元,至少你可以这样理解。

本章内容到此结束。

预告:下一章将 ALU 分解展开分析。

posted @   fedoralxy  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示