|
|
◆ dggev()
| void dggev |
( |
char |
jobvl, |
|
|
char |
jobvr, |
|
|
int |
n, |
|
|
int |
lda, |
|
|
double |
a[], |
|
|
int |
ldb, |
|
|
double |
b[], |
|
|
double |
alphar[], |
|
|
double |
alphai[], |
|
|
double |
beta[], |
|
|
int |
ldvl, |
|
|
double |
vl[], |
|
|
int |
ldvr, |
|
|
double |
vr[], |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int * |
info |
|
) |
| |
(シンプルドライバ) 一般化固有値問題 (一般行列)
- 目的
- 本ルーチンは n x n 一般実行列のペア (A, B) の一般化固有値, および, 必要により左および/または右一般化固有ベクトルを求める.
行列のペア (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] | jobvl | = 'N': 左一般化固有ベクトルを求めない.
= 'V': 左一般化固有ベクトルを求める. |
| [in] | jobvr | = 'N': 右一般化固有ベクトルを求めない.
= 'V': 右一般化固有ベクトルを求める. |
| [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[][] は上書きされる. |
| [in] | ldb | 二次元配列 b[][] の整合寸法. (ldb >= max(1, n)) |
| [in,out] | b[][] | 配列 b[lb][ldb] (lb >= n)
[in] ペア (A, B) の行列 B.
[out] b[][] は上書きされる. |
| [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) は一般化固有値である. 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] | ldvl | 二次元配列 vl[][] の整合寸法. (ldvl >= 1 (jobvl = 'N'), ldvl >= n (jobvl = 'V')) |
| [out] | vl[][] | 配列 vl[lvl][ldvl] (lvl >= n)
jobvl = 'V': 左固有ベクトル u(j) が固有値と同じ順に vl[][] の列に入る.
j 番目の固有値が実数の場合, u(j) = vl[j][*] (vl[][] の j 番目の列)である.
j 番目と j+1 番目の固有値が複素共役対の場合, u(j) = vl[j][*] + vl[j+1][*]*i, u(j+1) = vl[j][*] - vl[j+1][*]*i である.
固有ベクトルは, 最大要素が |実数部| + |虚数部| = 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[][] の列に入る.
j 番目の固有値が実数の場合, v(j) = vr[j][*] (vr[][] の j 番目の列)である.
j 番目と j+1 番目の固有値が複素共役対の場合, v(j) = vr[j][*] + vr[j+1][*]*i, v(j+1) = vr[j][*] - vr[j+1][*]*i である.
固有ベクトルは, 最大要素が |実数部| + |虚数部| = 1 となるように正規化される.
jobvr = 'N': 参照されない. |
| [out] | work[] | 配列 work[lwork]
作業領域.
info = 0 の場合, work[0] に lwork の最適値を返す. |
| [in] | lwork | 配列 work[]のサイズ. (lwork >= max(1, 8*n))
一般にパフォーマンスをよくするためには lwork を大きくしなければならない.
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 最適サイズを求める計算だけを行い, work[0] にその値を返す. |
| [out] | info | = 0: 正常終了
= -1: 入力パラメータ jobvl の誤り (jobvl != 'V' および 'N')
= -2: 入力パラメータ jobvr の誤り (jobvr != 'V' および 'N')
= -3: 入力パラメータ n の誤り (n < 0)
= -4: 入力パラメータ lda の誤り (lda < max(1, n))
= -6: 入力パラメータ ldb の誤り (ldb < max(1, n))
= -11: 入力パラメータ ldvl の誤り (ldvl が小さすぎる)
= -13: 入力パラメータ ldvr の誤り (ldvr が小さすぎる)
= -16: 入力パラメータ lwork の誤り (lwork が小さすぎる)
= i (0 < i <= n): QZ反復が収束しなかった. 固有ベクトルは計算されないが, alphar[j], alphai[j], beta[j] (j=i〜n-1)は正しい値である.
= n+1: dhgeqz においてQZ反復の収束以外のエラーが起きた.
= n+2: dtgevc においてエラーがあった. |
- 出典
- LAPACK
|