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

◆ Zhbgvd()

Sub Zhbgvd ( Jobz As  String,
Uplo As  String,
N As  Long,
Ka As  Long,
Kb As  Long,
Ab() As  Complex,
Bb() As  Complex,
W() As  Double,
Z() As  Complex,
Info As  Long 
)

(分割統治法ドライバ) 一般化固有値問題 (エルミート帯行列)

目的
本ルーチンはエルミート帯行列の一般化固有値問題
Ax = λBx
のすべての固有値, および, 必要により固有ベクトルを求める. ここで, A と B はエルミート帯行列で, さらに B は正定値である.
固有ベクトルも求める場合, 分割統治法を使用する.
引数
[in]Jobz= "N": 固有値のみ求める.
= "V": 固有値と固有ベクトルを求める.
[in]Uplo= "U": A および B の上三角部分を格納する.
= "L": A および B の下三角部分を格納する.
[in]N行列 A および B の行および列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る)
[in]Ka行列 A の上帯幅(Uplo = "U" の場合)または下帯幅(Uplo = "L" の場合). (Ka >= 0)
[in]Kb行列 B の上帯幅(Uplo = "U" の場合)または下帯幅(Uplo = "L" の場合). (Kb >= 0)
[in,out]Ab()配列 Ab(LAb1 - 1, LAb2 - 1) (LAb1 >= Ka + 1, LAb2 >= N)
[in] エルミート帯行列 A の上または下三角部分を配列の最初の Ka+1 列に格納する. A のj列が配列 Ab() のj行に次のように格納される.
Uplo = "U": Ab(Ka + i - j, j) = Aij. ただし, max(0, j - Ka - 1) <= i <= j <= N - 1.
Uplo = "L": Ab(i - j, j) = Aij. ただし, 0 <= j <= i <= min(N - 1, j + Ka - 1).
[out] Ab() の内容は壊される.
[in,out]Bb()配列 Bb(LBb1 - 1, LBb2 - 1) (LBb1 >= Kb + 1, LBb2 >= N)
[in] 正定値エルミート帯行列 B の上または下三角部分を配列の最初の Kb+1 列に格納する. B のj列が配列 Bb() のj行に次のように格納される.
Uplo = "U": Bb(Kb + i - j, j) = Bij. ただし, max(0, j - Kb - 1) <= i <= j <= N - 1.
Uplo = "L": Bb(i - j, j) = Bij. ただし, 0 <= j <= i <= min(N - 1, j + Kb - 1).
[out] Dpbstf により求められたスプリットコレスキー分解 B = S^H*S の S が入る.
[out]W()配列 W(LW - 1) (LW >= N)
Info = 0 の場合, 求められた固有値(昇順).
[out]Z()配列 Z(LZ1 - 1, LZ2 - 1) (LZ1 >= N, LZ2 >= N)
Jobz = "V": Info = 0 の場合, 固有ベクトルからなる行列 Z を Z() に返す. W(i) に関連する固有ベクトルが Z() の i 列に入る. 固有ベクトルは Z^H*B*Z = I となるように正規化される.
Jobz = "N": Z() は参照されない.
[out]Info= 0: 正常終了
= -1: パラメータ Jobz の誤り (Jobz <> "V" および "N")
= -2: パラメータ Uplo の誤り (Uplo <> "U" および "L")
= -3: パラメータ N の誤り (N < 0)
= -4: パラメータ Ka の誤り (Ka < 0)
= -5: パラメータ Kb の誤り (Kb < 0 または Kb > Ka)
= -6: パラメータ Ab() の誤り.
= -7: パラメータ Bb() の誤り.
= -8: パラメータ W() の誤り.
= -9: パラメータ Z() の誤り.
= i (0 < i <= N): アルゴリズムが収束しなかった. 中間の3重対角形の非対角要素のうち i 個が 0 に収束しなかった.
= i (i > N): Zpbstf が Info = i-N を返した. B が正定値でない. B の分解が完了できず, 固有値・固有ベクトルは計算されなかった.
出典
LAPACK
使用例
一般化固有値問題 Ax = λBx の固有値および固有ベクトルを求める. ここで, Aはエルミート帯行列, Bは正定値エルミート帯行列である. ただし,
( 0.20 -0.11+0.93i 0 )
A = ( -0.11-0.93i -0.32 -0.80+0.92i )
( 0 -0.80-0.92i -0.29 )
( 2.20 -0.11+0.93i 0 )
B = ( -0.11-0.93i 2.32 -0.80+0.92i )
( 0 -0.80-0.92i 2.29 )
とする.
Sub Ex_Zhbgvd()
Const N = 3, Ka = 1, Kb = 1
Dim AB(Ka, N - 1) As Complex, Bb(Kb, N - 1) As Complex
Dim W(N - 1) As Double, Z(N - 1, N - 1) As Complex, Info As Long
AB(0, 0) = Cmplx(0.2): AB(0, 1) = Cmplx(-0.32): AB(0, 2) = Cmplx(-0.29)
AB(1, 0) = Cmplx(-0.11, -0.93): AB(1, 1) = Cmplx(-0.8, -0.92)
Bb(0, 0) = Cmplx(2.2): Bb(0, 1) = Cmplx(2.32): Bb(0, 2) = Cmplx(2.29)
Bb(1, 0) = Cmplx(-0.11, -0.93): Bb(1, 1) = Cmplx(-0.8, -0.92)
Call Zhbgvd("V", "L", N, Ka, Kb, AB(), Bb(), W(), Z(), Info)
Debug.Print "Eigenvalues =", W(0), W(1), W(2)
Debug.Print "Eigenvectors ="
Debug.Print Creal(Z(0, 0)), Cimag(Z(0, 0)), Creal(Z(0, 1)), Cimag(Z(0, 1))
Debug.Print Creal(Z(1, 0)), Cimag(Z(1, 0)), Creal(Z(1, 1)), Cimag(Z(1, 1))
Debug.Print Creal(Z(2, 0)), Cimag(Z(2, 0)), Creal(Z(2, 1)), Cimag(Z(2, 1))
Debug.Print Creal(Z(0, 2)), Cimag(Z(0, 2))
Debug.Print Creal(Z(1, 2)), Cimag(Z(1, 2))
Debug.Print Creal(Z(2, 2)), Cimag(Z(2, 2))
Debug.Print "Info =", Info
End Sub
実行結果
Eigenvalues = -2.33466883563969 4.53015245998351E-03 0.35977634455495
Eigenvectors =
0.47826114359381 -6.39634991743266E-18 0.507837765924616 -8.10231908112231E-19
9.59938458849389E-02 0.811584333390847 1.21596344669029E-02 0.102804182311088
-0.441771484124975 0.486432071889564 0.281208537371776 -0.309637123223847
0.332163577636529 2.56485488839366E-18
-3.84923101537441E-02 -0.325434985845291
-0.154385502431493 0.169992999811227
Info = 0