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

◆ Zhbevd()

Sub Zhbevd ( Jobz As  String,
Uplo As  String,
N As  Long,
Kd As  Long,
Ab() As  Complex,
W() As  Double,
Z() As  Complex,
Info As  Long 
)

(分割統治法ドライバ) 固有値・固有ベクトル (エルミート帯行列)

目的
本ルーチンはエルミート帯行列 A のすべての固有値, および, 必要により固有ベクトルを求める. 固有値のみ求める場合, QL法またはQR法を使用する. 固有ベクトルも求める場合, 分割統治法を使用する.
引数
[in]Jobz= "N": 固有値のみ求める.
= "V": 固有値と固有ベクトルを求める.
[in]Uplo= "U": A の上三角部分を格納する.
= "L": A の下三角部分を格納する.
[in]N行列Aの行および列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る)
[in]Kd上帯幅(Uplo = "U" の場合)あるいは下帯幅(Uplo = "L" の場合). (Kd >= 0)
[in,out]Ab()配列 Ab(LAb1 - 1, LAb2 - 1) (LAb1 >= Kd + 1, LAb2 >= N)
[in] エルミート帯行列 A の上または下三角部分を配列の最初の Kd + 1 列に格納する. A の j 列が配列 Ab() の j 列に次のように格納される.
Uplo = "U": Ab(Kd + i - j, j) = Aij. ただし, max(0, j - Kd - 1) <= i <= j <= N - 1.
Uplo = "L": Ab(i - j, j) = Aij. ただし, 0 <= j <= i <= min(N - 1, j + Kd - 1).
[out] Ab() は三重対角形への変換中に生成される値で上書きされる. Uplo = "U" の場合, 三重対角行列 T の上副対角要素および対角要素を Ab() の Kd および Kd + 1 番目の行に返す. Uplo = "L" の場合, T の対角要素および下副対角要素を Ab() の最初の2行に返す.
[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() に正規直交固有ベクトルが入る. W(i) に関連する固有ベクトルが i 列に入る.
Jobz = "N": Z() は参照されない.
[out]Info= 0: 正常終了
= -1: パラメータ Jobz の誤り. (Jobz <> "V"および"N")
= -2: パラメータ Uplo の誤り. (Uplo <> "U"および"L")
= -3: パラメータ N の誤り. (N < 0)
= -4: パラメータ Kd の誤り. (Kd < 0)
= -5: パラメータ Ab() の誤り.
= -6: パラメータ W() の誤り.
= -7: パラメータ Z() の誤り.
= i > 0: 収束しなかった. 中間結果の3重対角形の非対角要素のうち i 個が 0 にならなかった.
出典
LAPACK
使用例
エルミート帯行列Aの固有値・固有ベクトルを求める. ただし,
( 2.20 -0.32-0.81i 0 )
A = ( -0.32+0.81i 2.11 0.37+0.80i )
( 0 0.37-0.80i 2.93 )
とする.
Sub Ex_Zhbev()
Const N = 3, Kd = 1
Dim Ab(Kd, N - 1) As Complex, W(N - 1) As Double, Z(N - 1, N - 1) As Complex
Dim Info As Long
Ab(0, 0) = Cmplx(2.2, 0): Ab(0, 1) = Cmplx(2.11, 0): Ab(0, 2) = Cmplx(2.93, 0)
Ab(1, 0) = Cmplx(-0.32, 0.81): Ab(1, 1) = Cmplx(0.37, -0.8)
Call Zhbev("V", "L", N, Kd, Ab(), 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 = 1.04283948355918 2.52504447979701 3.67211603664382
Eigenvectors =
-0.563395195782213 0 0.745522345299636 0
-0.275043343741226 0.696203463844978 -0.102234588437164 0.258781301981572
-0.241207215775279 -0.253094504921304 -0.417819329339414 -0.438410500970378
-0.356065002532476 0
0.221139195914327 -0.55975858965814
-0.493164614651588 -0.51746898859873
Info = 0