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

◆ zggevx()

void zggevx ( char  balanc,
char  jobvl,
char  jobvr,
char  sense,
int  n,
int  lda,
doublecomplex  a[],
int  ldb,
doublecomplex  b[],
doublecomplex  alpha[],
doublecomplex  beta[],
int  ldvl,
doublecomplex  vl[],
int  ldvr,
doublecomplex  vr[],
int *  ilo,
int *  ihi,
double  lscale[],
double  rscale[],
double *  abnrm,
double *  bbnrm,
double  rconde[],
double  rcondv[],
doublecomplex  work[],
int  lwork,
double  rwork[],
int  iwork[],
int  bwork[],
int *  info 
)

(エキスパートドライバ) 一般化固有値問題 (複素行列)

目的
本ルーチンは n x n 複素行列のペア (A, B) の一般化固有値, および, 必要により左および/または右一般化固有ベクトルを求める.

また, 必要により固有値および固有ベクトルの条件を改善するための均衡化の変換(ilo, ihi, lscale, rscale, abnrm および bbnrm), 固有値の条件数の逆数(rconde), および, 右固有ベクトルの条件数の逆数(rcondv)を求める.

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

(A, B) の一般化固有値 λ(j) に対応する右一般化固有ベクトル v(j) は次式を満たす.
A * v(j) = λ(j) * B * v(j)
(A, B) の一般化固有値 λ(j) に対応する左一般化固有ベクトル u(j) は次式を満たす.
u(j)^H * A = λ(j) * u(j)^H * B
ここで, u(j)^H は u(j) の共役転置を表す.
引数
[in]balanc行うべき均衡化の方法を指定する.
= 'N': 対角スケーリングおよび入替を行わない.
= 'P': 入替えのみを行う.
= 'S': 対角スケーリングのみを行う.
= 'B': 対角スケーリングおよび入替を行う.
条件数の逆数は入替および/またはスケーリング後の行列について求められる. 入替により条件数は変わらない(丸め誤差がなければ)が, スケーリングにより変わる.
[in]jobvl= 'N': 左一般化固有ベクトルを求めない.
= 'V': 左一般化固有ベクトルを求める.
[in]jobvr= 'N': 右一般化固有ベクトルを求めない.
= 'V': 右一般化固有ベクトルを求める.
[in]senseどの条件数を計算するかを決定する.
= 'N': 計算しない.
= 'E': 固有値についてのみ計算する.
= 'V': 固有ベクトルについてのみ計算する.
= 'B': 固有値および固有ベクトルについて計算する.
[in]n行列 A, B, VL および VR の行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る)
[in]lda二次元配列 a[][] の整合寸法. (lda >= max(1, n))
[in,out]a[][]配列 a[la][lda] (la >= n)
[in] ペア (A, B) の行列 A.
[out] a[][] は上書きされる. jobvl = 'V' または jobvr = 'V' あるいは両方の場合, 均衡化された入力 A および B の複素シュール形の最初の部分が入る.
[in]ldb二次元配列 b[][] の整合寸法. (ldb >= max(1, n))
[in,out]b[][]配列 b[lb][ldb] (lb >= n)
[in] ペア (A, B) の行列 B.
[out] b[][] は上書きされる. jobvl = 'V' または jobvr = 'V' あるいは両方の場合, 均衡化された入力 A および B の複素シュール形の続きの部分が入る.
[out]alpha[]配列 alpha[lalpha] (lalpha >= n)
[out]beta[]配列 beta[lbeta] (lbeta >= n)
alpha[j]/beta[j] (j = 0〜n-1) は一般化固有値である.

注: 商 alpha[j]/beta[j] はオーバーフローあるいはアンダーフローしやすく, beta[j] が 0 になることさえある. 従って, 比 α/β を単純に計算することは避けなければならない. しかし, alpha は常に norm(A) より小さく, 通常は同程度の大きさである. また, beta は常に norm(B) より小さく, 通常は同程度の大きさである.
[in]ldvl二次元配列 vl[][] の整合寸法. (ldvl >= 1 (jobvl = 'N'), ldvl >= n (jobvl = 'V'))
[out]vl[][]配列 vl[lvl][ldvl] (lvl >= n)
jobvl = 'V': 左一般化固有ベクトル u(j) が固有値と同じ順に vl[][] の列に入る. 固有ベクトルは, 最大要素が |実数部| + |虚数部| = 1 となるように正規化される.
jobvl = 'N': 参照されない.
[in]ldvr二次元配列 vr[][] の整合寸法. (ldvr >= 1 (jobvr = 'N'), ldvr >= n (jobvr = 'V'))
[out]vr[][]配列 vr[lvr][ldvr] (lvr >= n)
jobvr = 'V': 右一般化固有ベクトル v(j) が固有値と同じ順に vr[][] の列に入る. 固有ベクトルは, 最大要素が |実数部| + |虚数部| = 1 となるように正規化される.
jobvr = 'N': 参照されない.
[out]ilo
[out]ihiilo と ihi は, i > j かつ j = 0〜ilo-2 または i = ihi〜n-1 に対して a[j][i] = 0, b[j][i] = 0 となるような整数値である.
balanc = 'N' または 'S' の場合, ilo = 1, ihi = n となる.
[out]lscale[]配列 lscale[llscale] (llscale >= n)
左から A と B に適用される入替とスケーリング因子の詳細. pl(j) を行 j と入替を行った行のインデックス, dl(j) を行 j に適用したスケーリング因子としたとき, 次のようになる.
  lscale[j] = pl(j) (j = 0 〜 ilo-2)
    = dl(j) (j = ilo-1 〜 ihi-1)
    = pl(j) (j = ihi 〜 n-1)
入替の順番は n - 1 から ihi, そして 0 から ilo - 2 である.
[out]rscale[]配列 rscale[lrscale] (lrscale >= n)
右から A と B に適用される入替とスケーリング因子の詳細. pr(j) を列 j と入替を行った列のインデックス, dr(j) を列 j に適用したスケーリング因子としたとき, 次のようになる.
  rscale[j] = pr(j) (j = 0 〜 ilo-2)
    = dr(j) (j = ilo-1 〜 ihi-1)
    = pr(j) (j = ihi 〜 n-1)
入替の順番は n - 1 から ihi, そして 0 から ilo - 2 である.
[out]abnrm均衡化された行列 A の1ノルム.
[out]bbnrm均衡化された行列 B の1ノルム.
[out]rconde[]配列 rconde[lrconde] (lrconde >= n)
sense = 'E' または 'B': 固有値の条件数の逆数が配列の要素に順に格納される.
sense = 'N' または 'V': rconde[] は参照されない.
[out]rcondv[]配列 rcondv[lrcondv] (lrcondv >= n)
sense = 'V' または 'B': 固有ベクトルの条件数の逆数の推定値が配列の要素に順に格納される. rcondv[j] を求めるために固有値を並べ替えることができない場合, rcondv[j] は 0 に設定される. これは, 真の値が非常に小さい場合にのみ起こりうる.
sense = 'N' または 'E': rcondv[] は参照されない.
[out]work[]配列 work[lwork]
複素数作業領域.
info = 0 の場合, work[0] に lwork の最適値を返す.
[in]lwork配列 work[]のサイズ. (lwork >= max(1, 4*n) (sense = 'E'), lwork >= max(1, 2*n^2 + 2*n) (sense = 'V' または 'B'), lwork >= max(1, 2*n) (その他の場合))
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 最適サイズを求める計算だけを行い, work[0] にその値を返す.
[out]rwork[]配列 rwork[lrwork] (lrwork >= max(1, 6*n) (balanc = 'S' または 'B'), lrwork >= max(1, 2*n) (その他の場合))
作業領域.
[out]iwork[]配列 iwork[liwork] (liwork >= n + 2)
作業領域.
sense = 'E' の場合, 参照されない.
[out]bwork[]配列 bwork[lbwork] (lbwork >= n)
論理型作業領域.
sense = 'N' の場合, 参照されない.
[out]info= 0: 正常終了
= -1: 入力パラメータ balanc の誤り (sense != 'P', 'S', 'B' および 'N')
= -2: 入力パラメータ jobvl の誤り (jobvl != 'V' および 'N')
= -3: 入力パラメータ jobvr の誤り (jobvr != 'V' および 'N')
= -4: 入力パラメータ sense の誤り (sense != 'E', 'V', 'B' および 'N')
= -5: 入力パラメータ n の誤り (n < 0)
= -6: 入力パラメータ lda の誤り (lda < max(1, n))
= -8: 入力パラメータ ldb の誤り (ldb < max(1, n))
= -12: 入力パラメータ ldvl の誤り (ldvl が小さすぎる)
= -14: 入力パラメータ ldvr の誤り (ldvr が小さすぎる)
= -25: 入力パラメータ lwork の誤り (lwork が小さすぎる)
= i (0 < i <= n): QZ反復が収束しなかった. 固有ベクトルは計算されないが, alpha[j], beta[j] (j = i〜n-1) は正しい値である.
= n+1: zhgeqz においてQZ反復の収束以外のエラーが起きた.
= n+2: ztgevc においてエラーがあった.
出典
LAPACK