LU分解、修正コレスキー分解(LDL')、コレスキー分解(LL')

LU分解  A=LU →Aが正則行列のとき
修正コレスキー分解  A=LDL^T →Aがエルミート行列のとき
コレスキー分解  A=LL^T →Aがエルミート行列かつ正定値行列のとき

 L = M_1^{-1} \cdot M_2^{-1} \cdots M_{n-1}^{-1}
ここで、行列[M_k]は以下で定義する。
 M_k = \begin{pmatrix}
1\\
0&1\\
0&0&\cdots&1\\
0&0&\cdots&-m_{k+1 k}&1\\
0&0&\cdots&-m_{k+2 k}&0&1\\
\vdots&\vdots& &\vdots &\vdots \\
0&0&\cdots&-m_{nk}&0&\cdots&0&1
\end{pmatrix}

 m_{ik}=a_{ik}^{(k)} / a_{kk}^{(k)} →ピボット a_{kk}で割る

計算例

clear;
A = [10  6  2; 
     6  5  2; 
     2  2  1];
b = [1 2 3]';
M1 = [1 0 0;
     -0.6 1 0;
     -0.2 0 1];
M2 = [1 0 0;
      0 1 0;
      0 -4/7 1];
L = inv(M1)*inv(M2);
U = inv(L)*A;
D = inv(L)*A*inv(L');
D1=sqrt(D);
L1=L*D1;
%check
A
LU=real(L*U)
LDL=real(L*D*L')
LL=real(L1*L1')

出力

A =
    10     6     2
     6     5     2
     2     2     1
LU =
   10.0000    6.0000    2.0000
    6.0000    5.0000    2.0000
    2.0000    2.0000    1.0000
LDL =
   10.0000    6.0000    2.0000
    6.0000    5.0000    2.0000
    2.0000    2.0000    1.0000
LL =
   10.0000    6.0000    2.0000
    6.0000    5.0000    2.0000
    2.0000    2.0000    1.0000

すべてもとの行列Aに一致している