|
◆ dgeesx_r()
void dgeesx_r |
( |
char |
jobvs, |
|
|
char |
sort, |
|
|
char |
sense, |
|
|
int |
n, |
|
|
int |
lda, |
|
|
double |
a[], |
|
|
int * |
sdim, |
|
|
double |
wr[], |
|
|
double |
wi[], |
|
|
int |
ldvs, |
|
|
double |
vs[], |
|
|
double * |
rconde, |
|
|
double * |
rcondv, |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int |
iwork[], |
|
|
int |
liwork, |
|
|
int |
bwork[], |
|
|
int * |
info, |
|
|
int * |
irev |
|
) |
| |
(エキスパートドライバ) シュール分解 (一般行列) (リバースコミュニケーション版)
- 目的
- 本ルーチンは n x n 一般実行列 A の固有値, 実シュール形 T, および, 必要によりシュールベクトルからなる行列 Z を求める. これらにより, シュール分解 A = Z*T*Z^T が与えられる.
また, 必要により, 選択された固有値が左上にくるように固有値を実シュール形の対角要素上に並べ, 選択された固有値の平均の条件数の逆数(rconde), および, 選択された固有値に対応する右不変部分空間の条件数の逆数(rcondv)を求める. Z の先行する側の列はこの不変部分空間の正規直交基底を形成する.
条件数の逆数 rconde および rcondv についてのさらなる説明は LAPACK Users' Guide Third Edition Section 4.8.1 を参照のこと(これらはそれぞれ s および sep と呼ばれている).
行列が 1 x 1 および 2 x 2 ブロックよりなる準上三角行列であれば実シュール形である. 2 x 2 ブロックは次の形式に標準化できる. ここで, b*c < 0 である. このようなブロックの固有値は a±sqrt(bc) である.
本ルーチンははじめに行列 A を上ヘッセンベルグ形に変換し, 次にQR法により固有値およびシュール分解を求める.
本ルーチンは dgeesx のリバースコミュニケーション版である.
- 引数
-
[in] | jobvs | = 'N': シュールベクトルを求めない.
= 'V': シュールベクトルを求める. |
[in] | sort | シュール形の対角要素上の固有値の並べ替えを行うかどうか指定する.
= 'N': 固有値の並べ替えを行わない.
= 'S': 固有値の並べ替えを行う(selectを参照のこと). |
[in] | sense | どの条件数の逆数を計算するかを決定する.
= 'N': 条件数を計算しない.
= 'E': 選択された固有値の平均について条件数を計算する.
= 'V': 選択された右不変部分空間について条件数を計算する.
= 'B': 両方について条件数を計算する.
sense = 'E', 'V' あるいは 'B' の場合, sort = 'S' でなければならない. |
[in] | n | 行列 A の行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
[in] | lda | 二次元配列 a[][] の整合寸法. (lda >= max(1, n)) |
[in,out] | a[][] | 配列 a[la][lda] (la >= n)
[in] n x n 行列 A.
[out] a[][] はその実シュール形 T で上書きされる. |
[in] | sdim | sort = 'N': sdim = 0.
sort = 'S': sdim = bwork[i] が true であった固有値(並べ替え後)の数. (どちらかの固有値について true であった複素共役対は 2 とカウントする) |
[out] | wr[] | 配列 wr[lwr] (lwr >= n) |
[out] | wi[] | 配列 wr[lwr] (lwr >= n)
求められた固有値がシュール形 T の出力の対角要素に現れるのと同じ順で, wr[] および wi[] に求められた固有値のそれぞれ実数部および虚数部が入る. 複素共役対の固有値は, 虚数部が正の固有値を先頭に, 続けて現れる. |
[in] | ldvs | 二次元配列 vs[][] の整合寸法. (ldvs >= 1 (jobvs = 'N'), ldvs >= n (jobvs = 'V')) |
[out] | vs[][] | 配列 vs[lvs][ldvs] (lvs >= n)
jobvs = 'V': vs[][] にシュールベクトルからなる直交行列 Z が入る.
jobvs = 'N': vs[][] は参照されない. |
[out] | rconde | sense = 'E' または 'B': rconde には選択された固有値の平均の条件数の逆数が入る.
sense = 'N' または 'V': 参照されない. |
[out] | rcondv | sense = 'V' または 'B': rcondv には選択された右不変部分空間の条件数の逆数が入る.
sense = 'N' または 'E': 参照されない. |
[out] | work[] | 配列 work[lwork]
作業領域.
info = 0 の場合, work[0] に lwork の最適値を返す. |
[in] | lwork | 配列 work[] のサイズ. (lwork >= max(1, 3*n) (sense = 'N'), lwork >= max(1, n+2*sdim*(n-sdim)) (sense = 'E', 'V' または 'B'). ここで, sdim は本ルーチンで計算され選択された固有値の数である. n+2*sdim*(n-sdim) <= n+n*n/2 であることに注意せよ. また, lwork < max(1, 3*n) のときにしかエラーが返されず, sense = 'E', 'V' または 'B' のときには十分な大きさではないかもしれないことに注意せよ.)
一般にパフォーマンスをよくするためには lwork を大きくしなければならない.
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 配列 work[] および iwork[] の最適サイズの上限を求める計算だけを行い, work[0] および iwork[0] にそれらの値を返す. |
[out] | iwork[] | 配列 iwork[liwork]
整数作業領域
info = 0 の場合, iwork[0] に liwork の最適値を返す. |
[in] | liwork | 配列 iwork[]のサイズ. (liwork >= 1 (sense = 'N' または 'E'), liwork >= sdim*(n-sdim) (sense = 'V' または 'B'). sdim*(n-sdim) <= n*n/4 であることに注意せよ. また, liwork < 1 のときにしかエラーが返されず, sense = 'V' または 'B' のときには十分な大きさではないかもしれないことに注意せよ.)
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 配列 work[] および iwork[] の最適サイズの上限を求める計算だけを行い, work[0] および iwork[0] にそれらの値を返す. |
[out] | bwork[] | 配列 bwork[lbwork] (lbwork >= n)
論理型(整数)作業領域.
sort = 'N' の場合, 参照されない. |
[out] | info | = 0: 正常終了
= -1: 入力パラメータ jobvs の誤り (jobvs != 'V' および 'N')
= -2: 入力パラメータ sort の誤り (sort != 'S' および 'N')
= -4: 入力パラメータ sense の誤り (sense != 'E', 'V', 'B' および 'N')
= -5: 入力パラメータ n の誤り (n < 0)
= -6: 入力パラメータ lda の誤り (lda < max(1, n))
= -11: 入力パラメータ ldvs の誤り (ldvs が小さすぎる)
= -16: 入力パラメータ lwork の誤り (lwork が小さすぎる)
= -18: 入力パラメータ liwork の誤り (liwork が小さすぎる)
= i (0 < i <= n): QRアルゴリズムが失敗しすべての固有値を求めることはできなかった. wr[] および wi[] の要素 0〜ilo-2 および i〜n-1 には収束した固有値が入る. jobvs = 'V' であれば, 部分的に収束したシュール形に A を変換する行列が vs[][] に入る.
= n+1: 一部の固有値が近すぎて分離できないため固有値の並べ替えができなかった(問題が非常に悪条件である)
= n+2: 並べ替え後, 丸め誤差により値が変わった複素固有値があり, シュール形の先頭のいくつかの固有値が bwork[i] = true を満たさなくなった. これはスケーリングによるアンダーフローでも起こりうる. |
[in,out] | irev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の時には下記処理を行ってから再び本ルーチンを呼び出すこと. = 0: 処理終了。結果は info をチェックすること.
= 1, 2: sort = 'S' の場合, 並べ替えを行う固有値の選択のための判定値を bwork[i] (i = 0〜n-1) に設定すること. wr[i] と wi[i] (固有値の実数部と虚数部)を参照して判定を行い, 選択する場合 bwork[i] = true (1), 選択しない場合 bwork[i] = false (0) とする. bwork[] 以外の変数を変更してはならない.
sort = 'N' の場合, 常に irev = 0 を返す. |
- 出典
- LAPACK
|