< 目次

ブロック三重対称正定値行列の因数分解

目的

対称正定値ブロック三重対角行列のコレスキー因数分解を行う。

解決方法

対称正定値ブロック三重対角行列 (サイズ NB x NBN の正方形ブロック) のコレスキー因数分解を行います。

  1. 最初の対角ブロックのコレスキー因数分解を行います。

  2. N - 1 回対角線に沿って下に移動します。

    1. 三角係数の非対角ブロックを計算します。

    2. 新しく計算した非対角ブロックで対角ブロックを更新します。

    3. 対角ブロックのコレスキー因数分解を行います。

ソースコード: サンプル (https://www.intel.com/content/dam/develop/external/us/en/documents/mkl-cookbook-samples-120115.zip (英語)) の BlockTDS_SPD/source/dpbltrf.f ファイルを参照してください。GitHub の block_cholesky_decomposition (英語) も参照してください。

対称正定値ブロック三重対角行列のコレスキー因数分解

… 
CALL DPOTRF('L', NB, D, LDD, INFO) 
… 
DO K=1,N-1 
    CALL DTRSM('R', 'L', 'T', 'N', NB, NB, 1D0, D(1,(K-1)*NB+1), LDD, B(1,(K-1)*NB+1), LDB) 
    CALL DSYRK('L', 'N', NB, NB, -1D0, B(1,(K-1)*NB+1), LDB, 1D0, D(1,K*NB+1), LDD) 
    CALL DPOTRF('L', NB, D(1,K*NB+1), LDD, INFO) 
… 
END DO

使用されるルーチン

タスク

ルーチン

説明

対角ブロックのコレスキー因数分解を行う

DPOTRF

対称 (エルミート) 正定値行列のコレスキー因数分解を計算します。

三角係数の非対角ブロックを計算する

DTRSM

三角行列を含む方程式を解きます。

対角ブロックを更新する

DSYRK

対称ランク-k 更新を行います。

説明

対称正定値ブロック三重対角行列 (サイズ NB x NBN の対角ブロック Di および N - 1 の 1 つ下の対角ブロック Bi) は、次のように因数分解されます。



右の行列のブロックを乗算します。



オリジナルブロック三重対角行列の要素と乗算した係数の要素を等式にします。



Ci および LiLiT を解きます。



LiLiT の方程式の右辺はコレスキー因数分解であることに注意してください。このため、次のようなコードを使用して、コレスキー因数分解を行うルーチン chol() をこの問題に利用できます。

L1=chol(D1) 
do i=1,N-1
     Ci=Bi∙Li-T // trsm()
     Di + 1:=Di + 1 - Ci∙CiT // syrk()
     Li + 1=chol(Di + 1) 
end do