天天看点

《计算方法》笔记之(三)线性代数方程组之 矩阵分解Gauss 消去法的矩阵意义矩阵的 LU 分解其它的三角分解带状矩阵的分解矩阵分解的应用

目录

  • Gauss 消去法的矩阵意义
  • 矩阵的 LU 分解
  • 其它的三角分解
    • LDU 分解
    • 对称正定矩阵
  • 带状矩阵的分解
    • 三对角阵的分解
  • 矩阵分解的应用
    • 1.求解方程组 $Ax=b$ 的解
    • 2.求矩阵行列式
    • 3.求矩阵的逆
    • 4.求解成组方程组

Gauss 消去法的矩阵意义

注意:这里面讨论的不是列主元高斯消去法,所以算法可能不稳定。

《计算方法》笔记之(三)线性代数方程组之 矩阵分解Gauss 消去法的矩阵意义矩阵的 LU 分解其它的三角分解带状矩阵的分解矩阵分解的应用

根据《线性代数》我们知道,对于矩阵 A 行初等变换相当于左乘相应初等矩阵,对于矩阵 A 列初等变换相当于右乘相应初等矩阵。

《计算方法》笔记之(三)线性代数方程组之 矩阵分解Gauss 消去法的矩阵意义矩阵的 LU 分解其它的三角分解带状矩阵的分解矩阵分解的应用
《计算方法》笔记之(三)线性代数方程组之 矩阵分解Gauss 消去法的矩阵意义矩阵的 LU 分解其它的三角分解带状矩阵的分解矩阵分解的应用

由此可知:

A = L U A=LU A=LU

即 A 可以表示成为一个单位下三角阵 L 与一个上三角阵 U 的乘积

这就是矩阵的 LU 分解,也称为三角分解或 Doolittle 分解

矩阵的 LU 分解

那是不是所有的方阵都能够进行 LU 分解呢,如果不是,那又是哪些能够进行 LU 分解呢?

联系前面我们知道 Gauss 消元法顺利进行的条件是各个消元的主元不为 0 (即 a k k ( k − 1 ) ≠ 0 a_{kk}^{(k-1)} \neq 0 akk(k−1)​̸​=0 )。我们知道,能够进行 Gauss 消元与能够进行 LU 分解是等价的, Gauss 消元法也可以用来求行列式。

若将矩阵 A 的左上方各阶顺序主子矩阵记为 A 1 , A 2 , . . . , A n A_1,A_2,...,A_n A1​,A2​,...,An​ 。使用高斯消元法使得第 k 个消元的主元如果为 0 ,那么 d e t ( A k ) = 0 det(A_k)=0 det(Ak​)=0 ,所以有:

若 n 阶方阵的各阶顺序主子行列式不为 0 ,则存在唯一的单位下三角矩阵 L 和上三角矩阵 U ,满足 A=LU

由此定理可以得到 LU 分解的计算公式:

《计算方法》笔记之(三)线性代数方程组之 矩阵分解Gauss 消去法的矩阵意义矩阵的 LU 分解其它的三角分解带状矩阵的分解矩阵分解的应用

对于 A 中的每一项,有

《计算方法》笔记之(三)线性代数方程组之 矩阵分解Gauss 消去法的矩阵意义矩阵的 LU 分解其它的三角分解带状矩阵的分解矩阵分解的应用

因此得到 LU 分解的每项的计算公式:

{ μ 1 j = α 1 j , j = 1 , 2 , . . . , n l i 1 = α i 1 μ 11 , i = 2 , 3 , . . . , n μ i j = α i j − ∑ k = 1 i − 1 l i k u k j , j = i , i + 1 , . . . , n , i = 2 , 3 , . . , n l k i = 1 μ i i ( α k i − ∑ t = 1 i − 1 l k t μ t i ) , k = i + 1 , . . . , n , i = 2 , 3 , . . , n \left\{ \begin{array}{l} {\mu _{1j}} = {\alpha _{1j}}{\rm{ }},j = 1,2,...,n\\ {l_{i1}} = \frac{{{\alpha _{i1}}}}{{{\mu _{11}}}}{\rm{ }},i = 2,3,...,n\\ {\mu _{ij}} = {\alpha _{ij}} - \sum\limits_{k = 1}^{i - 1} {{l_{ik}}{u_{kj}}} {\rm{ }},j = i,i + 1,...,n,i = 2,3,..,n\\ {l_{ki}} = \frac{1}{{{\mu _{ii}}}}({\alpha _{ki}} - \sum\limits_{t = 1}^{i - 1} {{l_{kt}}{\mu _{ti}}} ){\rm{ }},k = i + 1,...,n,i = 2,3,..,n \end{array} \right. ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​μ1j​=α1j​,j=1,2,...,nli1​=μ11​αi1​​,i=2,3,...,nμij​=αij​−k=1∑i−1​lik​ukj​,j=i,i+1,...,n,i=2,3,..,nlki​=μii​1​(αki​−t=1∑i−1​lkt​μti​),k=i+1,...,n,i=2,3,..,n​

所以要先计算 U 中的第 i 行元素,再计算 L 中的第 i 列元素(因为计算 L 中的第 i 列元素需要知道 u i i u_{ii} uii​ )。总的时间复杂度为 O ( n 3 ) O(n^3) O(n3) 。

我们在存储时,可以将 LU 存储在一个矩阵中,减小空间消耗:

( a 11 ( 0 ) a 12 ( 0 ) a 13 ( 0 ) ⋯ a 1 n ( 0 ) β 1 ( 0 ) l 21 a 22 ( 1 ) a 23 ( 1 ) ⋯ a 2 n ( 1 ) β 2 ( 1 ) l 31 l 32 a 33 ( 2 ) ⋯ a 3 n ( 2 ) β 3 ( 2 ) ⋱ ⋮ ⋮ l n 1 l n 2 l n 3 ⋯ a n n ( n − 1 ) β n ( n − 1 ) ) {\begin{pmatrix} {a_{11}^{(0)}}&{a_{12}^{(0)}}&{a_{13}^{(0)}}& \cdots &{a_{1n}^{(0)}}&{\beta _1^{(0)}}\\ {{l_{21}}}&{a_{22}^{(1)}}&{a_{23}^{(1)}}& \cdots &{a_{2n}^{(1)}}&{\beta _2^{(1)}}\\ {{l_{31}}}&{{l_{32}}}&{a_{33}^{(2)}}& \cdots &{a_{3n}^{(2)}}&{\beta _3^{(2)}}\\ {}&{}&{}& \ddots & \vdots & \vdots \\ {{l_{n1}}}&{{l_{n2}}}&{{l_{n3}}}& \cdots &{a_{nn}^{(n - 1)}}&{\beta _n^{(n - 1)}} \end{pmatrix}} ⎝⎜⎜⎜⎜⎜⎜⎛​a11(0)​l21​l31​ln1​​a12(0)​a22(1)​l32​ln2​​a13(0)​a23(1)​a33(2)​ln3​​⋯⋯⋯⋱⋯​a1n(0)​a2n(1)​a3n(2)​⋮ann(n−1)​​β1(0)​β2(1)​β3(2)​⋮βn(n−1)​​⎠⎟⎟⎟⎟⎟⎟⎞​

故而空间复杂度为 O ( n 2 ) O(n^2) O(n2) 。

其它的三角分解

LDU 分解

对于上三角矩阵 U ,如果 U 的对角元存在 0 ,则 d e t ( U ) = 0 det(U)=0 det(U)=0 。所以当 A 的三角分解存在时,上三角矩阵 U 的全体对角元 u k k ≠ 0 u_{kk}\neq 0 ukk​̸​=0,若令

D = d i a g ( u 11 , u 22 , . . . , u n n ) D=diag(u_{11},u_{22},...,u_{nn}) D=diag(u11​,u22​,...,unn​)

则可以将 LU 分解转化为:

A = L U = L D D − 1 U = L D M T A=LU=LDD^{-1}U=LDM^T A=LU=LDD−1U=LDMT

我们知道 D − 1 = d i a g ( 1 u 11 , 1 u 22 , . . . , 1 u n n ) D^{-1}=diag(\frac 1 {u_{11}},\frac 1 {u_{22}},...,\frac 1 {u_{nn}}) D−1=diag(u11​1​,u22​1​,...,unn​1​), D − 1 U D^{-1}U D−1U 为单位上三角矩阵。

M T M^T MT 为单位上三角矩阵

M = ( 1 m 21 1 m 31 m 32 1 ⋮ ⋮ ⋮ ⋱ m n 1 m n 2 m n 3 ⋯ 1 ) , m j i = μ i j μ i i , ( i = 1 , 2 , . . . , n − 1 ; j = n + 1 , . . . , n ) M = {\begin{pmatrix} 1&{}&{}&{}&{}\\ {{m_{21}}}&1&{}&{}&{}\\ {{m_{31}}}&{{m_{32}}}&1&{}&{}\\ \vdots & \vdots & \vdots & \ddots &{}\\ {{m_{n1}}}&{{m_{n2}}}&{{m_{n3}}}& \cdots &1 \end{pmatrix}} ,{m_{ji}} = \frac{{{\mu _{ij}}}}{{{\mu _{ii}}}},\begin{array}{l} (i = 1,2,...,n - 1;\\ j = n + 1,...,n) \end{array} M=⎝⎜⎜⎜⎜⎜⎛​1m21​m31​⋮mn1​​1m32​⋮mn2​​1⋮mn3​​⋱⋯​1​⎠⎟⎟⎟⎟⎟⎞​,mji​=μii​μij​​,(i=1,2,...,n−1;j=n+1,...,n)​

其中 LDU 分解和 LU 分解的条件是一样的。

我们知道,矩阵的 LU 分解能够通过计算式计算出来,那么 L 、 D 、 M 的元的公式也可以通过 LU 的元的公式计算出来。

{ d k = α k k − ∑ p = 1 k − 1 l k p ( d p m k p ) l i k = 1 d k [ α i k − ∑ p = 1 k − 1 l i p ( d p m k p ) ] m i k = 1 d k [ α k i − ∑ p = 1 k − 1 ( l k p d p ) m i p ) ] k = 1 , 2 , . . . , n , i = k + 1 , k + 2 , . . . , n \left\{ \begin{matrix} {d_k} = {\alpha _{kk}} - \sum\limits_{p = 1}^{k - 1} {{l_{kp}}({d_p}{m_{kp}})} {\rm{ }}\\ {l_{ik}} = \frac{1}{{{d_k}}}[{\alpha _{ik}} - \sum\limits_{p = 1}^{k - 1} {{l_{ip}}({d_p}{m_{kp}})]} \\ {m_{ik}} = \frac{1}{{{d_k}}}[{\alpha _{ki}} - \sum\limits_{p = 1}^{k - 1} {({l_{kp}}{d_p}){m_{ip}})]} {\rm{ }}\\ {\rm{ }}k = 1,2,...,n,i = k + 1,k + 2,...,n \end{matrix} \right. ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​dk​=αkk​−p=1∑k−1​lkp​(dp​mkp​)lik​=dk​1​[αik​−p=1∑k−1​lip​(dp​mkp​)]mik​=dk​1​[αki​−p=1∑k−1​(lkp​dp​)mip​)]k=1,2,...,n,i=k+1,k+2,...,n​

时间复杂度为 O ( n 3 ) O(n^3) O(n3) 。

当 A 为对称矩阵时(即 A T = A A^T=A AT=A),有 A = L D M T A=LDM^T A=LDMT ,则:

A = A T = M D L T A=A^T=MDL^T A=AT=MDLT,又因为 A 的 LDU 分解具有唯一性,所以:

M = L M=L M=L

所以,当 A 对称时,有分解式:

A = L D L T A=LDL^T A=LDLT

此时,只需要计算 L 和 D ,计算量减少约一半。

对称正定矩阵

任何对称正定矩阵 A 都存在唯一的下三角矩阵 G,满足 A = G G T A=GG^T A=GGT

理由如下:

在实际应用中,对称正定矩阵非常重要和常见。

在线性代数中,正定矩阵等价于顺序主子式全大于 0 ,即可以进行 LU 分解或者 LDU 分解。

只要 A 对称且可以分解,那么 A = L D L T A=LDL^T A=LDLT 成立,令 D 1 2 = d i a g ( d 1 , d 2 , . . . , d n , ) D^{\frac 1 2}=diag(\sqrt {d_1},\sqrt {d_2},...,\sqrt {d_n},) D21​=diag(d1​

​,d2​

​,...,dn​

​,)

令 G = L D 1 2 G=LD^{\frac 1 2} G=LD21​

则 A = L D L T = L D 1 2 D 1 2 L T = G G T A=LDL^T=LD^{\frac 1 2}D^{\frac 1 2}L^T=GG^T A=LDLT=LD21​D21​LT=GGT

称为 G 的Cholesky 分解

带状矩阵的分解

带状矩阵在有限元分析等实际应用场景非常普遍,所以非常重要。

定义:设 A = ( α i j ) A=(\alpha_{ij}) A=(αij​) 是 n 阶方阵,对于小于 n 的正整数 p 和 q ,当 j>i+p 或 i>j+p 时,有 α i j = 0 \alpha_{ij}=0 αij​=0 ,则称 A 是具有上带宽 q 和下带宽 p 的带状矩阵。

分解结果:

设 n 阶矩阵 A 有 LU 分解, A=LU,如果 A 是上下带宽分别为 q 和 p 的带状矩阵,则 L 是带宽为 p 的下三角矩阵, U 是带宽为 q 的上三角矩阵。

计算公式:

{ μ i j = α i j − ∑ t = max ⁡ { 1 , i − p , j − q } i − 1 l i t μ t j , j = i , i + 1 , . . . , min ⁡ { n , i + q } l k i = 1 μ i i ( α k i − ∑ t = max ⁡ { 1 , k − p , i − q } i − 1 l i t μ t j ) , k = i + 1 , . . . , min ⁡ { n , i + p } \left\{ \begin{array}{l} {\mu _{{\rm{ij}}}} = {\alpha _{ij}} - \sum\limits_{t = \max \{ 1,i - p,j - q\} }^{i - 1} {{l_{it}}{\mu _{tj}},j = i,i + 1,...,\min \{ n,i + q\} } \\ {l_{ki}} = \frac{1}{{{\mu _{ii}}}}({\alpha _{ki}} - \sum\limits_{t = \max \{ 1,k - p,i - q\} }^{i - 1} {{l_{it}}{\mu _{tj}}),k = i + 1,...,\min \{ n,i + p\} } \end{array} \right. ⎩⎪⎪⎪⎨⎪⎪⎪⎧​μij​=αij​−t=max{1,i−p,j−q}∑i−1​lit​μtj​,j=i,i+1,...,min{n,i+q}lki​=μii​1​(αki​−t=max{1,k−p,i−q}∑i−1​lit​μtj​),k=i+1,...,min{n,i+p}​

只需要计算带状矩阵中不为 0 的元素,所以运算量比 O ( n 3 ) O(n^3) O(n3) 小得多, p 和 q 固定时,运算量是 O ( n ) O(n) O(n)

三对角阵的分解

当 p=q=1 时,此时的带状矩阵称为三对角阵

T = ( b 1 c 1 a 2 b 2 c 2 a 3 b 3 c 3 ⋱ ⋱ ⋱ a n − 1 b n − 1 c n − 1 a n b n ) {\rm{ }}T = {\begin{pmatrix} {{b_1}}&{{c_1}}&{}&{}&{}&{}\\ {{a_2}}&{{b_2}}&{{c_2}}&{}&{}&{}\\ {}&{{a_3}}&{{b_3}}&{{c_3}}&{}&{}\\ {}&{}& \ddots & \ddots & \ddots &{}\\ {}&{}&{}&{{a_{n - 1}}}&{{b_{n - 1}}}&{{c_{n - 1}}}\\ {}&{}&{}&{}&{{a_n}}&{{b_n}} \end{pmatrix}} {\rm{ }} T=⎝⎜⎜⎜⎜⎜⎜⎛​b1​a2​​c1​b2​a3​​c2​b3​⋱​c3​⋱an−1​​⋱bn−1​an​​cn−1​bn​​⎠⎟⎟⎟⎟⎟⎟⎞​

根据带状矩阵分解的定理,上面带状矩阵可以被分解为:

L = ( 1 l 2 1 l 3 1 ⋱ ⋱ l n 1 ) U = ( μ 1 r 1 μ 2 r 2 ⋱ ⋱ μ n − 1 r n − 1 μ n ) L = \left( {\begin{matrix} 1&{}&{}&{}&{}\\ {{l_2}}&1&{}&{}&{}\\ {}&{{l_3}}&1&{}&{}\\ {}&{}& \ddots & \ddots &{}\\ {}&{}&{}&{{l_n}}&1 \end{matrix}} \right) U = \left( {\begin{matrix} {{\mu _1}}&{{r_1}}&{}&{}&{}\\ {}&{{\mu _2}}&{{r_2}}&{}&{}\\ {}&{}& \ddots & \ddots &{}\\ {}&{}&{}&{{\mu _{n - 1}}}&{{r_{n - 1}}}\\ {}&{}&{}&{}&{{\mu _n}} \end{matrix}} \right) L=⎝⎜⎜⎜⎜⎛​1l2​​1l3​​1⋱​⋱ln​​1​⎠⎟⎟⎟⎟⎞​U=⎝⎜⎜⎜⎜⎛​μ1​​r1​μ2​​r2​⋱​⋱μn−1​​rn−1​μn​​⎠⎟⎟⎟⎟⎞​

因此得到计算公式:

{ μ 1 = b 1 , r 1 = c 1 l k = α k μ k − 1 , μ k = b k − l k r k − 1 , r k = c k . k = 2 , 3 , . . . , n \left\{ \begin{matrix} {\mu _1} = {b_1},{r_1} = {c_1}\\ {l_k} = \frac{{{\alpha _k}}}{{{\mu _{k - 1}}}},{\mu _k} = {b_k} - {l_k}{r_{k - 1}},{r_k} = {c_k}.k = 2,3,...,n \end{matrix} \right. {μ1​=b1​,r1​=c1​lk​=μk−1​αk​​,μk​=bk​−lk​rk−1​,rk​=ck​.k=2,3,...,n​

求解三对角方程组: T x = d Tx=d Tx=d,其中 d = ( d 1 , d 2 , . . . , d n ) T d={(d_1,d_2,...,d_n)}^T d=(d1​,d2​,...,dn​)T ,将 T 进行三角分解 T=LU ,则 LUx=d,令 y=Ux ,则 Ly=d,得到计算 x 和 y 的公式:

可以推导出:

追的过程(从前往后):

{ y 1 = d 1 y k = d k − l k y k − 1 , k = 2 , 3 , . . . , n \left\{ \begin{array}{l} {y_1} = {d_1}\\ {y_k} = {d_k} - {l_k}{y_{k - 1}},k = 2,3,...,n \end{array} \right. {y1​=d1​yk​=dk​−lk​yk−1​,k=2,3,...,n​

赶的过程(从后往前):

{ x n = y n μ n x k = 1 μ k ( y k − r k x k + 1 ) , k = n − 1 , n − 2 , . . . , 2 , 1 \left\{ \begin{array}{l} {x_n} = \frac {y_n} {\mu _n}\\ {x_k} = \frac{1}{{{\mu _k}}}({y_k} - {r_k}{x_{k + 1}}),k = n - 1,n - 2,...,2,1 \end{array} \right. {xn​=μn​yn​​xk​=μk​1​(yk​−rk​xk+1​),k=n−1,n−2,...,2,1​

所以该方法被称为追赶法。

矩阵分解的应用

若对 A 进行 LU 分解

1.求解方程组 A x = b Ax=b Ax=b 的解

原方程等价于:

{ L y = b U x = y \left\{ \begin{array}{l} Ly = b\\ Ux = y \end{array} \right. {Ly=bUx=y​

则可以通过类似三对角方程组追赶法求解。 LU 分解的时间复杂度为 O ( n 3 ) O(n^3) O(n3) ,之后的求解过程的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

2.求矩阵行列式

det ⁡ ( A ) = det ⁡ ( L ) det ⁡ ( U ) \det (A) = \det (L)\det (U) det(A)=det(L)det(U)

因为 L 是单位下三角矩阵,所以

det ⁡ ( A ) = det ⁡ ( L ) det ⁡ ( u ) = det ⁡ ( u ) = μ 11 μ 22 ⋯ μ n n \det (A) = \det (L)\det (u) = \det (u) = {\mu _{11}}{\mu _{22}} \cdots {\mu _{nn}} det(A)=det(L)det(u)=det(u)=μ11​μ22​⋯μnn​

3.求矩阵的逆

对称矩阵 A 进行 LDU 分解有 A = L D L T A=LDL^T A=LDLT , A − 1 = L − T D − 1 L − 1 {A^{ - 1}} = {L^{ - T}}{D^{ - 1}}{L^{ - 1}} A−1=L−TD−1L−1

D − 1 = d i a g ( d 1 − 1 , d 2 − 1 , . . . , d n − 1 ) {D^{ - 1}} = diag(d_1^{ - 1},d_2^{ - 1},...,d_n^{ - 1}) D−1=diag(d1−1​,d2−1​,...,dn−1​)

L − 1 L^{-1} L−1 是单位下三角矩阵,由追赶法可以解出 L − 1 L^{-1} L−1 ,进而求出 A − 1 A^{-1} A−1

4.求解成组方程组

若有一系列方程组

A x = B k ( k = 1 , . . . , m , m ≥ 1 ) Ax = {B_k}{\rm{ (}}k = 1,...,m,m \ge 1) Ax=Bk​(k=1,...,m,m≥1)

若 A 存在 LU 分解, A=LU ,

{ L y = B k U x = y \left\{ \begin{array}{l} Ly = {B_k}\\ Ux = y \end{array} \right. {Ly=Bk​Ux=y​

对每个 B k {B_k} Bk​ 分别按照求解方程组的方法就可以求解成组方程组。

继续阅读