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

◆ Zhpevx()

Sub Zhpevx ( Jobz As  String,
Range As  String,
Uplo As  String,
N As  Long,
Ap() As  Complex,
Vl As  Double,
Vu As  Double,
Il As  Long,
Iu As  Long,
AbsTol As  Double,
M As  Long,
W() As  Double,
Z() As  Complex,
IFail() As  Long,
Info As  Long 
)

(エキスパートドライバ) 固有値・固有ベクトル (エルミート行列) (圧縮形式)

目的
本ルーチンはエルミート行列 A の固有値, および, 必要により固有ベクトルを求める (圧縮形式). 必要な固有値の範囲あるいは番号の範囲を指定することにより, 求める固有値・固有ベクトルを選択することができる.
引数
[in]Jobz= "N": 固有値のみ求める.
= "V": 固有値と固有ベクトルを求める.
[in]Range= "A": すべての固有値を求める.
= "V": 半開区間(vl, vu]のすべての固有値を求める.
= "I": il番目からiu番目までの固有値を求める.
[in]Uplo= "U": Aの上三角部分を格納する.
= "L": Aの下三角部分を格納する.
[in]N行列Aの行および列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る)
[in,out]Ap()配列 Ap(LAp - 1) (LAp >= N(N + 1)/2)
[in] 圧縮形式のN×Nエルミート行列 A. Uploに従い上三角部分あるいは下三角部分が格納される.
[out] Ap()は三重対角形への変換中に生成される値で上書きされる.
  Uplo = "U": 三重対角行列Tの対角要素および上副対角要素によりAの対応する要素を上書きする.
  Uplo = "L": Tの対角要素および下副対角要素によりAの対応する要素を上書きする.
[in]VlRange = "V": 固有値を求める区間の下端. (Vl < Vu)
Range = "A"または"I": 参照されない.
[in]VuRange = "V": 固有値を求める区間の上端. (Vl < Vu)
Range = "A"または"I": 参照されない.
[in]IlRange = "I": 求める最小固有値の番号. (1 <= Il <= Iu <= N (N > 0 の場合), Il = 1, Iu = 0 (N = 0 の場合))
Range = "A"または"V": 参照されない.
[in]IuRange = "I": 求める最大固有値の番号. (1 <= Il <= Iu <= N (N > 0 の場合), Il = 1, Iu = 0 (N = 0 の場合))
Range = "A"または"V": 参照されない.
[in]AbsTol固有値の絶対誤差限界.
固有値の近似値は区間[a, b]に入っているときに収束したものとみなされる. この区間の幅は AbsTol + eps*max(|a|, |b|) に等しいかこれより小さい. ここでepsはマシンイプシロンである. AbsTol <= 0 の場合, eps*|T|が代わりに使用される. ここで, |T|は行列Aを変換して得られた3重対角行列の1ノルムである.
AbsTolを0ではなくアンダフロー限界の2倍(2*Dlamch("S"))に設定したときに固有値が最も正確に求められる. Info > 0 (固有ベクトルのいくつかが収束しなかったことを示す)で戻ったときには, AbsTolを2*Dlamch("S")に設定してみるとよい.
"Computing Small Singular Values of Bidiagonal Matrices with Guaranteed High Relative Accuracy," by Demmel and Kahan, LAPACK Working Note #3. を参照のこと.
[out]M求められた固有値の数 (0 <= M <= N)
Range = "A"の場合 M = N, Range = "I"の場合 M = Iu - Il + 1 となる.
[out]W()配列 W(LW - 1) (LW >= N)
正常終了時, M個の求められた固有値が先頭から昇順に入る.
[out]Z()配列 Z(LZ1 - 1, LZ2 - 1) (LZ1 >= N, LZ2 >= M)
Jobz = "V": Info = 0 の場合, 求められた固有値に対応してZ()の最初のM列に行列Aの正規直交固有ベクトルが入る. W(i)に関連する固有ベクトルがZ()のi列に入る. 固有ベクトルの収束に失敗した場合, Z()のその列には固有ベクトルの最終近似が入り, Ifail()に固有ベクトルの番号が入る.
Jobz = "N": Z()は参照されない.
注: 配列Z()は少なくてもmax(1, M)列を割り当てること. Range = "V"の場合, Mの値をあらかじめ知ることはできないが上限値を使用すること.
[out]IFail()配列 IFail(LIFail - 1) (LIFail >= N)
Jobz = "V": Info = 0の場合, IFail()の最初のM要素が0に設定される. Info > 0 の場合, 収束しなかった固有ベクトルの番号がIFail()に入る.
Jobz = "N": IFail()は参照されない.
[out]Info= 0: 正常終了.
= -1: パラメータ Jobz の誤り. (Jobz <> "V"および"N")
= -2: パラメータ Range の誤り. (Range <> "A", "V"および"I")
= -3: パラメータ Uplo の誤り. (Uplo <> "U"および"L")
= -4: パラメータ N の誤り. (N < 0)
= -5: パラメータ Ap() の誤り.
= -7: パラメータ Vu の誤り. (Vu < Vl)
= -8: パラメータ Il の誤り. (Il < 1 または Il > N)
= -9: パラメータ Iu の誤り. (Iu < min(N, Il) または Iu > N)
= -12: パラメータ W() の誤り.
= -13: パラメータ Z() の誤り.
= -14: パラメータ IFail() の誤り.
= i > 0: i個の固有ベクトルが収束しなかった. それらの番号は配列IFail()に入る.
出典
LAPACK
使用例
エルミート行列Aの固有値・固有ベクトルを求める. ただし,
( 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 )
とする.
Sub Ex_Zhpevx()
Const N = 3
Dim Ap(N * (N + 1) / 2) As Complex, W(N - 1) As Double
Dim Vl As Double, Vu As Double, Il As Long, Iu As Long, AbsTol As Double
Dim M As Long, Z(N - 1, N - 1) As Complex, IFail(N - 1) As Long, 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)
AbsTol = 0
Call Zhpevx("V", "A", "L", N, Ap(), Vl, Vu, Il, Iu, AbsTol, M, W(), Z(), IFail(), 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 "M =", M, "Info =", Info
End Sub
実行結果
Eigenvalues = -2.05348849668514 0.124622388617308 1.51886610806783
Eigenvectors =
-0.449276526719113 -0 0.654793596518192 0
0.227247885813611 -0.597641779578735 0.519997178670921 -3.19846835072552E-02
0.621236109316913 -5.83009495222984E-02 0.204907317474214 -0.507777757881847
-0.607779522934083 0
0.392237107311198 0.407323787101333
-0.23846608290599 -0.503959683819116
M = 3 Info = 0