XLPack 6.1
Excel VBA 数値計算ライブラリ・リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ Zpotri()

Sub Zpotri ( Uplo As  String,
N As  Long,
A() As  Complex,
Info As  Long 
)

行列の逆行列 (正定値エルミート行列)

目的
本ルーチンはZpotrfにより計算されたコレスキー分解 A = U^H*U または A = L*L^H を用いて, 正定値エルミート行列Aの逆行列を求める.
引数
[in]Uplo= "U": 上三角行列UをA()に格納.
= "L": 下三角行列LをA()に格納.
[in]N行列Aの行および列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る)
[in,out]A()配列 A(LA1 - 1, LA2 - 1) (LA1 >= N, LA2 >= N)
[in] Zpotrfにより計算されたコレスキー分解 A = U^H*U または A = L*L^H の三角行列UまたはL.
[out] Info = 0の場合, Aの(エルミート)逆行列の上あるいは下三角部分. 入力のUまたはLを上書きする.
[out]Info= 0: 正常終了.
= -1: パラメータ Uplo の誤り. (Uplo <> "U"および"L")
= -2: パラメータ N の誤り. (N < 0)
= -3: パラメータ A() の誤り.
= i > 0: UまたはLのi番目の対角要素が0で, 逆行列を求めることができなかった.
出典
LAPACK
使用例
行列 A の逆行列を求める. ただし,
( 2.20 -0.11+0.93i 0.81-0.37i )
A = ( -0.11-0.93i 2.32 -0.80+0.92i )
( 0.81+0.37i -0.80-0.92i 2.29 )
とする.
Sub Ex_Zpotri()
Const N = 3
Dim A(N - 1, N - 1) As Complex, Info As Long
A(0, 0) = Cmplx(2.2, 0)
A(1, 0) = Cmplx(-0.11, -0.93): A(1, 1) = Cmplx(2.32, 0)
A(2, 0) = Cmplx(0.81, 0.37): A(2, 1) = Cmplx(-0.8, -0.92): A(2, 2) = Cmplx(2.29, 0)
Call Zpotrf("L", N, A(), Info)
If Info = 0 Then Call Zpotri("L", N, A(), Info)
Debug.Print "Inv(A) ="
Debug.Print Creal(A(0, 0)), Cimag(A(0, 0)), Creal(A(0, 1)), Cimag(A(0, 1))
Debug.Print Creal(A(0, 2)), Cimag(A(0, 2))
Debug.Print Creal(A(1, 0)), Cimag(A(1, 0)), Creal(A(1, 1)), Cimag(A(1, 1))
Debug.Print Creal(A(1, 2)), Cimag(A(1, 2))
Debug.Print Creal(A(2, 0)), Cimag(A(2, 0)), Creal(A(2, 1)), Cimag(A(2, 1))
Debug.Print Creal(A(2, 2)), Cimag(A(2, 2))
Debug.Print "Info =", Info
End Sub
Sub Zpotrf(Uplo As String, N As Long, A() As Complex, Info As Long)
係数行列のコレスキー分解 (正定値エルミート行列)
実行結果
Inv(A) =
0.96823675342099 0 0 0
0 0
-0.186364825657161 0.652567887151733 1.07415978942926 0
0 0
-0.669749382959094 -3.34014351483294E-03 0.335735031475792 0.692472480506973
1.06960504827267 0
Info = 0