|
|
◆ zhseqr()
| void zhseqr |
( |
char |
job, |
|
|
char |
compz, |
|
|
int |
n, |
|
|
int |
ilo, |
|
|
int |
ihi, |
|
|
int |
ldh, |
|
|
doublecomplex |
h[], |
|
|
doublecomplex |
w[], |
|
|
int |
ldz, |
|
|
doublecomplex |
z[], |
|
|
doublecomplex |
work[], |
|
|
int |
lwork, |
|
|
int * |
info |
|
) |
| |
ヘッセンベルグ行列の固有値およびシュール分解 (QR法) (複素行列)
- 目的
- 本ルーチンは複素ヘッセンベルグ行列 H の固有値, および, 必要によりシュール分解 H = Z T Z^T の行列 T および Z を求める. ここで, T は上三角行列(シュール形), Z はシュールベクトルからなるユニタリ行列である.
必要により行列 A のシュール分解を与えるために Z を入力されたユニタリ行列 Q に乗算することができる. ただし, A はユニタリ行列 Q により A = Q*H*Q^T = (QZ)*T*(QZ)^T のようにヘッセンベルグ形 H に変換された行列である.
- 引数
-
| [in] | job | = 'E': 固有値のみ求める.
= 'S': 固有値およびシュール形 T を求める. |
| [in] | compz | = 'N': シュールベクトルを求めない.
= 'I': z[][] は単位行列に初期化される. H のシュールベクトルからなる行列 Z が返される.
= 'V': z[][] にユニタリ行列 Q を入力しておく. 積 Q*Z が返される. |
| [in] | n | 行列 A の行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
| [in] | ilo | |
| [in] | ihi | 行および列 1〜ilo-1 および ihi+1〜n において H はすでに上三角形であるとみなす. ilo および ihi は通常 zgebal の呼び出しによって設定され, zgebal の出力行列がヘッセンベルグ形に変換されるときに zgehrd に渡される. そうでなければ, ilo および ihi はそれぞれ 1 および n に設定しなければならない. (1 <= ilo <= ihi <= n (n > 0 の場合). ilo = 1 かつ ihi = 0 (n = 0 の場合)) |
| [in] | ldh | 二次元配列 h[][] の整合寸法. (ldh >= max(1, n)) |
| [in,out] | h[][] | 配列 h[lh][ldh] (lh >= n)
[in] 上ヘッセンベルグ行列 H.
[out] info = 0 で job = 'S' の場合, シュール分解(シュール形)の上三角行列 T が入る. info = 0 で job = 'E' の場合, h[][] の内容は不定である. (info > 0 の場合の h[][] の出力値については下記 info の説明を参照せよ.) |
| [out] | w[] | 配列 w[lw] (lw >= n) 求められた固有値. job = 'S' の場合, 固有値は h[][] に返されるシュール形の対角要素と同じ順に格納され, w[i] = h[i][i] となる. |
| [in] | ldz | 二次元配列 z[][] の整合寸法. (ldz >= max(1, n) (compz = 'I' または 'V' の場合), ldz >= 1 (compz = 'N' の場合)) |
| [in,out] | z[][] | 配列 z[lz][ldz] (lz >= n)
compz = 'I':
[in] z[][] は設定する必要がない.
[out] info = 0 の場合, z[][] に H のシュールベクトルからなるユニタリ行列 Z を返す.
compz = 'V':
[in] z[][] に n x n 行列 Q を設定する. ただし, 小行列 Z(ilo〜ihi, ilo〜ihi) 以外は単位行列とみなす.
[out] info = 0 の場合, z[][] に Q*Z を返す. 通常 Q は, ヘッセンベルグ行列 H への変換のための zgehrd の呼び出し後 zunghr によって生成されるユニタリ行列である. (info > 0 の場合の z[][] の出力値については下記 info の説明を参照せよ.)
compz = 'N': z[][] は参照されない. |
| [out] | work[] | 配列 work[lwork]
作業領域.
info = 0 の場合, work[0] に lwork の最適値を返す. |
| [in] | lwork | 配列work[]のサイズ.
lwork >= max(1, n) で十分であり, 非常によい/時には最適なパフォーマンスを示す. しかしながら, 最適パフォーマンスのためには 11*n の大きさの lwork が必要なことがある. 最適作業領域サイズを決めるには作業領域サイズの問い合わせ行うことが推奨される.
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 最適サイズを求める計算だけを行い, work[0] にその値を返す. |
| [out] | info | = 0: 正常終了
= -1: 入力パラメータ job の誤り (job != 'E' および 'S')
= -2: 入力パラメータ compz の誤り (compz != 'N', 'I' および 'V')
= -3: 入力パラメータ n の誤り (n < 0)
= -4: 入力パラメータ ilo の誤り (ilo < 1 または ilo > n)
= -5: 入力パラメータ ihi の誤り (ihi < min(ilo, n) または ihi > n)
= -6: 入力パラメータ ldh の誤り (ldh < max(1, n))
= -9: 入力パラメータ ldz の誤り (ldz < 1 または (compz = 'I' または 'V' かつ ldz < max(1, n)))
= -12: 入力パラメータ lwork の誤り (lwork が小さすぎる)
= i > 0: すべての固有値を求めることはできなかった. w[] の要素 1〜ilo-1 および i+1〜n には正常に計算済の固有値が格納される. (失敗することはまれである.) job = 'E' の場合, 収束しなかった残りの固有値は h[][] の最終出力の上ヘッセンベルグ行列の行および列 ilo〜i の固有値である.
job = 'S' の場合, 次のようになる. (h[][] の初期値)*U = U*(h[][] の最終値) --- (*)
ただし, U はのユニタリ行列である. h[][] の最終値は上ヘッセンベルグかつ行および列i+1〜ihiにおいて三角行列である.
compz = 'V' の場合, 次のようになる. (z[][] の最終値) = (z[][] の初期値)*U
ただし, U は(*)のユニタリ行列である (job の値に関係ない).
compz = 'I' の場合, 次のようになる. ただし, U は(*)のユニタリ行列である (job の値に関係ない).
compz = 'N' の場合, z[][] は参照されない. |
- 出典
- LAPACK
|