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

◆ dtrevc3()

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

シュール分解の準三角行列の固有ベクトル

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

T の固有値 w に対応する右固有ベクトル x および左固有ベクトル y は次のように定義される.
T*x = w*x, (y^T)*T = w*(y^T)
ここで, y^T はベクトル 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] (lselect >= n)
howmny = 'S' の場合, select[] は求める固有ベクトルを指定する.
w[j] が実数固有値の場合, select[j] が true であれば対応する実数固有ベクトルが求められる.
w[j] と w[j+1] が複素固有値の実数部と虚数部の場合, select[j] あるいは select[j+1] のどちらかが true であれば対応する複素固有ベクトルが求められ, 終了時 select[j] は true に, また, select[j+1] は false に設定される.
howmny = 'A' または 'B' の場合, 参照されない.
[in]n行列 A の行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る)
[in]ldt二次元配列 t[][] の整合寸法. (ldt >= max(1, n))
[in]t[][]配列 t[lt][ldt] (lt >= n)
シュール正準形の上準三角行列 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 を入れる (通常は dhseqr により返されたシュールベクトルからなる直交行列 Q).
[out] side = 'L' または 'B' の場合, vl[][] に以下を返す.
howmny = 'A' の場合, T の左固有ベクトルからなる行列 Y.
howmny = 'B' の場合, 行列 Q*Y.
howmny = 'S' の場合, select[] により指定された T の左固有ベクトルが, 固有値と同じ順に vl[][] の行に続けて格納される.
複素固有値に対応する複素固有ベクトルは, 最初は実数部, 2番目は虚数部というように2つの行に続けて格納される.
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 を入れる (通常は dhseqr により返されたシュールベクトルからなる直交行列 Q).
[out] side = 'R' または 'B' の場合, vr[][] に以下を返す.
howmny = 'A' の場合, T の右固有ベクトルからなる行列 X.
howmny = 'B' の場合, 行列 Q*X.
howmny = 'S' の場合, select[] により指定された T の右固有ベクトルが, 固有値と同じ順に vr[][] の行に続けて格納される.
複素固有値に対応する複素固有ベクトルは, 最初は実数部, 2番目は虚数部というように2つの行に続けて格納される.
side = 'L' の場合, 参照されない.
[in]mm配列 vl[][] および/または vr[][] の行数. (mm >= m)
[out]m配列 vl[][] および/または vr[][] において実際に固有ベクトルを格納するのに使われた行数.
howmny = 'A' または 'B' の場合, m = n と設定される.
選択された実数固有ベクトルはそれぞれ1行を占め, 選択された複素固有ベクトルはそれぞれ2行を占める.
[out]work[]配列 work[lwork]
作業領域.
info = 0 の場合, work[0] に lwork の最適値を返す.
[in]lwork配列work[]のサイズ (lwork >= max(1, 3*n))
最適パフォーマンスのためには lwork >= n + 2*n*nb とせよ. ただし, nb は最適ブロックサイズである.
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 最適サイズを求める計算だけを行い, work[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 が小さすぎる)
詳細
本プログラムで使用されているアルゴリズムは基本的には後退(前進)代入である. 起こりうるオーバーフローに対して強くするためにスケーリングを行う.

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