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

◆ dgges()

void dgges ( char  jobvsl,
char  jobvsr,
char  sort,
int(*)(double, double, double)  selctg,
int  n,
int  lda,
double  a[],
int  ldb,
double  b[],
int *  sdim,
double  alphar[],
double  alphai[],
double  beta[],
int  ldvsl,
double  vsl[],
int  ldvsr,
double  vsr[],
double  work[],
int  lwork,
int  bwork[],
int *  info 
)

(シンプルドライバ) 一般化シュール分解 (一般行列)

目的
本ルーチンは n x n 一般実行列のペア (A, B) の一般化固有値, 一般化実シュール形 (S, T), および, 必要により左および/または右シュールベクトルからなる行列(VSL および VSR)を求める. これらにより, 一般化シュール分解が次のように与えられる.
(A, B) = ((VSL)*S*(VSR)^T, (VSL)*T*(VSR)^T)
また, 必要により, 選択された固有値が上準三角行列 S および上三角行列 T の左上の対角ブロックにくるように固有値を並べ替える. その結果, VSL および VSR の先行する側の列は, 対応する左および右固有空間(部分空間)の正規直交基底を形成する.
(一般化固有値のみ必要ならば代わりにより高速な dggev を使用せよ.)

行列のペア (A, B) の一般化固有値は, A - wB が特異となるようなスカラー w あるいは比 α/β = w である. β = 0 あるいは両方共 0 の場合に適当な解釈ができるため, これは通常ペア (α, β) で表される.

T が非負の対角成分を持つ上三角行列で, S が 1 x 1 および 2 x 2 ブロックよりなるブロック上三角行列であれば, 行列のペア (S, T) は一般化実シュール形である. 1 x 1 ブロックは実一般化固有値に対応し, 一方, S の 2 x 2 ブロックは T の対応する要素が次の形式になるように"標準化"される.
[ a 0 ]
[ 0 b ]
また, S および T の対応する 2 x 2 ブロックのペアは複素共役対の一般化固有値である.
引数
[in]jobvsl= 'N': 左シュールベクトルを求めない.
= 'V': 左シュールベクトルを求める.
[in]jobvsr= 'N': 右シュールベクトルを求めない.
= 'V': 右シュールベクトルを求める.
[in]sort一般化シュール形の対角上の固有値の並べ替えを行うかどうか指定する.
= 'N': 固有値の並べ替えを行わない.
= 'S': 固有値の並べ替えを行う(selctg を参照のこと).
[in]selctgsort = 'S': シュール形の左上にくるように並べ替える固有値を選択するために selctg が使われる.
  selctg(alphar[j], alphai[j], beta[j]) が true (= 1) であれば, 固有値 (alphar[j]± alphai[j]*i)/beta[j] が選択される. すなわち, 固有値の複素共役対のうち一つが選択されれば両方の複素固有値が選択される.
  悪条件の場合, 並べ替え後, 選択された複素固有値は selctg(alphar[j], alphai[j], beta[j]) = true を満たさなくなるかもしれないことに注意せよ. この場合, info = n + 2 に設定される.
sort = 'N': selctg は参照されない.
[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]sdimsort = 'N': sdim = 0.
sort = 'S': sdim = selctg が true であった固有値(並べ替え後)の数. (どちらかの固有値について selctg が true であった複素共役対は 2 とカウントする)
[out]alphar[]配列 alphar[lalphar] (lalphar >= n)
[out]alphai[]配列 alphai[lalphai] (lalphai >= n)
[out]beta[]配列 beta[lbeta] (lbeta >= n)
(alphar[j] + alphai[j]*i)/beta[j] (j = 0〜n-1) は一般化固有値である. alphar[j] + alphai[j]*i および beta[j], j = 0, ..., n-1 は複素シュール形 (S, T) の対角成分である. (S, T) は, (A, B) の実シュール形の 2 x 2 対角ブロックを 2 x 2 複素ユニタリ変換によりさらに三角型に変換した場合に得られる. alphai[j] が 0 の場合, j 番目の固有値は実数である. 正の場合, j 番目と j+1 番目の固有値は複素共役対であり, alphai[j+1] は負である.

注: 商 alphar[j]/beta[j] および alphai[j]/beta[j] はオーバーフローあるいはアンダーフローしやすく, beta[j] が 0 になることさえある. 従って, 比 α/β を単純に計算することは避けなければならない. しかし, alphar と alphai は常に norm(A) より小さく, 通常は同程度の大きさである. また, beta は常に norm(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]work[]配列 work[lwork]
作業領域.
info = 0 の場合, work[0] に lwork の最適値を返す.
[in]lwork配列 work[] のサイズ. (lwork >= 1 (n = 0 の場合), lwork >= max(1, 8*n+16) (n > 0 の場合))
一般にパフォーマンスをよくするためには lwork を大きくしなければならない.
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 最適サイズを求める計算だけを行い, work[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')
= -5: 入力パラメータ n の誤り (n < 0)
= -6: 入力パラメータ lda の誤り (lda < max(1, n))
= -8: 入力パラメータ ldb の誤り (ldb < max(1, n))
= -14: 入力パラメータ ldvsl の誤り (ldvsl が小さすぎる)
= -16: 入力パラメータ ldvsr の誤り (ldvsr が小さすぎる)
= -19: 入力パラメータ lwork の誤り (lwork が小さすぎる)
= i (0 < i <= n): QZ反復が失敗した. (A, B) はシュール形ではないが, alphar[j], alphai[j], beta[j] (j = i〜n-1) は正しい.
= n+1: dhgeqz においてQZ反復の失敗以外のエラーが起きた.
= n+2: 並べ替え後, 丸め誤差により値が変化した複素固有値があり, シュール形の先頭側のいくつかの固有値が selctg = true を満たさなくなった. これは, スケーリングによっても起こりうる.
= n+3: dtgsen において並べ替えに失敗した.
出典
LAPACK