zoukankan      html  css  js  c++  java
  • 线性代数04.A的LU分解

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

    乘积的逆

    两矩阵 (A、B) 相乘,且他们的逆均已知,那么他们的乘积 ((A.B)) 的逆是什么?

    先说结果,((A.B)) 的逆就是 ((B^{-1}.A^{-1})) ,即

    [(A.B)(B^{-1}.A^{-1})=I ]

    我们可以把括号消掉,根据乘法结合律,就能得到单位矩阵。

    为什么逆矩阵顺序要反过来?

    就像:先脱鞋子,再脱袜子,那么其逆过程就是,先穿袜子,再穿鞋子。

    就是说,矩阵乘法顺序不能交换,必须先合成一个单位矩阵,然后再把两边矩阵再合成单位矩阵。

    同理,我们进行左乘((B^{-1}.A^{-1}))也可以得到单位矩阵,即

    [(B^{-1}.A^{-1})(A.B)=I ]

    转置

    将矩阵的行列互换得到的新矩阵称为转置矩阵。

    例如

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

    转置后,变为

    [A^T=left( egin{array}{cc} 1 & 4 \ 2 & 5 \ 3 & 6 \ end{array} ight) ]

    转置矩阵用右上标加 (T) 表示。他将 (m*n) 矩阵,变为 (n*m)

    如果转置某可逆矩阵(B), 那么其转置(B^{T})的逆是什么?

    我们可以从(B.B^{-1}=I) 开始,

    两边同时转置,单位矩阵因为其对称性,转置后还是单位矩阵,

    [left(B^{-1} ight)^T。 B^T=I ]

    可以看出,(B^T) 的逆就是 (left(B^{-1} ight)^T) ,也就是 (B) 的逆矩阵的转置。

    A的LU分解

    前面的课程我们从矩阵 (A) 得到上三角矩阵 (U) ,是否存在一个矩阵(L),直接描述 (A)(U) 联系?

    (2*2) 矩阵

    举例:我们将矩阵 (A) 消元,得到上三角矩阵 (U).((upper)

    [left( egin{array}{cc} 1 & 0 \ -4 & 1 \ end{array} ight).left( egin{array}{cc} 2 & 1 \ 8 & 7 \ end{array} ight)=left( egin{array}{cc} 2 & 1 \ 0 & 3 \ end{array} ight) ]

    [E_{21}quad.quad Aquad\,\,\,\,\,= quad U ]

    那么什么矩阵能让我们得到 (A=L.U) ?我们两边同时乘以 (E_{21}) 的逆,就能得到,(L) 就是(E_{21}) 的逆。注意两边都是左乘。

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

    [Aquad=quad Lquad\,\,\,\,\,. quad U ]

    (L) 表示下三角矩阵((lower))。

    有时会把 (U) 的主元单独列出来:

    [left( egin{array}{cc} 2 & 1 \ 8 & 7 \ end{array} ight)=left( egin{array}{cc} 1 & 0 \ 4 & 1 \ end{array} ight).left( egin{array}{cc} 2 & 0 \ 0 & 3 \ end{array} ight).left( egin{array}{cc} 1 & frac{1}{2} \ 0 & 1 \ end{array} ight) ]

    这个式子叫做 (LDU) 分解。

    (3*3) 矩阵

    假设矩阵 (A) ,我们通过消元得到 (U)

    [E_{32}.E_{31}.E_{21}.A=U ]

    矩阵 (L)就是各次消元矩阵的逆反顺序相乘:

    [A=E_{21}^{-1}.E_{31}^{-1}.E_{32}^{-1}.U ]

    到底为什么要写成这种逆的形式?而不用上面式子直接表示?

    举例:

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

    其中 (E_{31}) 是单位矩阵,下面我们相乘

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

    这是要求的总的消元矩阵 (E)

    然后进行逆反顺序相乘:

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

    这就是要求的矩阵 (L)

    可以看出,在L中不会出现像例子中E31(10)这项,这种因为消元产生的次生项,L比E更干净整洁,能一步到位写出来,这种书写能提高计算速度。

    L矩阵只要得到主元的比值即可直接写出。

    总结

    对于 (A=L.U) ,如果不存在行交换,消元乘数可以直接写入 (L) 中。

    意义

    (LU) 分解的意义,在于优化计算速度(相比顺序高斯消元法)。

    在一些实际应用场景中,如果求解方程 (Ax=b),系数矩阵 (A) 固定,(b) 是随输入变化的,求解不同的 (x)。这时 (LU) 分解就十分有用,通过将 (A) 预处理(分解),大大减少操作步骤。

    通过将 (A) 分解,方程(Ax=b) 可以写成 (L.(Ux)=b) 形式,把(Ux) 替换为 (y) ,可以求解下面两个方程求解 (x) .

    [L y=b\ U x=y ]

    引用在其他地方看到的例子说明:https://blog.csdn.net/wo94chunjie/article/details/103859745

    已知

    [A=left( egin{array}{cccc} 3 & -7 & -2 & 2 \ -3 & 5 & 1 & 0 \ 6 & -4 & 0 & -5 \ -9 & 5 & -5 & -12 \ end{array} ight)=left( egin{array}{cccc} 1 & 0 & 0 & 0 \ -3 & 1 & 0 & 0 \ 6 & -4 & 1 & 0 \ -9 & 5 & -5 & 1 \ end{array} ight).left( egin{array}{cccc} 3 & -7 & -2 & 2 \ 0 & -2 & -1 & 2 \ 0 & 0 & -1 & 0 \ 0 & 0 & 0 & -1 \ end{array} ight)= ext{LU}\ ]

    假设 (b=left( egin{array}{c} -9 \ 5 \ 7 \ 11 \ end{array} ight))

    应用 (A)(LU) 分解求解 (Ax=b)

    1)解 (L y=b) ,仅需6次乘法和6次加法

    [[Lquad U]=left( egin{array}{ccccc} 1 & 0 & 0 & 0 & -9 \ -3 & 1 & 0 & 0 & 5 \ 6 & -4 & 1 & 0 & 7 \ -9 & 5 & -5 & 1 & 11 \ end{array} ight) ightarrow left( egin{array}{ccccc} 1 & 0 & 0 & 0 & -9 \ 0 & 1 & 0 & 0 & -4 \ 0 & 0 & 1 & 0 & 5 \ 0 & 0 & 0 & 1 & 1 \ end{array} ight)=[Iquad y] ]

    2)解 (U x=y) ,需要4次除法、6次乘法和6次加法

    [[Uquad y]=left( egin{array}{ccccc} 3 & -7 & -2 & 2 & -9 \ 0 & -2 & -1 & 2 & -4 \ 0 & 0 & -1 & 1 & 5 \ 0 & 0 & 0 & -1 & 1 \ end{array} ight) ightarrow left( egin{array}{ccccc} 1 & 0 & 0 & 0 & 3 \ 0 & 1 & 0 & 0 & 4 \ 0 & 0 & 1 & 0 & -6 \ 0 & 0 & 0 & 1 & -1 \ end{array} ight) ]

    解得 (x=left( egin{array}{c} 3 \ 4 \ -6 \ -1 \ end{array} ight))

    以上过程共需28次算术运算,不包括求(L)(U)的运算在内.

    而一开始就采用消元法,将 ([A quad x]) 化简为 ([I quad x]),则需要62次运算,因为中间需要对大量分量元素参与。

    步骤数

    如果对 (100*100) 的矩阵进行高斯消元,得到上三角矩阵 (U) ,需要多少次操作?规定乘法+减法=一次操作。

    对第一列消元大约 (100^{2}) 次。按照计算机思想,每一行有n个元素,按照改变一个元素的值算一次运算。

    第二列就大约需要 (99^{2}) 次 ,以此类推。

    [ ext{count}approx 100^2+99^2+98^2+ ext{...}+2^2+1^2 ]

    得出规律:

    [ ext{count}approx n^2+(n-1)^2+(n-2)^2+ ext{...}+2^2+1^2approxfrac{n^3}{3} ]

    运用积分运算,对 (x^{2}) 从1到 (n) 积分 就可以算出。

    考虑右侧向量 (b) ,需要对其进行 (n^{2}) 次操作。

    置换矩阵

    当出现主元为0 的情况下,我们就需要进行行交换。而置换矩阵可以用来进行行交换。

    对于 3*3 矩阵,置换矩阵共有6种:

    1.单元矩阵(不变): (left(egin{array}{ccc} 1 & 0 & 0 \ 0 & 1 & 0 \ 0 & 0 & 1 \ end{array} ight))

    2.同时交换一次:
    (left( egin{array}{ccc} 0 & 1 & 0 \ 1 & 0 & 0 \ 0 & 0 & 1 \ end{array} ight)) , (left( egin{array}{ccc} 0 & 0 & 1 \ 0 & 1 & 0 \ 1 & 0 & 0 \ end{array} ight)) , (left( egin{array}{ccc} 1 & 0 & 0 \ 0 & 0 & 1 \ 0 & 1 & 0 \ end{array} ight))

    3.同时交换两次(想象每行同时向上循环移动一次):
    (left( egin{array}{ccc} 0 & 1 & 0 \ 0 & 0 & 1 \ 1 & 0 & 0 \ end{array} ight)),(left( egin{array}{ccc} 0 & 0 & 1 \ 1 & 0 & 0 \ 0 & 1 & 0 \ end{array} ight)) .

    对于4*4矩阵,就共有24种。

    置换性质

    对3*3的置换求逆,会发现其逆都在这6个矩阵中,比如
    (left(egin{array}{ccc} 0 & 1 & 0 \ 1 & 0 & 0 \ 0 & 0 & 1 \ end{array} ight)) 就是其本身,(left( egin{array}{ccc} 0 & 1 & 0 \ 0 & 0 & 1 \ 1 & 0 & 0 \ end{array} ight)),(left( egin{array}{ccc} 0 & 0 & 1 \ 1 & 0 & 0 \ 0 & 1 & 0 \ end{array} ight)) 互为逆。

    置换矩阵的逆是其转置。

  • 相关阅读:
    第二十二章 Django会话与表单验证
    第二十章 Django数据库实战
    第十九章 Django的ORM映射机制
    第十八章 DjangoWeb开发框架
    第三章 函数与变量
    第二章 基本数据结构
    第一章 介绍与循环
    pyhton 关于 configparser 配置 模块 实践使用中碰到的坑
    easyui----combo组件
    servlet 单例多线程
  • 原文地址:https://www.cnblogs.com/ckk-blog/p/13486670.html
Copyright © 2011-2022 走看看