XLPack 7.0
XLPack 数値計算ライブラリ (C API) リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ ztrevc3()

void ztrevc3 ( char  side,
char  howmny,
int  select[],
int  n,
int  ldt,
doublecomplex  t[],
int  ldvl,
doublecomplex  vl[],
int  ldvr,
doublecomplex  vr[],
int  mm,
int *  m,
doublecomplex  work[],
int  lwork,
double  rwork[],
int  lrwork,
int *  info 
)

シュール分解の三角行列の固有ベクトル (複素行列)

目的
本ルーチンは上三角複素行列 T の一部または全部の右または左固有ベクトルを求める. このタイプの行列は一般複素行列のシュール分解 A = Q*T*Q^H (zhseqr により計算) により生成される.

T の固有値 w に対応する右固有ベクトル x および左固有ベクトル y は次のように定義される.
T*x = w*x, (y^H)*T = w*(y^H)
ここで, y^H はベクトル y の共役転置を表す. 固有値は本ルーチンに入力されないが, T の対角ブロックより直接読み込まれる.

本ルーチンは T の右および左固有ベクトル x および/または y を返す. あるいは, 入力された行列 Q との積 Q*X および/または Q*Y を返す. Q が行列 A をシュール形 T に変換するユニタリ行列であれば Q*X および Q*Y は A の右および左固有ベクトルである.

本ルーチンは逆変換の Level 3 BLAS 版を使用する.
引数
[in]side= 'R': 右固有ベクトルのみ求める.
= 'L': 左固有ベクトルのみ求める.
= 'B': 右および左固有ベクトルの両方を求める.
[in]howmny= 'A': すべての右および/または左固有ベクトルを求める.
= 'B': vl および/または vr に入っている行列により逆変換されたすべての右および/または左固有ベクトルを求める.
= 'S': 論理型配列 select により指定された一部の右および/または左固有ベクトルを求める.
[in,out]select[]配列 select[lselect][ldselect] (lselect >= n)
howmny = 'S' の場合, select は求める固有ベクトルを指定する. select[j] = true であれば j 番目の固有値に対応する固有ベクトルが求められる.
howmny = 'A' または 'B' の場合, 参照されない.
[in]n行列 A の行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る)
[in]ldt二次元配列 t[][] の整合寸法. (ldt >= max(1, n))
[in,out]t[][]配列 t[lt][ldt] (lt >= n)
上三角行列 T. t[][]は変更されるが終了時に復元される.
[in]ldvl二次元配列 vl[][] の整合寸法. (ldvl >= 1 (side = 'R'), ldvl >= n (side = 'L' または 'B'))
[in,out]vl[][]配列 vl[lvl][ldvl] (lvl >= mm)
[in] side = 'L' または 'B' かつ howmny = 'B' の場合, vl[][] に n x n 行列 Q を入れる (通常は zhseqr により返されたシュールベクトルからなるユニタリ行列 Q).
[out] side = 'L' または 'B' の場合, vl[][] に以下を返す.
howmny = 'A' の場合, T の左固有ベクトルからなる行列 Y.
howmny = 'B' の場合, 行列 Q*Y.
howmny = 'S' の場合, select[] により指定された T の左固有ベクトルが, 固有値と同じ順に vl の行に続けて格納される.
side = 'R' の場合, 参照されない.
[in]ldvr二次元配列 vr[][] の整合寸法. (ldvr >= 1 (side = 'L'), ldvr >= n (side = 'R' または 'B'))
[in,out]vr[][]配列 vr[lvr][ldvr] (lvr >= mm)
[in] side = 'R' または 'B' かつ howmny = 'B' の場合, vr[][] に n x n 行列 Q を入れる (通常は zhseqr により返されたシュールベクトルからなるユニタリ行列 Q).
[out] side = 'R' または 'B' の場合, vr[][] に以下を返す.
howmny = 'A' の場合, T の右固有ベクトルからなる行列 X.
howmny = 'B' の場合, 行列 Q*X.
howmny = 'S' の場合, select[] により指定された T の右固有ベクトルが, 固有値と同じ順に vr の行に続けて格納される.
side = 'L' の場合, 参照されない.
[in]mm配列 vl および/または vr の行数. (mm >= m)
[out]m配列 vl および/または vr において実際に固有ベクトルを格納するのに使われた行数.
howmny = 'A' または 'B' の場合, m = n と設定される.
選択された固有ベクトルはそれぞれ 1 行を占める.
[out]work[]配列 work[lwork]
作業領域.
info = 0 の場合, work[0] に lwork の最適値を返す.
[in]lwork配列work[]のサイズ (lwork >= max(1, 2*n))
最適パフォーマンスのためには lwork >= n + 2*n*nb とせよ. ただし, nb は最適ブロックサイズである.
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 最適サイズを求める計算だけを行い, work[0] にその値を返す.
[out]rwork[]配列 rwork[lrwork]
作業領域.
info = 0 の場合, rwork[0] に lrwork の最適値を返す.
[in]lrwork配列 rwork[]のサイズ (lrwork >= max(1, n))
lrwork = -1 の場合, 作業領域サイズの問い合わせとみなし, rwork[] の最適サイズを求める計算だけを行い, rwork[0] にその値を返す.
[out]info= 0: 正常終了
= -1: 入力パラメータ side の誤り (side != 'R', 'L' および 'B')
= -2: 入力パラメータ howmny の誤り (howmny != 'A', 'B' および 'S')
= -4: 入力パラメータ n の誤り (n < 0)
= -5: 入力パラメータ ldt の誤り (ldt < max(1, n))
= -7: 入力パラメータ ldvl の誤り (ldvl が小さすぎる)
= -9: 入力パラメータ ldvr の誤り (ldvr が小さすぎる)
= -11: 入力パラメータ mm の誤り (mm < m)
= -14: 入力パラメータ lwork の誤り (lwork が小さすぎる)
= -18: 入力パラメータ lrwork の誤り (lrwork が小さすぎる)
詳細
本プログラムで使用されているアルゴリズムは基本的には後退(前進)代入である. 起こりうるオーバーフローに対して強くするためにスケーリングを行う.

固有ベクトルはそれぞれ最大要素の大きさが 1 になるように正規化される. ここで, 複素数 (x, y) の大きさは |x| + |y| とする.
出典
LAPACK