|
|
◆ Zheevx()
| Sub Zheevx |
( |
JobZ As |
String, |
|
|
Range As |
String, |
|
|
Uplo As |
String, |
|
|
N As |
Long, |
|
|
A() 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] | A() | 配列 A(LA1 - 1, LA2 - 1) (LA1 >= N, LA2 >= N)
[in] N×Nエルミート行列 A. Uploに従い上三角部分あるいは下三角部分を格納する.
[out] A()の下三角部分(Uplo = "L"の場合)あるいは上三角部分(Uplo = "U"の場合)は対角部分を含め壊される. |
| [in] | Vl | Range = "V": 固有値を求める区間の下端. (Vl < Vu)
Range = "A"または"I": 参照されない. |
| [in] | Vu | Range = "V": 固有値を求める区間の上端. (Vl < Vu)
Range = "A"または"I": 参照されない. |
| [in] | Il | Range = "I": 求める最小固有値の番号. (1 <= Il <= Iu <= N (N > 0 の場合), Il = 1, Iu = 0 (N = 0 の場合))
Range = "A"または"V": 参照されない. |
| [in] | Iu | Range = "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: パラメータ A() の誤り.
= -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_Zheevx()
Const N = 3
Dim A(N - 1, N - 1) 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
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)
AbsTol = 0
Call Zheevx("V", "A", "L", N, A(), 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.19846835072553E-02
-0.621236109316912 5.83009495222983E-02 0.204907317474214 -0.507777757881847
0.607779522934083 0
-0.392237107311198 -0.407323787101333
0.23846608290599 0.503959683819116
M = 3 Info = 0
|