|
|
◆ ztrsna()
| void ztrsna |
( |
char |
job, |
|
|
char |
howmny, |
|
|
int |
select[], |
|
|
int |
n, |
|
|
int |
ldt, |
|
|
doublecomplex |
t[], |
|
|
int |
ldvl, |
|
|
doublecomplex |
vl[], |
|
|
int |
ldvr, |
|
|
doublecomplex |
vr[], |
|
|
double |
s[], |
|
|
double |
sep[], |
|
|
int |
mm, |
|
|
int * |
m, |
|
|
doublecomplex |
work[], |
|
|
int |
lwork, |
|
|
double |
rwork[], |
|
|
int * |
info |
|
) |
| |
上三角行列の固有値・固有ベクトルの条件数 (複素行列)
- 目的
- 本ルーチンは上三角複素行列 T (あるいは任意の Q*T*Q^H, ただし Q はユニタリ行列) の指定された固有値および/または右固有ベクトルの条件数の逆数を推定する.
- 引数
-
| [in] | job | 固有値(s)あるいは固有ベクトル(sep)の条件数が必要かどうか指定する.
= 'E': 固有値についてのみ求める(s).
= 'V': 固有ベクトルについてのみ求める(sep).
= 'B': 固有値と固有ベクトルの両方について求める(s および sep). |
| [in] | howmny | = 'A': すべての固有ペアについて条件数を求める.
= 'S': 配列 select により指定された一部の固有ペアについて条件数を求める. |
| [in,out] | select[] | 配列 select[lselect] (lselect >= n)
howmny = 'S' の場合, select[] は条件数を求める固有値ペアを指定する. j 番目の固有値ペアの条件数を選択するためには select[j] を true に設定しなければならない.
howmny = 'A' の場合, select[] は参照されない. |
| [in] | n | 行列 T の行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
| [in] | ldt | 二次元配列 t[][] の整合寸法. (ldt >= max(1, n)) |
| [in] | t[][] | 配列 t[lt][ldt] (lt >= n)
上三角行列 T. |
| [in] | ldvl | 二次元配列 vl[][] の整合寸法. (ldvl >= 1 (job = 'V'), ldvl >= n (job = 'E' または 'B')) |
| [in] | vl[][] | 配列 vl[lvl][ldvl] (lvl >= m)
job = 'E' または 'B' の場合, vl には howmny および select で指定された固有値ペアに対応する T (あるいは任意の Q*T*Q^H, ただし Q はユニタリ行列) の左固有ベクトルを入れる. zhsein または ztrevc3 が返すように固有ベクトルは vl の連続した列に格納されていること.
job = 'V' の場合, vl[][] は参照されない. |
| [in] | ldvr | 二次元配列 vr[][] の整合寸法. (ldvr >= 1 (job = 'V'), ldvr >= n (job = 'E' または 'B')) |
| [in] | vr[][] | 配列 vr[lvr][ldvr] (lvr >= m)
job = 'E' または 'B' の場合, vr には howmny および select で指定された固有値ペアに対応する T (あるいは任意の Q*T*Q^H, ただし Q はユニタリ行列) の右固有ベクトルを入れる. zhsein または ztrevc3 が返すように固有ベクトルは vr の連続した列に格納されていること.
job = 'V' の場合, vr[][] は参照されない. |
| [out] | s[] | 配列 s[ls] (ls >= mm)
job = 'E' または 'B' の場合, 指定された固有値の条件数の逆数. 配列の連続した要素に格納される. 従って, s[j], sep[j], および vl と vr の j 列はすべて同じ固有値ペアに対応する(しかし, すべての固有値ペアが選択されていない限り, 一般的には j 番目の固有値ペアではない).
job = 'V' の場合, s[] は参照されない. |
| [out] | sep[] | 配列 sep[lsep] (lsep >= mm)
job = 'V' または 'B' の場合, 指定された固有ベクトルの条件数の逆数. 配列の連続した要素に格納される.
job = 'E' の場合, sep[] は参照されない. |
| [in] | mm | 配列 s (job = 'E' または 'B' の場合) および/または sep (job = 'V' または 'B' の場合) の要素数. (mm >= m) |
| [out] | m | 配列 s および/または sep の実際に条件数を格納するために使われた要素数.
howmny = 'A' の場合, m = n と設定される.. |
| [out] | work[] | 配列 work[lwork]
複素数作業領域.
job = 'E' の場合, work[] は参照されない. |
| [in] | lwork | 配列 work[] のサイズ (lwork >= n*(n + 6) (job = 'V' または 'B' の場合)) |
| [out] | rwork[] | 配列 rwork[lrwork] (lrwork > n)
作業領域.
job = 'E' の場合, rwork[] は参照されない. |
| [out] | info | = 0: 正常終了
= -1: 入力パラメータ job の誤り (job != 'E', 'V' および 'B')
= -2: 入力パラメータ howmny の誤り (howmny != 'A' および 'S')
= -4: 入力パラメータ n の誤り (n < 0)
= -5: 入力パラメータ ldt の誤り (ldt < max(1, n))
= -7: 入力パラメータ ldvl の誤り (ldvl が小さすぎる)
= -9: 入力パラメータ ldvr の誤り (ldvr が小さすぎる)
= -13: 入力パラメータ mm の誤り (mm < m)
= -16: 入力パラメータ lwork の誤り (lwork が小さすぎる) |
- 詳細
- 固有値 lambda の条件数の逆数は次のように定義される.
s(lambda) = |v^H*u| / (norm(u)*norm(v))
ここで, u および v は T の lambda に対応する右および左固有ベクトルである. v^H は v の共役転置を表す. norm(u) はユークリッドノルムを表す. これらの条件数の逆数は常に 0 (非常に悪条件) と 1 (非常に好条件) の間にある. n = 1 の場合, s(lambda) は 1 と定義される.
計算された固有値 w(i) の近似誤差限界は次のように与えられる. ここで, eps はマシン・イプシロンである.
lambda に対応する右固有ベクトル u の条件数の逆数は以下のように定義される. 次のように仮定する. T = ( lambda c )
( 0 T22 )
そうすると条件数の逆数は次のようになる. sep( lambda, T22 ) = sigma-min( T22 - lambda*I )
ここで, sigma-min は最小の特異値を表す. 最小の特異値を 1/(T22 - lambda*I) の1-ノルムの推定値の逆数で近似する. n = 1 の場合, sep(1) は abs(T(1,1)) と定義される.
右固有ベクトル vr(i) の計算値の近似誤差限界は次のように与えられる.
- 出典
- LAPACK
|