|
|
◆ zggesx_r()
| void zggesx_r |
( |
char |
jobvsl, |
|
|
char |
jobvsr, |
|
|
char |
sort, |
|
|
char |
sense, |
|
|
int |
n, |
|
|
int |
lda, |
|
|
doublecomplex |
a[], |
|
|
int |
ldb, |
|
|
doublecomplex |
b[], |
|
|
int * |
sdim, |
|
|
doublecomplex |
alpha[], |
|
|
doublecomplex |
beta[], |
|
|
int |
ldvsl, |
|
|
doublecomplex |
vsl[], |
|
|
int |
ldvsr, |
|
|
doublecomplex |
vsr[], |
|
|
double |
rconde[], |
|
|
double |
rcondv[], |
|
|
doublecomplex |
work[], |
|
|
int |
lwork, |
|
|
double |
rwork[], |
|
|
int |
iwork[], |
|
|
int |
liwork, |
|
|
int |
bwork[], |
|
|
int * |
info, |
|
|
int * |
irev |
|
) |
| |
(エキスパートドライバ) 一般化シュール分解 (複素行列) (リバースコミュニケーション版)
- 目的
- 本ルーチンは n x n 複素行列のペア (A, B) の一般化固有値, 一般化複素シュール形 (S, T), および, 必要により左および/または右シュールベクトルからなる行列(VSL および VSR)を求める. これらにより, 一般化シュール分解が次のように与えられる.
(A, B) = ((VSL)*S*(VSR)^H, (VSL)*T*(VSR)^H)
(VSR)^H は VSR の共役転置である.
また, 必要により, 選択された固有値が上三角行列 S および上三角行列 T の左上の対角要素にくるように固有値を並べ替え, 選択された固有値の平均の条件数の逆数(rconde), および, 選択された固有値に対応する右および左部分空間の条件数の逆数(rcondv)を求める. その結果 VSL および VSR の先行する側の列は, 対応する左および右固有空間(部分空間)のユニタリ基底を形成する.
行列のペア (A, B) の一般化固有値は, A - wB が特異となるようなスカラー w あるいは比 α/β = w である. β = 0 あるいは両方共 0 の場合に適当な解釈ができるため, これは通常ペア (α, β) で表される.
T が非負の対角要素を持つ上三角行列で S が上三角行列であれば, 行列のペア (S, T) は一般化複素シュール形である.
本ルーチンは zggesx のリバースコミュニケーション版である.
- 引数
-
| [in] | jobvsl | = 'N': 左シュールベクトルを求めない.
= 'V': 左シュールベクトルを求める. |
| [in] | jobvsr | = 'N': 右シュールベクトルを求めない.
= 'V': 右シュールベクトルを求める. |
| [in] | sort | 一般化シュール形の対角要素上の固有値の並べ替えを行うかどうか指定する.
= 'N': 固有値の並べ替えを行わない.
= 'S': 固有値の並べ替えを行う. |
| [in] | sense | どの条件数を計算するかを決定する.
= 'N': 条件数を計算しない.
= 'E': 選択された固有値の平均について条件数を計算する.
= 'V': 選択された部分空間について条件数を計算する.
= 'B': 両方について条件数を計算する.
sense = 'E', 'V' あるいは 'B' の場合, sort = 'S' でなければならない. |
| [in] | n | 行列 A, B, VSL および VSR の行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
| [in] | lda | 二次元配列 a[][] の整合寸法. (lda >= max(1, n)) |
| [in,out] | a[][] | 配列 a[la][lda] (la >= n)
[in] 行列のペアの1つ目の行列.
[out] a[][] は一般化シュール形 S で上書きされる. |
| [in] | ldb | 二次元配列 b[][] の整合寸法. (ldb >= max(1, n)) |
| [in,out] | b[][] | 配列 b[lb][ldb] (lb >= n)
[in] 行列のペアの2つ目の行列.
[out] b[][] は一般化シュール形 T で上書きされる. |
| [out] | sdim | sort = 'N': sdim = 0.
sort = 'S': sdim = selctg が true であった固有値(並べ替え後)の数. |
| [out] | alpha[] | 配列 alpha[lalpha] (lalpha >= n) |
| [out] | beta[] | 配列 beta[lbeta] (lbeta >= n)
alpha[j]/beta[j] (j = 0〜n-1) は一般化固有値である. alpha[j] および beta[j] (j = 0〜N-1) は複素シュール形 (S, T) の対角要素である. beta[j] は非負の実数である.
注: 商 alpha[j]/beta[j] はオーバーフローあるいはアンダーフローしやすく, beta[j] が 0 になることさえある. 従って, 比 α/β を単純に計算することは避けなければならない. しかし, alpha は常に norm(A) より小さく, 通常は同程度の大きさである. また, beta は常にn orm(B) より小さく, 通常は同程度の大きさである. |
| [in] | ldvsl | 二次元配列 vsl[][] の整合寸法. (ldvsl >= 1 (jobvsl = 'N'), ldvsl >= n (jobvsl = 'V')) |
| [out] | vsl[][] | 配列 vsl[lvsl][ldvsl] (lvsl >= n)
jobvsl = 'V': vsl[][] に左シュールベクトルが入る.
jobvsl = 'N': 参照されない. |
| [in] | ldvsr | 二次元配列 vsr[][] の整合寸法. (ldvsr >= 1 (jobvsr = 'N'), ldvsr >= n (jobvsr = 'V')) |
| [out] | vsr[][] | 配列 vsr[lvsr][ldvsr] (lvsr >= n)
jobvsr = 'V': vsr[][] に右シュールベクトルが入る.
jobvsr = 'N': 参照されない. |
| [out] | rconde[] | 配列 rconde[lrconde] (lrconde >= 2)
sense = 'E' または 'B': rconde[0] および rconde[1] には選択された固有値の平均についての条件数の逆数が入る.
sense = 'N' または 'V': 参照されない. |
| [out] | rcondv[] | 配列 rcondv[lrcondv] (lrcondv >= 2)
sense = 'V' または 'B': rcondv[0] および rcondv[1] には選択された部分空間についての条件数の逆数が入る.
sense = 'N' または 'E': 参照されない. |
| [out] | work[] | 配列 work[lwork]
複素数作業領域.
info = 0 の場合, work[0] に lwork の最適値を返す. |
| [in] | lwork | 配列 work[]のサイズ. (lwork >= 1 (n = 0), lwork >= max(1, 2*n, 2*sdim*(n - sdim)) (sense = 'E', 'V' または 'B'), lwork >= max(1, 2*n) (その他の場合). 2*sdim*(n - sdim) <= n*n/2 であることに注意せよ. また, liwork < max(1, 2*n) のときにしかエラーが返されず, sense =' E', 'V' または 'B' のときには十分な大きさがあるとは限らないことに注意せよ.)
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 配列 work[] の最適サイズの上限および配列 iwork[] の最小サイズを求める計算だけを行い, work[0] および iwork[0] にそれらの値を返す. |
| [out] | rwork[] | 配列 rwork[lrwork] (lrwork >= 8*n)
作業領域. |
| [out] | iwork[] | 配列 iwork[liwork]
整数作業領域.
info = 0 の場合, iwork[0] に liwork の最小値を返す. |
| [in] | liwork | 配列 iwork[]のサイズ (liwork >= 1 (sense = 'N' または n = 0 の場合), liwork >= n+2 (その他の場合))
liwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 配列 work[] の最適サイズの上限および配列 iwork[] の最小サイズを求める計算だけを行い, work[0] および iwork[0] にそれらの値を返す. |
| [out] | bwork[] | 配列 bwork[lbwork] (lbwork >= n)
論理型作業領域.
sort = 'N' の場合, 参照されない. |
| [out] | info | = 0: 正常終了
= -1: 入力パラメータ jobvsl の誤り (jobvsl != 'V' および 'N')
= -2: 入力パラメータ jobvsr の誤り (jobvsr != 'V' および 'N')
= -3: 入力パラメータ sort の誤り (sort != 'S' および 'N')
= -4: 入力パラメータ sense の誤り (sense != 'E', 'V', 'B' および 'N')
= -5: 入力パラメータ n の誤り (n < 0)
= -6: 入力パラメータ lda の誤り (lda < max(1, n))
= -8: 入力パラメータ ldb の誤り (ldb < max(1, n))
= -13: 入力パラメータ ldvsl の誤り (ldvsl が小さすぎる)
= -15: 入力パラメータ ldvsr の誤り (ldvsr が小さすぎる)
= -20: 入力パラメータ lwork の誤り (lwork が小さすぎる)
= -23: 入力パラメータ liwork の誤り (liwork が小さすぎる)
= i (0 < i <= n): QZ反復が失敗した. (A, B) はシュール形ではないが, alpha[j] および beta[j] (j = i〜n-1) は正しい. = n+1: zhgeqz においてQZ反復の失敗以外のエラーが起きた.
= n+2: 並べ替え後, 丸め誤差により値が変化した複素固有値があり, シュール形の先頭側のいくつかの固有値が selctg = true を満たさなくなった. これは, スケーリングによっても起こりうる.
= n+3: ztgsen において並べ替えに失敗した. |
| [in,out] | irev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の時には下記処理を行ってから再び本ルーチンを呼び出すこと.
= 0: 処理終了. 結果は info をチェックすること.
= 1, 2: sort = 'S' の場合, 並べ替えを行う固有値の選択のための判定値を bwork[i] (i = 0〜n-1) に設定すること. alpha[i] および beta[i] (alpha[i]/beta[i] は固有値)を参照して判定を行い, 選択する場合 bwork[i] = 1, 選択しない場合 bwork[i] = 0 とする. bwork[] 以外は変更してはならない.
sort = 'N' の場合, 常に irev = 0 を返す. |
- 出典
- LAPACK
|