XLPack 6.1
C/C++ API リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ _dtrsna()

void _dtrsna ( char  job,
char  howmny,
int  select[],
int  n,
int  ldt,
double  t[],
int  ldvl,
double  vl[],
int  ldvr,
double  vr[],
double  s[],
double  sep[],
int  mm,
int *  m,
double  work[],
int  lwork,
int  iwork[],
int  liwork,
int *  info 
)

上準三角行列の固有値・固有ベクトルの条件数

目的
本ルーチンは実上準三角行列 T (あるいは任意の Q*T*Q^T, ただし Q は直交行列) の指定された固有値および/または右固有ベクトルの条件数の逆数を推定する.

T は(dhseqr が返すように)シュール正準形でなければならない. すなわち, 1 x 1 および 2 x 2 対角ブロックよりなるブロック上三角行列でなければならない. 2 x 2 対角ブロックそれぞれにおいて, 対角要素は同符号, 副対角要素は反対符号である.
引数
[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[] は条件数を求める固有値ペアを指定する. 実数固有値 w[j] に対応する固有値ペアの条件数を選択するためには select[j] を true に設定しなければならない. 共役複素対の固有値 w[j] および w[j+1] に対応する条件数を選択するためには select[j] または select[j+1] のどちらかまたは両方を 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 >= mm)
job = 'E' または 'B' の場合, vl[][] には howmny および select[] で指定された固有値ペアに対応する T (あるいは任意の Q*T*Q^T, ただし Q は直交行列) の左固有ベクトルを入れる. dhsein または dtrevc が返すように固有ベクトルは vl[][] の連続した行に格納されていること.
job = 'V' の場合, vl[][] は参照されない.
[in]ldvr二次元配列 vr[][] の整合寸法. (ldvr >= 1 (job = 'V'), ldvr >= n (job = 'E' または 'B'))
[in]vr[][]配列 vr[lvr][ldvr] (lvr >= mm)
job = 'E' または 'B' の場合, vr[][] には howmny および select[] で指定された固有値ペアに対応する T (あるいは任意の Q*T*Q^T, ただし Q は直交行列) の右固有ベクトルを入れる. dhsein または dtrevc が返すように固有ベクトルは vr[][] の連続した行に格納されていること.
job = 'V' の場合, vr[][] は参照されない.
[out]s[]配列 s[ls] (ls >= mm)
job = 'E' または 'B' の場合, 指定された固有値の条件数の逆数. 配列の連続した要素に格納される. 共役複素対をなす固有値については s[] の連続した 2 つの要素が同じ値に設定される. 従って, s[j], sep[j], および vl[][] と vr[][] の j 行はすべて同じ固有値ペアに対応する(しかし, すべての固有値ペアが選択されていない限り, 一般的には j 番目の固有値ペアではない).
job = 'V' の場合, s[] は参照されない.
[out]sep[]配列 sep[lsep] (lsep >= mm)
job = 'V' または 'B' の場合, 指定された固有ベクトルの条件数の逆数. 配列の連続した要素に格納される. 共役複素対をなす固有値については sep[] の連続した 2 つの要素が同じ値に設定される. sep[j] を計算するために固有値を並べ直すことができない場合, sep[j] = 0 と設定される. ちなみに, これは真の値が非常に小さいときにしか起こりえない.
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]iwork[]配列 iwork[liwork]
整数作業領域.
job = 'E' の場合, iwork[] は参照されない.
[in]liwork配列 iwork[] のサイズ (liwork >= 2*(n - 1) (job = 'V' または 'B' の場合))
[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 が小さすぎる)
= -18: 入力パラメータ liork の誤り (liwork が小さすぎる)
詳細
固有値 lambda の条件数の逆数は次のように定義される.
s(lambda) = |v^T*u| / (norm(u)*norm(v))
ここで, u および v は T の lambda に対応する右および左固有ベクトルである. v^T は v の転置を表す. norm(u) はユークリッドノルムを表す. これらの条件数の逆数は常に 0 (非常に悪条件) と 1 (非常に好条件) の間にある. n = 1 の場合, s(lambda) は 1 と定義される.

固有値 w(i) の計算値の近似誤差限界は次のように与えられる.
eps * norm(T) / s(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) の計算値の近似誤差限界は次のように与えられる.
eps * norm(T) / sep(i)
出典
LAPACK