|
◆ dgeevx()
void dgeevx |
( |
char |
balanc, |
|
|
char |
jobvl, |
|
|
char |
jobvr, |
|
|
char |
sense, |
|
|
int |
n, |
|
|
int |
lda, |
|
|
double |
a[], |
|
|
double |
wr[], |
|
|
double |
wi[], |
|
|
int |
ldvl, |
|
|
double |
vl[], |
|
|
int |
ldvr, |
|
|
double |
vr[], |
|
|
int * |
ilo, |
|
|
int * |
ihi, |
|
|
double |
scale[], |
|
|
double * |
abnrm, |
|
|
double |
rconde[], |
|
|
double |
rcondv[], |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int |
iwork[], |
|
|
int * |
info |
|
) |
| |
(エキスパートドライバ) 固有値・固有ベクトル (一般行列)
- 目的
- 本ルーチンは n x n 一般実行列 A の固有値, および, 必要により左および/または右固有ベクトルを求める. はじめに行列 A を上ヘッセンベルグ形に変換し, 次にQR法により固有値, および, 必要によりシュール分解を求める. 固有ベクトルはシュール分解より計算される.
また, 必要により固有値および固有ベクトルの条件を改善するための均衡化の変換(ilo, ihi, scale および abnrm), 固有値の条件数の逆数(rconde), および, 右固有ベクトルの条件数の逆数(rcondv)を求める.
A の右固有ベクトル v(j) は次式を満たす. A * v(j) = lambda(j) * v(j)
ここで, lambda(j) は固有値である.
A の左固有ベクトル u(j) は次式を満たす. u(j)^H * A = lambda(j) * u(j)^H
ここで, u(j)^H は u(j) の共役転置を表す.
求められた固有ベクトルはユークリッドノルムが 1 で最大成分が実数になるように正規化される.
行列の均衡化は, 上三角行列に近づくように行と列の入替えを行い, そして行と列のノルムを近づけて固有値および固有ベクトルの条件数を小さくするために対角相似変換 D*A*D^(-1) を適用することを意味する. ここで, D は対角行列である. 求められた条件数の逆数は均衡化後の行列のものである. 行と列の入替えにより条件数は(厳密な計算においては)変わらない. しかし, 対角スケーリングは変わる. 均衡化についてのさらなる説明は LAPACK Users' Guide Third Edition Section 4.8.1 を参照のこと.
- 引数
-
[in] | balanc | 入力された行列の固有値の条件の改善のための対角スケーリングおよび/または入れ替えの方法を指定.
= 'N': 対角スケーリングおよび入替えを行わない.
= 'P': 上三角行列に近づくように入替えを行う. 対角スケーリングは行わない.
= 'S': 対角スケーリングを行う. すなわち, A を D*A*D^(-1) で置き換える. ここで, D は A の行および列のノルムをより等しくするように選ばれた対角行列である. 入替えは行わない.
= 'B': A の対角スケーリングおよび入替えを行う. |
[in] | jobvl | = 'N': A の左固有ベクトルを求めない.
= 'V': A の左固有ベクトルを求める.
sense = 'E' または 'B'の場合, jobvl = 'V' でなければならない. |
[in] | jobvr | = 'N': A の右固有ベクトルを求めない.
= 'V': A の右固有ベクトルを求める.
sense = 'E' または 'B'の場合, jobvr = 'V' でなければならない. |
[in] | sense | どの条件数の逆数を計算するかを決定する.
= 'N': 何も計算しない.
= 'E': 固有値についてのみ計算する.
= 'V': 右固有ベクトルについてのみ計算する.
= 'B': 固有値および右固有ベクトルについて計算する.
sense = 'E' または 'B'の場合, 左および右固有ベクトルも計算しなければならない(jobvl = 'V' かつ jobvr = 'V'). |
[in] | n | 行列Aの行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
[in] | lda | 二次元配列 a[][] の整合寸法. (lda >= max(1, n)) |
[in,out] | a[][] | 配列 a[la][lda] (la >= n)
[in] n x n 行列 A.
[out] a[][] は上書きされる. jobvl = 'V' あるいは jobvr = 'V' の場合, a[][] には均衡化された入力行列 A の実シュール形が入る. |
[out] | wr[] | 配列 wr[lwr] (lwr >= n) |
[out] | wi[] | 配列 wi[lwi] (lwi >= n)
wr[] および wi[] にはそれぞれ求められた固有値の実数部および虚数部が入る. 複素共役対の固有値は, 虚数部が正の固有値を先頭に, 続けて現れる. |
[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 番目の行). j 番目と j+1 番目の固有値が複素共役対の場合, u(j) = (vl[][] の j 番目の行) + i*(vl[][] の j+1 番目の行), u(j+1) = (vl[][] の j 番目の行) - i*(vl[][] の j+1 番目の行).
jobvl = 'N': vl[][]は参照されない. |
[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 番目の行). j 番目と j+1 番目の固有値が複素共役対の場合, v(j) = (vr[][] の j 番目の行) + i*(vr[][] の j+1 番目の行), v(j+1) = (vr[][] の j 番目の行) - i*(vr[][] の j+1 番目の行).
jobvr = 'N': vr[][]は参照されない. |
[out] | ilo | |
[out] | ihi | ilo と ihi は, 均衡化を行ったときに決まる整数値である. i > j かつ j = 0〜ilo-2 または i = ihi〜n-1 であれば, 均衡化された a[j][i] = 0 である. |
[out] | scale[] | 配列 scale[lscale] (lscale >= n)
A を均衡化したときに適用された入替とスケーリング因子の詳細. p(j) を行および列 j と入替を行った行および列のインデックス, 行および列jに適用されたスケーリング因子を d(j) としたとき次のようになる.
scale[j] = p(j) (j = 0 〜 ilo-2)
= d(j) (j = ilo-1 〜 ihi-1)
= p(j) (j = ihi 〜 n-1)
入替の順番は n-1 から ihi, そして 0 から ilo-2 である. |
[out] | abnrm | 均衡化された行列の1ノルム(任意の列の要素の絶対値の和の最大値). |
[out] | rconde[] | 配列 rconde[lrconde] (lrconde >= n)
rconde[j] は j 番目の固有値の条件数の逆数である.
sense = 'N' または 'V' の場合, 参照されない. |
[out] | rcondv[] | 配列 rcondv[lrcondv] (lrcondv >= n)
rcondv[j] は j 番目の右固有ベクトルの条件数の逆数である.
sense = 'N' または 'E' の場合, 参照されない. |
[out] | work[] | 配列 work[lwork]
作業領域.
info = 0 の場合, work[0] に lwork の最適値を返す. |
[in] | lwork | 配列 work[] のサイズ (jobvl = 'V' または jobvr = 'V' の場合: lwork >= max(1, n*(n+6)) (sense = 'V' または 'B') または lwork >= max(1, 3*n) (sense = 'N' または 'E'); jobvl != 'V' かつ jobvr != 'V' の場合: lwork >= max(1, n*(n+6)) (sense != 'N') または lwork >= max(1, 2*n) (sense = 'N'))
一般に, パフォーマンスをよくするためには lwork を大きくしなければならない.
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 最適サイズを求める計算だけを行い, work[0] にその値を返す. |
[out] | iwork[] | 配列 iwork[liwork] (liwork >= 2*n - 2)
整数作業領域.
sense = 'N' または 'E' の場合, 参照されない. |
[out] | info | = 0: 正常終了
= -1: 入力パラメータ balanc の誤り (balanc != 'N', 'P', 'S' および 'B')
= -2: 入力パラメータ jobvl の誤り (jobvl != 'V' および 'N')
= -3: 入力パラメータ jobvr の誤り (jobvr != 'V' および 'N')
= -4: 入力パラメータ sense の誤り (sense != 'N', 'E', 'V' および 'B')
= -5: 入力パラメータ n の誤り (n < 0)
= -6: 入力パラメータ lda の誤り (lda < max(1, n))
= -10: 入力パラメータ ldvl の誤り (ldvl が小さすぎる)
= -12: 入力パラメータ ldvr の誤り (ldvr が小さすぎる)
= -21: 入力パラメータ lwork の誤り (lwork が小さすぎる)
= i > 0: QRアルゴリズムが失敗しすべての固有値を求めることはできなかった. 固有ベクトルおよび条件数は計算されなかった. wr[] および wi[] の要素 0〜ilo-2 および i〜n-1 には収束した固有値が入る. |
- 出典
- LAPACK
|