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

◆ Zhpgv()

Sub Zhpgv ( IType As  Long,
Jobz As  String,
Uplo As  String,
N As  Long,
Ap() As  Complex,
Bp() As  Complex,
W() As  Double,
Z() As  Complex,
Info As  Long 
)

(シンプルドライバ) 一般化固有値問題 (エルミート行列) (圧縮形式)

目的
本ルーチンはエルミート行列の一般化固有値問題
Ax = λBx, ABx = λx または BAx = λx
のすべての固有値, および, 必要により固有ベクトルを求める. ここで, AとBはエルミート行列(圧縮形式)で, さらにBは正定値である.
引数
[in]IType解くべき問題のタイプを指定.
= 1: Ax = λBx.
= 2: ABx = λx.
= 3: BAx = λx.
[in]Jobz= "N": 固有値のみ求める.
= "V": 固有値と固有ベクトルを求める.
[in]Uplo= "U": AおよびBの上三角部分を格納する.
= "L": AおよびBの下三角部分を格納する.
[in]N行列AおよびBの行および列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る)
[in,out]Ap()配列 Ap(LAp - 1) (LAp >= N(N + 1)/2)
[in] 圧縮形式のN×Nエルミート行列 A. Uploに従い上三角部分あるいは下三角部分を格納する.
[out] Ap()の内容は壊される.
[in,out]Bp()配列 Bp(LBp - 1) (LBp >= N(N + 1)/2)
[in] 圧縮形式のN×N正定値エルミート行列 B. Uploに従い上三角部分あるいは下三角部分を格納する.
[out] コレスキー分解 B = U^H*U あるいは B = L*L^H の三角行列UあるいはLが Bと同じ格納形式で入る.
[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を返す. 固有ベクトルは次のように正規化される.
  IType = 1 または 2: Z^H*B*Z = I
  IType = 3: Z^H*inv(B)*Z = I
Jobz = "N": Z()は参照されない.
[out]Info= 0: 正常終了.
= -1: パラメータ Itype の誤り. (Itype < 1 または Itype > 3)
= -2: パラメータ Jobz の誤り. (Jobz <> "V"および"N")
= -3: パラメータ Uplo の誤り. (Uplo <> "U"および"L")
= -4: パラメータ N の誤り. (N < 0)
= -5: パラメータ Ap() の誤り.
= -6: パラメータ Bp() の誤り.
= -7: パラメータ W() の誤り.
= -8: パラメータ Z() の誤り.
= i (0 < i <= N): Zhpevが収束しなかった. 中間の3重対角形の非対角要素のうちi個が0に収束しなかった.
= i (i > N): Bの i-N次小行列が正定値でない. Bの分解が完了できず, 固有値・固有ベクトルは計算されなかった.
出典
LAPACK
使用例
一般化固有値問題 Ax = λBx の固有値および固有ベクトルを求める. ここで, Aはエルミート行列, Bは正定値エルミート行列である. ただし,
( 0.20 -0.11+0.93i 0.81-0.37i )
A = ( -0.11-0.93i -0.32 -0.80+0.92i )
( 0.81+0.37i -0.80-0.92i -0.29 )
( 2.20 -0.11+0.93i 0.81-0.37i )
B = ( -0.11-0.93i 2.32 -0.80+0.92i )
( 0.81+0.37i -0.80-0.92i 2.29 )
とする.
Sub Ex_Zhpgv()
Const N = 3
Dim Ap(N * (N + 1) / 2) As Complex, Bp(N * (N + 1) / 2) As Complex
Dim W(N - 1) As Double, Z(N - 1, N - 1) As Complex, Info As Long
Ap(0) = Cmplx(0.2, 0)
Ap(1) = Cmplx(-0.11, -0.93): Ap(3) = Cmplx(-0.32, 0)
Ap(2) = Cmplx(0.81, 0.37): Ap(4) = Cmplx(-0.8, -0.92): Ap(5) = Cmplx(-0.29, 0)
Bp(0) = Cmplx(2.2, 0)
Bp(1) = Cmplx(-0.11, -0.93): Bp(3) = Cmplx(2.32, 0)
Bp(2) = Cmplx(0.81, 0.37): Bp(4) = Cmplx(-0.8, -0.92): Bp(5) = Cmplx(2.29, 0)
Call Zhpgv(1, "V", "L", N, Ap(), Bp(), 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 = -4.97466704628586 5.03789053905172E-02 0.392451765416646
Eigenvectors =
-0.819151009277443 0 -0.413822310464714 9.35640263132256E-17
0.320545559438499 -0.890210156692715 -0.332130735287233 1.67477550936547E-02
0.935832442766443 -6.14475107289119E-02 -0.126697019588926 0.325735727937686
-0.354935871366058 -3.74256105252903E-17
0.17251768647939 0.196424402514893
-0.125117400789647 -0.228553336347363
Info = 0