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

◆ Zhegv()

Sub Zhegv ( IType As  Long,
JobZ As  String,
Uplo As  String,
N As  Long,
A() As  Complex,
B() As  Complex,
W() As  Double,
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]A()配列 A(LA1 - 1, LA2 - 1) (LA1 >= N, LA2 >= N)
[in] N×Nエルミート行列 A. Uploに従い上三角部分あるいは下三角部分を格納する.
[out] Jobz = "V": Info = 0の場合, 次のように正規化された固有ベクトルからなる行列ZをA()に返す.
  IType = 1 または 2: Z^H*B*Z = I
  IType = 3: Z^H*inv(B)*Z = I
Jobz = "N": A()の上三角部分(Uplo = "U"の場合)あるいは下三角部分(Uplo = "L"の場合)は, 対角部分を含め壊される.
[in,out]B()配列 B(LB1 - 1, LB2 - 1) (LB1 >= N, LB2 >= N)
[in] N×N正定値エルミート行列 B. Uploに従い上三角部分あるいは下三角部分を格納する.
[out] Info <= N の場合, B()の行列を格納している部分はコレスキー分解 B = U^H*U あるいは B = L*L^H の三角行列UあるいはLにより上書きされる.
[out]W()配列 W(LW - 1) (LW >= N)
Info = 0 の場合, 求められた固有値(昇順).
[out]Info= 0: 正常終了.
= -1: パラメータ Itype の誤り. (Itype < 1 または Itype > 3)
= -2: パラメータ Jobz の誤り. (Jobz <> "V"および"N")
= -3: パラメータ Uplo の誤り. (Uplo <> "U"および"L")
= -4: パラメータ N の誤り. (N < 0)
= -5: パラメータ A() の誤り.
= -6: パラメータ B() の誤り.
= -7: パラメータ W() の誤り.
= i (0 < i <= N): Zheevが収束しなかった. 中間の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_Zhegv()
Const N = 3
Dim A(N - 1, N - 1) As Complex, B(N - 1, N - 1) As Complex, W(N - 1) As Double
Dim Info As Long
A(0, 0) = Cmplx(0.2, 0)
A(1, 0) = Cmplx(-0.11, -0.93): A(1, 1) = Cmplx(-0.32, 0)
A(2, 0) = Cmplx(0.81, 0.37): A(2, 1) = Cmplx(-0.8, -0.92): A(2, 2) = Cmplx(-0.29, 0)
B(0, 0) = Cmplx(2.2, 0)
B(1, 0) = Cmplx(-0.11, -0.93): B(1, 1) = Cmplx(2.32, 0)
B(2, 0) = Cmplx(0.81, 0.37): B(2, 1) = Cmplx(-0.8, -0.92): B(2, 2) = Cmplx(2.29, 0)
Call Zhegv(1, "V", "L", N, A(), B(), W(), Info)
Debug.Print "Eigenvalues =", W(0), W(1), W(2)
Debug.Print "Eigenvectors ="
Debug.Print Creal(A(0, 0)), Cimag(A(0, 0)), Creal(A(0, 1)), Cimag(A(0, 1))
Debug.Print Creal(A(1, 0)), Cimag(A(1, 0)), Creal(A(1, 1)), Cimag(A(1, 1))
Debug.Print Creal(A(2, 0)), Cimag(A(2, 0)), Creal(A(2, 1)), Cimag(A(2, 1))
Debug.Print Creal(A(0, 2)), Cimag(A(0, 2))
Debug.Print Creal(A(1, 2)), Cimag(A(1, 2))
Debug.Print Creal(A(2, 2)), Cimag(A(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.354935871366059 -3.74256105252903E-17
0.17251768647939 0.196424402514893
-0.125117400789647 -0.228553336347363
Info = 0