|
|
◆ zgebal()
| void zgebal |
( |
char |
job, |
|
|
int |
n, |
|
|
int |
lda, |
|
|
doublecomplex |
a[], |
|
|
int * |
ilo, |
|
|
int * |
ihi, |
|
|
double |
scale[], |
|
|
int * |
info |
|
) |
| |
一般行列の均衡化 (複素行列)
- 目的
- 本ルーチンは一般複素行列 A の均衡化を行う. 最初に, 先頭の 1〜ilo-1 および末尾の ihi+1〜n 番目の対角要素に固有値を分離するために相似変換により A の置換を行う. 次に, 行と列のノルムができるだけ同じになるように対角相似変換を行および列 ilo〜ihi に適用する. これらを行うかどうかはどちらも選択可能である.
均衡化によって, 行列の1ノルムを減少させ求められる固有値および固有ベクトルの精度を改善させることが期待できる.
- 引数
-
| [in] | job | A に施す処理を指定する.
= 'N': なし: 単純に ilo = 1, ihi = n, scale(i) = 1.0 (i = 1, ..., n) と設定する.
= 'P': 置換のみ.
= 'S': スケーリングのみ.
= 'B': 置換とスケーリングの両方. |
| [in] | n | 行列 A の行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
| [in] | lda | 二次元配列 a[][] の整合寸法. (lda >= max(1, n)) |
| [in,out] | a[][] | 配列 a[la][lda] (la >= n)
[in] 入力行列 A.
[out] a[][] は均衡化された行列で上書きされる. job = 'N' の場合, a[][] は参照されない. 「詳細」を参照せよ. |
| [out] | ilo | |
| [out] | ihi | 終了時 ilo および ihi は次のような整数値に設定される.
A(i, j) = 0 (i > j かつ j = 1, ..., ilo-1 および i = ihi+1, ..., n).
job = 'N' または 'S' の場合, ilo = 1 および ihi = n. |
| [out] | scale[] | 配列 scale[lscale] (lscale >= n) A に適用される置換の詳細とスケール係数. 行および列 j との入替を行った行および列のインデックスを P(j), 行および列 j に適用されたスケーリングの係数を D(j) とすると, 次のようになる. scale[j-1] = P(j) (j = 1, ..., ilo-1)
= D(j) (j = ilo, ..., ihi)
= P(j) (j = ihi+1, ..., n)
入替が行われる順序は n から ihi+1, そして 1 から ilo-1 である. |
| [out] | info | = 0: 正常終了
= -1: 入力パラメータ job の誤り (job != 'N', 'P', 'S' および 'B')
= -2: 入力パラメータ n の誤り (n < 0)
= -3: 入力パラメータ lda の誤り (lda < max(1, n))
= -4: 入力パラメータ a[][] の誤り (NaN) |
- 詳細
- 置換は行および列の入替からなり, 行列は次のような形になる.
( T1 X Y )
P A P = ( 0 B Z )
( 0 0 T2 )
ここで, T1 および T2 は上三角行列で対角要素はその固有値になる. 列インデックス lio および ihi は小行列 B の開始列および終了列を表す.
均衡化は, B の各行およびそれに対応する列の1ノルムがほぼ等しくなるように対角相似変換 inv(D) * B * D を施す. 出力行列は次のようになる. ( T1 X*D Y )
( 0 inv(D)*B*D inv(D)*Z ).
( 0 0 T2 )
置換 P および対角行列 D に関する情報はベクトル scale[] に返される.
本サブルーチンは EISPACK ルーチンの BALANC に基づいており, Tzu-Yi Chen, Computer Science Division, University of California at Berkeley, USA により修正されたものである.
- 出典
- LAPACK
|