|
|
◆ Zstemr()
| Sub Zstemr |
( |
Jobz As |
String, |
|
|
Range As |
String, |
|
|
N As |
Long, |
|
|
D() As |
Double, |
|
|
E() As |
Double, |
|
|
Vl As |
Double, |
|
|
Vu As |
Double, |
|
|
Il As |
Long, |
|
|
Iu As |
Long, |
|
|
M As |
Long, |
|
|
W() As |
Double, |
|
|
Z() As |
Complex, |
|
|
Nzc As |
Long, |
|
|
Isuppz() As |
Long, |
|
|
Tryrac As |
Boolean, |
|
|
Info As |
Long |
|
) |
| |
エルミート行列を変換した対称三重対角行列の固有値・固有ベクトル (MRRR法)
- 目的
- 本ルーチンはエルミート行列を変換した実対称三重対角行列 T の指定された固有値, および, 必要により固有ベクトルを求める. 縮小していない行列はペアごとに異なる実固有値を持つ集合が明確に定義されており, 対応する実固有ベクトルはペアごとに直交する.
必要な固有値の区間 (Vl, Vu] またはインデックスの範囲 Il〜Iu を指定することにより, 全部または一部のスペクトラムを求めることができる.
必要な固有値の数に応じて二分法またはdqds法により固有値を求める. 近接固有値のクラスターに対する適切なLDL^T分解(RRR (Relatively Robust Representations)という)を使用して数値的に直交する固有ベクトルを計算する.
対称三重対角行列の固有ベクトルは実数であるが, 元のエルミート行列の固有ベクトルは一般に複素数値を持つ. LAPACKドライバは行列データを固有ベクトルで上書きするので, 本ルーチンは Zunmtr あるいは Zupmtr との互換性のために複素数型の配列を使用するようになっている.
- 引数
-
| [in] | Jobz | = "N": 固有値のみ求める.
= "V": 固有値と固有ベクトルを求める. |
| [in] | Range | = "A": すべての固有値を求める.
= "V": 半開区間 (Vl, Vu] のすべての固有値を求める.
= "I": Il番目からIu番目までの固有値を求める. |
| [in] | N | 行列の行および列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る) |
| [in,out] | D() | 配列 D(LD - 1) (LD >= N)
[in] 三重対角行列の対角要素.
[out] D() は上書きされる. |
| [in,out] | E() | 配列 E(LE - 1) (LE >= N)
[in] 三重対角行列 T の N - 1 個の副対角要素を E(0) 〜 E(N - 2) に入れる. E(N - 1) は入力する必要はないが内部的に作業領域として使われる.
[out] E() は上書きされる. |
| [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 の場合))
Range = "A" または "V": 参照されない. |
| [in] | Iu | Range = "I": 求める最大固有値の番号. (1 <= Il <= Iu <= N (N > 0 の場合))
Range = "A" または "V": 参照されない. |
| [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 列に入る.
Jobz = "N": Z() は参照されない.
注: 配列 Z() は少なくても M 列を割り当てること. Range = "V" の場合, M の値をあらかじめ知ることはできないが, 下記のように Nzc = -1 として作業領域の問い合わせを行うことにより求めることができる. |
| [in] | Nzc | 配列 Z() に格納する固有ベクトル数.
Range = "A": Nzc >= max(1, N).
Range = "V": Nzc >= (Vl, Vu] の固有ベクトル数.
Range = "I": Nzc >= Iu - Il + 1.
Nzc = -1 の場合, 作業領域サイズの問い合わせとみなし, Z() に固有ベクトルを格納するのに必要な列数を求め, Z(0, 0) にその値を返す. |
| [out] | Isuppz() | 配列 Isuppz(LIsuppz - 1) (LIsuppz >= 2*max(1, M))
Z() の固有ベクトルの非ゼロ要素のインデックスを表す. i (= 1 〜 M) 番目の固有ベクトルにおいては Isuppz(2*(i-1)) 〜 Isuppz(2*(i-1) + 1) 番目の要素のみが非ゼロである. これは行列が分割されている場合に関係する. Isuppz() は Jobz = "V" かつ N > 0 の場合にのみ出力される. |
| [in,out] | Tryrac | [in]
= True: 三重対角行列が固有値を高い相対精度で定義しているかどうかをチェックする. 高い相対精度で定義していれば, 相対精度を維持するアルゴリズムを使用するが, 行列によっては(少し)遅くなる可能性がある. 行列が固有値を高い相対精度で定義していなければ, より高速と思われるアルゴリズムを使用する.
= False: 高い相対精度の固有値を保証する必要はなく, 可能な限り最速の手法を使用する.
[out] 行列が固有値を高い相対精度で定義していれば True, そうでなければ False. |
| [out] | Info | = 0: 正常終了.
= -1: パラメータ Jobz の誤り. (Jobz <> "N" および "V")
= -2: パラメータ Range の誤り. (Range <> "A", "V" および "I")
= -3: パラメータ N の誤り. (N < 0)
= -4: パラメータ D() の誤り.
= -5: パラメータ E() の誤り.
= -7: パラメータ Vu の誤り. (Vu < Vl)
= -8: パラメータ Il の誤り. (Il < 1 または Il > N)
= -9: パラメータ Iu の誤り. (Iu < min(N, Il) または Iu > N)
= -11: パラメータ W() の誤り.
= -12: パラメータ Z() の誤り.
= -13: パラメータ Nzc の誤り. (Nzc が小さすぎる)
= -14: パラメータ Isuppz() の誤り.
= i > 0: Dlarre の内部エラー (i = 1x) または Dlarrv の内部エラー (i = 2x). |
- 出典
- LAPACK
|