从直接三角分解公式可以看出,当 u k k = 0 u_{kk} =0 ukk=0时,计算将中断,或者当 u k k u_{kk} ukk绝对值很小时,按分解公式计算可能引起舍入误差的累积,因此可采用与列主元消去法类似的方法,将直接三角分解法修改为选主元的三角分解法.
for k in range(0, n): # 换行
col_P_index = np.argmax(coef_mtrix[k:, k])
coef_mtrix[[k, col_P_index + k], :] = coef_mtrix[[col_P_index + k, k], :]
b_mtrix[[k,col_P_index+k]] = b_mtrix[[col_P_index+k,k]]
我们只需在三角分解法求 L , U L,U L,U矩阵前,将系数矩阵 A A A和矩阵 b b b进行选主元换行操作,即添加上述代码即可将三角分解法变为列主元三角分解法
在科学计算和实际工程应用中,经常遇到的是一些特殊类型的矩阵,由于它们具有良好的性质或者结构,因此可以给出更有效的三角分解公式以提高计算速度和节省存储空间.下面介绍三种特殊类型矩阵的三角分解法.
设A为对称矩阵,且有分解式 A = L U A=LU A=LU.为了利用 A A A的对称性,将 U U U再分解为
U = ( u 11 u 22 ⋱ u n n ) ( 1 u 12 / u 11 ⋯ u 1 n / u 11 1 ⋯ u 2 n / u 22 ⋱ ⋮ 1 ) = D U 0 U=\begin{pmatrix} u_{11}& & & \\ & u_{22}& & \\ & &\ddots& \\ & & &u_{nn} \end{pmatrix}\begin{pmatrix} 1&u_{12}/u_{11}&\cdots&u_{1n}/u_{11}\\ &1&\cdots&u_{2n}/u_{22}\\ & & \ddots &\vdots\\ && & 1 \end{pmatrix}=DU_0 U=⎝ ⎛u11u22⋱unn⎠ ⎞⎝ ⎛1u12/u111⋯⋯⋱u1n/u11u2n/u22⋮1⎠ ⎞=DU0
式中,D为对角矩阵,记为 D = d i a g ( d 1 , d 2 , ⋯ , d n ) , U 0 D= diag(d_1,d_2, \cdots,d_n),U_0 D=diag(d1,d2,⋯,dn),U0为单位上三角矩阵,于是有
A = L U = L D U 0 (3.14) A=LU=LDU_0\tag{3.14} A=LU=LDU0(3.14)
又 A = A T = U 0 T D L T A=A^T=U_0^TDL^T A=AT=U0TDLT
由分解的唯一性得 U 0 = L T U_0=L^T U0=LT,代入式 ( 3.14 ) (3.14) (3.14)中得到对称矩阵 A A A的分解式 A = L D L T A=LDL^T A=LDLT,式中 L L L是下单位下三角矩阵, D D D为对角矩阵。
由式 ( 3.10 ) (3.10) (3.10)、式 ( 3.11 ) (3.11) (3.11)可得对称矩阵A的三角分解的计算公式.
对于方程组 A x = b Ax =b Ax=b,设 A A A为对称正定矩阵,且有分解式 A = L D L T A= LDL^T A=LDLT,由A的对称正定性可知, D D D的对角元素均为正数,于是 D D D可分解为
D = ( d 1 d 2 ⋱ d n ) = ( d 1 d 2 ⋱ d n ) ( d 1 d 2 ⋱ d n ) = D 1 2 D 1 2 D=\begin{pmatrix} d_1\\ &d_2\\ &&\ddots\\ &&&d_n \end{pmatrix}=\begin{pmatrix} \sqrt{d_1}\\ &\sqrt{d_2}\\ &&\ddots\\ &&&\sqrt{d_n}\end{pmatrix}\begin{pmatrix} \sqrt{d_1}\\ &\sqrt{d_2}\\ &&\ddots\\ &&&\sqrt{d_n}\end{pmatrix}=D^{\frac{1}{2}}D^{\frac{1}{2}} D=⎝ ⎛d1d2⋱dn⎠ ⎞=⎝ ⎛d1d2⋱dn⎠ ⎞⎝ ⎛d1d2⋱dn⎠ ⎞=D21D21
由此得到
A = L D L T = L D 1 / 2 D 1 / 2 L T = ( L D 1 / 2 ) ( L D 1 / 2 ) T = G G T A=LDL^T=LD^{1/2}D^{1/2}L^T=(LD^{1/2})(LD^{1/2})^T=GG^T A=LDLT=LD1/2D1/2LT=(LD1/2)(LD1/2)T=GGT
式中, G = L D 1 2 G=LD^{\frac{1}{2}} G=LD21为下三角矩阵.
下面我们用直接分解的方法来确定计算G元素的计算公式,因为
A = ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ) = ( g 11 g 21 g 22 ⋮ ⋮ ⋱ g n 1 g n 2 ⋯ g n n ) ( g 11 g 21 ⋯ g n 1 g 22 ⋯ g n 2 ⋱ ⋮ g n n ) = G G T A=\begin{pmatrix} a_{11}&a_{12}&\cdots&a_{1n}\\ a_{21}&a_{22}&\cdots&a_{2n}\\ \vdots&\vdots&&\vdots\\ a_{n1}&a_{n2}&\cdots&a_{nn}\end{pmatrix}=\begin{pmatrix} g_{11}\\ g_{21}&g_{22}\\ \vdots&\vdots&\ddots\\ g_{n1}&g_{n2}&\cdots&g_{nn} \end{pmatrix}\begin{pmatrix} g_{11}&g_{21}& \cdots & g_{n1}\\ &g_{22}& \cdots & g_{n2}\\ & & \ddots & \vdots\\ &&&g_{nn} \end{pmatrix}=GG^T A=⎝ ⎛a11a21⋮an1a12a22⋮an2⋯⋯⋯a1na2n⋮ann⎠ ⎞=⎝ ⎛g11g21⋮gn1g22⋮gn2⋱⋯gnn⎠ ⎞⎝ ⎛g11g21g22⋯⋯⋱gn1gn2⋮gnn⎠ ⎞=GGT
式中, g i i > 0 ( i = 1 , 2 , ⋯ , n ) g_{ii}>0 (i=1,2,\cdots,n ) gii>0(i=1,2,⋯,n),由矩阵乘法及得 g i j = 0 ( i < j ) , g_{ij}=0(i
a i k = ∑ m = 1 n g i m g k m = ∑ m = 1 k − 1 g i m g k m + g i k g k k a_{ik}=\sum\limits_{m=1}^ng_{im}g_{km}=\sum\limits_{m=1}^{k-1}g_{im}g_{km}+g_{ik}g_{kk} aik=m=1∑ngimgkm=m=1∑k−1gimgkm+gikgkk
于是得对称正定矩阵 A A A的三角分解计算公式.
对于 k = 1 , 2 , ⋯ , n , k=1,2,\cdots,n, k=1,2,⋯,n,计算 G G G的第 k k k列元素
g k k = ( a k k − ∑ m = 1 k − 1 g k m 2 ) 1 2 (3.17) g_{kk}=(a_{kk}-\sum\limits_{m=1}^{k-1}g_{km}^2)^{\frac{1}{2}}\tag{3.17} gkk=(akk−m=1∑k−1gkm2)21(3.17)
g i k = ( a i k − ∑ m = 1 k − 1 g i m g k m ) / g k k , i = k + 1 , ⋯ , n (3.18) g_{ik}=(a_{ik}-\sum\limits_{m=1}^{k-1}g_{im}g_{km})/g_{kk},\quad i=k+1,\cdots,n \tag{3.18} gik=(aik−m=1∑k−1gimgkm)/gkk,i=k+1,⋯,n(3.18)
对称正定矩阵 A A A按 G G T GG^T GGT分解〔即按式 ( 3.17 ) (3.17) (3.17),式 ( 3.18 ) (3.18) (3.18)确定 G G G的元素]的方法称为平方根分解法,对称正定矩阵 A A A按 L D L T LDL^T LDLT分解称为改进平方根法.