XLPack 6.1
C/C++ API リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ _zgeesx()

void _zgeesx ( char  jobvs,
char  sort,
int(*)(doublecomplex)  select,
char  sense,
int  n,
int  lda,
doublecomplex  a[],
int *  sdim,
doublecomplex  w[],
int  ldvs,
doublecomplex  vs[],
double *  rconde,
double *  rcondv,
doublecomplex  work[],
int  lwork,
double  rwork[],
int  bwork[],
int *  info 
)

(エキスパートドライバ) シュール分解 (複素行列)

目的
本ルーチンは n x n 一般実行列 A の固有値, シュール形 T, および, 必要によりシュールベクトルからなる行列 Z を求める. これらにより, シュール分解 A = Z*T*Z^H が与えられる.

また, 必要により, 選択された固有値が左上にくるように固有値を実シュール形の対角要素上に並べ, 選択された固有値の平均の条件数の逆数(rconde), および, 選択された固有値に対応する右不変部分空間の条件数の逆数(rcondv)を求める. Z の先行する側の列はこの不変部分空間の正規直交基底を形成する.

条件数の逆数 rconde および rcondv についてのさらなる説明は LAPACK Users' Guide Third Edition Section 4.8.1 を参照のこと(これらはそれぞれ s および sep と呼ばれている).

複素行列が上三角行列であればシュール形である.

本ルーチンははじめに行列 A を上ヘッセンベルグ形に変換し, 次にQR法により固有値およびシュール分解を求める.
引数
[in]jobvs= 'N': シュールベクトルを求めない.
= 'V': シュールベクトルを求める.
[in]sortシュール形の対角要素上の固有値の並べ替えを行うかどうか指定する.
= 'N': 固有値の並べ替えを行わない.
= 'S': 固有値の並べ替えを行う (select を参照のこと).
[in]selectsort = 'S': シュール形の左上にくるように並べ替える固有値を選択するために select が使われる.
  select(w[j]) が true (= 1) であれば, 固有値 w[j] が選択される.
sort = 'N': 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]sdimsort = 'N': sdim = 0.
sort = 'S': sdim = select が true であった固有値の数.
[out]w[]配列 w[lw] (lw >= n)
求められた固有値がシュール形 T の出力の対角要素に現れるのと同じ順で w[] に入る.
[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]rcondesense = 'E' または 'B': rconde には選択された固有値の平均の条件数の逆数が入る.
sense = 'N' または 'V': 参照されない.
[out]rcondvsense = 'V' または 'B': rcondv には選択された右不変部分空間の条件数の逆数が入る.
sense = 'N' または 'E': 参照されない.
[out]work[]配列 work[lwork]
複素数作業領域.
info = 0 の場合, work[0] に lwork の最適値を返す.
[in]lwork配列work[]のサイズ. (lwork >= max(1, 2*n) (sense = 'N'), lwork >= max(1, 2*sdim*(n-sdim)) (sense = 'E', 'V' または 'B'), ここで sdim は本ルーチンで求められた選択された固有値の数である. 2*sdim*(n-sdim) <= n*n/2 であることに注意せよ. また, lwork < max(1, 2*n) のときにしかエラーが返されず, これは sense = 'E', 'V' または 'B' のときには十分な大きさではないかもしれないことに注意せよ)
一般にパフォーマンスをよくするためには lwork を大きくしなければならない.
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 配列 work[] の最適サイズの上限を求める計算だけを行い, work[0] にその値を返す.
[out]rwork[]配列 rwork[lrwork] (lrwork >= n)
作業領域.
[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))
= -10: 入力パラメータ ldvs の誤り (ldvs が小さすぎる)
= -15: 入力パラメータ lwork の誤り (lwork が小さすぎる)
= i (0 < i <= n): QRアルゴリズムが失敗しすべての固有値を求めることはできなかった. w[] の要素 0〜ilo-2 および i〜n-1 には収束した固有値が入る. jobvs = 'V' であれば, 部分的に収束したシュール形に A を変換する行列が vs[][] に入る.
= n+1: 一部の固有値が近すぎて分離できないため固有値の並べ替えができなかった(問題が非常に悪条件である).
= n+2: 並べ替え後, 丸め誤差により値が変わった複素固有値があり, シュール形の先頭のいくつかの固有値が select = true を満たさなくなった. これはスケーリングによるアンダーフローでも起こりうる.
出典
LAPACK