zoukankan      html  css  js  c++  java
  • .线性代数02.矩阵消元

    本篇为MIT公开课——线性代数 笔记。

    下面我们要用矩阵语言描述消元法。核心的概念是“矩阵变换”.

    举例

    三未知数三方程

    [x+2y+z=2\ 3x+8y+z=12\ 4y+z=2 ]

    方程组矩阵形式为 (A X=b)

    它们的系数矩阵 (A) 为3x3矩阵

    [A=left( egin{array}{ccc} 1 & 2 & 1 \ 3 & 8 & 1 \ 0 & 4 & 1 \ end{array} ight) ]

    消元

    首先明确一个概念:主元(pivot element),一种变元。指在消去过程中起主导作用的元素。
    主元就是在矩阵消去过程中,每列的要保留的非零元素,用它可以把该列其他元素消去。

    主元行就是主元所在的行。

    主元的确定是一种递归思想。

    对于 3X3 矩阵:

    主元1是第一行第一个元素,依次乘以对应数值对第二行和第三行进行消元;

    主元2是第二行第二个元素,对第三行进行消元;

    主元3是第三行第三个元素,到达边界。

    • 第一步:((2,1))消元

    第一行中第一个元素是我们主元1。

    利用它我们可以消去第二行中的第一个元素,也就是我们可以消去方程2中的 (x) 分量。

    我们将第一行乘以3,然后用第二行减去它,主元行1不变,减法的结果在第二行显示,用矩阵形式:

    [left( egin{array}{ccc} 1 & 2 & 1 \ 3 & 8 & 1 \ 0 & 4 & 1 \ end{array} ight) o left( egin{array}{ccc} 1 & 2 & 1 \ 0 & 2 & -2 \ 0 & 4 & 1 \ end{array} ight) ]

    这里消元的位置是 ((2,1)) 位置,行二列一。 ((2,1)) 位置得到 (0),因此用 ((2,1)) 作为这一步的代号。

    • 第二步:((3,1))消元

    把这一列最下面元素也变成0,所以这一步代号是 ((3,1)) ,行三列1,不过这个位置已经是0了,所以第一行乘以0,再用第三行减去,还是得到原来数值.

    • 第三步:((3,2))消元

    现在我们方程消去了 (x) 分量,只剩下 (y、z) 分量

    接下来是主元2,它是第二行的第二个元素。

    利用它我们可以消去第三行中的 (y) 分量。

    我们将主元行2乘以2,用第三行减去,可以得到

    [left( egin{array}{ccc} 1 & 2 & 1 \ 0 & 2 & -2 \ 0 & 4 & 1 \ end{array} ight) o left( egin{array}{ccc} 1 & 2 & 1 \ 0 & 2 & -2 \ 0 & 0 & 5 \ end{array} ight) ]

    消元结果

    此时,我们通过对矩阵 (A) ,就得到了我们三个主元:(1,2,5),它们构成的矩阵,记为 (U) .即

    [U=left( egin{array}{ccc} 1 & 2 & 1 \ 0 & 2 & -2 \ 0 & 0 & 5 \ end{array} ight) ]

    (U) 表示上三角矩阵:主对角线以下都是零的方阵称为上三角矩阵。我们这里消元的目的就是为了得到 (U) .

    强调一点:主元永远不会是 0.

    消元失效情况

    失效指的是不能得到三个主元。

    失效情况:

    消元过程中,遇到主元是0,解决方法是:行交换。

    注意点:

    1. 因为主元永远不可能是0。所以如果0占了主元位置,这时就需要进行行交换,只要该列下面存在非0元素,就可以在下面的行中找寻适当的主元。如果下面也是0就没办法了。
    2. 注定失效情况:系数矩阵 (A) 中第三行第三列元素,使得消元后结果为0.这样使得主元不存在,矩阵不可逆,消元失效。
    3. 行交换可以解决主元为0的“暂时性失效”,但当底下的行中没有非0元素时,消元就彻底失效。

    回代

    在解线性方程组时,把系数矩阵主对角线下方元素消零属于消元;把系数矩阵主对角线上方元素消零属于回代。

    这里我们就需要引入增广矩阵。

    在原本的系数矩阵 (A) 右边引入右侧向量

    [left( egin{array}{cccc} 1 & 2 & 1 & 2 \ 3 & 8 & 1 & 12 \ 0 & 4 & 1 & 2 \ end{array} ight) ]

    这就是”增广矩阵“。

    对增广矩阵按照我们上面例子消元,可以得到

    [left( egin{array}{cccc} 1 & 2 & 1 & 2 \ 0 & 2 & -2 & 6 \ 0 & 0 & 5 & -10 \ end{array} ight) ]

    (left( egin{array}{c} 2 \ 6 \ -10 \ end{array} ight)) 记为 (c) .(c)(b) 的最终结果。

    将矩阵化为方程组形式:

    [x+2y+z=2\ 2y-2z=6\ 5z=-10 ]

    可以计算出,(z=-2,y=1,x=2) ,这就是回代:它是反向求解方程的简单步骤。

    回顾乘法

    1.从矩阵列角度考虑,矩阵与向量的乘法运算就是”矩阵列的线性组合“。

    例如

    [left( egin{array}{ccc} 1 & 2 & 3 \ 1 & 2 & 3 \ 1 & 2 & 1 \ end{array} ight)*left( egin{array}{c} 3 \ 4 \ 5 \ end{array} ight)= 3* ext{col$\_1$}+ 4* ext{col$\_2$}+5* ext{col$\_3$} ]

    矩阵乘以一列,结果是一列。

    2.从矩阵行角度,就是矩阵行的线性组合。

    举例

    [left( egin{array}{ccc} 1 & 2 & 7 \ end{array} ight) *left( egin{array}{ccc} 1 & 2 & 3 \ 1 & 2 & 3 \ 1 & 2 & 1 \ end{array} ight)= 1* ext{row$\_1$}+ 2 * ext{row$\_2$}+7 * ext{row$\_3$} ]

    矩阵乘以一行,结果是一行。

    矩阵乘以两行,结果就是两行。依此类推。

    注意,进行行变换和列变换,乘法中待变换矩阵乘以的矩阵位置是不同的。放在后面表示列变换,前面是行变换。

    消元矩阵

    虽然我们之前也在用矩阵,但是计算步骤都没有用到矩阵表示。所以我们要做的就是把消元过程用矩阵表示。

    回到第一个例子的第一步开始,取系数矩阵 (A)

    [A=left( egin{array}{ccc} 1 & 2 & 1 \ 3 & 8 & 1 \ 0 & 4 & 1 \ end{array} ight) ag1 ]

    现在对其进行消元操作。

    1.对 ((2,1)) 消元过程用矩阵描述

    这里问题就是,我们需要一个什么样的矩阵,得到行2减去3倍行1的结果,并且保持行1和行3不变?

    [left( egin{array}{ccc} ext{?} & ext{?} & ext{?} \ ext{?} & ext{?} & ext{?} \ ext{?} & ext{?} & ext{?} \ end{array} ight)left( egin{array}{ccc} 1 & 2 & 1 \ 3 & 8 & 1 \ 0 & 4 & 1 \ end{array} ight) =left( egin{array}{ccc} 1 & 2 & 1 \ 0 & 2 & -2 \ 0 & 4 & 1 \ end{array} ight) ]

    根据矩阵行的乘法运算,

    保持行1不变,就是取1个行1,0个行2,0个行3,即矩阵乘以向量 ((1 0 0)) ,得到右侧矩阵行1;(矩阵拆分为向量)

    同样的,保持行3不变,就是取0个行1,0个行2,1个行3,即矩阵乘以向量 ((0 0 1)) ,得到右侧矩阵行2;

    中间我们需要进行行2减去3倍行1,就是取 (-3) 倍行1,1个行2,0个行3,即矩阵乘以向量 ((-3 1 0)),得到右侧矩阵行3;

    我们可以得到结论:

    [left( egin{array}{ccc} ext{1} & ext{0} & ext{0} \ ext{-3} & ext{1} & ext{0} \ ext{0} & ext{0} & ext{1} \ end{array} ight)left( egin{array}{ccc} 1 & 2 & 1 \ 3 & 8 & 1 \ 0 & 4 & 1 \ end{array} ight) = left( egin{array}{ccc} 1 & 2 & 1 \ 0 & 2 & -2 \ 0 & 4 & 1 \ end{array} ight) ag2 ]

    如果要检验特定元素,比如检验第二行第三列元素正确性。

    只需要看左侧前矩阵行2和后矩阵列3即可,点积,(-3*1+1*1+1*0=-2)。可将左侧中右边看成矩阵,左边看成向量,这样就和讲过的乘法一样。

    我们将系数矩阵乘以的这个矩阵叫做“初等矩阵”记作 “E”。因为表示位置 ((2,1)) 上变换,所以记作 (E_{21}) .

    2.对 ((3,2)) 消元过程用矩阵描述

    这里我们问题就是,需要一个什么样的矩阵,将式子(2)的结果,用行3减去2倍行2,并且保持行1和行2不变?

    不再累述。这个矩阵我们记为 (E_{32})

    [left( egin{array}{ccc} ext{1} & ext{0} & ext{0} \ ext{0} & ext{1} & ext{0} \ ext{0} & ext{-2} & ext{1} \ end{array} ight)left( egin{array}{ccc} 1 & 2 & 1 \ 0 & 2 & -2 \ 0 & 4 & 1 \ end{array} ight) =left( egin{array}{ccc} 1 & 2 & 1 \ 0 & 2 & -2 \ 0 & 0 & 5 \ end{array} ight) ]

    矩阵消元到此结束。

    综合以上内容,我们可以将矩阵消元简单表示为:

    [E_{32}*(E_{21}*A)=U ]

    改变乘法顺序,就能得到一次性解决问题的矩阵。矩阵相乘满足结合律。

    [(E_{32}*E_{21})*A=U ]

    置换矩阵

    假设我们有个2X2矩阵,我们想要交换它的行顺序,其实理解上面的计算,我们就能求出这个矩阵是什么,例如

    [left( egin{array}{cc} 0 & 1 \ 1 & 0 \ end{array} ight) left( egin{array}{cc} a & b \ c & d \ end{array} ight)=left( egin{array}{cc} c & d \ a & b \ end{array} ight) ]

    我们将(left( egin{array}{cc} 0 & 1 \ 1 & 0 \ end{array} ight))记为 (P) ,代表Permutation(置换)。

    如果想交换列顺序,就把矩阵 (P) 放在后面相乘。

    [ left( egin{array}{cc} a & b \ c & d \ end{array} ight) left( egin{array}{cc} 0 & 1 \ 1 & 0 \ end{array} ight)=left( egin{array}{cc} b & a \ d & c \ end{array} ight) ]

    行变换是矩阵左乘,列变换时矩阵右乘。“左行右列”。

    矩阵相乘顺序不能改变。矩阵相乘不满足交换律。

    逆矩阵

    如果我们想要取消某次消元,回归到原来矩阵,怎么做?

    假设原矩阵(left( egin{array}{ccc} ext{1} & ext{0} & ext{0} \ ext{-3} & ext{1} & ext{0} \ ext{0} & ext{0} & ext{1} \ end{array} ight)) ,记作 (E) ,右侧是单位矩阵,记作 (I).

    [left( egin{array}{ccc} 1 & 0 & 0 \ 3 & 1 & 0 \ 0 & 0 & 1 \ end{array} ight) left( egin{array}{ccc} ext{1} & ext{0} & ext{0} \ ext{-3} & ext{1} & ext{0} \ ext{0} & ext{0} & ext{1} \ end{array} ight)=left( egin{array}{ccc} 1 & 0 & 0 \ 0 & 1 & 0 \ 0 & 0 & 1 \ end{array} ight) ]

    在(2,1)消元中,我们把方程2减去3倍方程1,过程反过来,就是方程2加上3倍方程1。

    (left( egin{array}{ccc} 1 & 0 & 0 \ 3 & 1 & 0 \ 0 & 0 & 1 \ end{array} ight))就是我们要的逆矩阵,记作 (E^{-1})

  • 相关阅读:
    POJ-1189 钉子和小球(动态规划)
    POJ-1191-棋盘分割(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
  • 原文地址:https://www.cnblogs.com/ckk-blog/p/13340439.html
Copyright © 2011-2022 走看看