XLPack 7.0
XLPack 数値計算ライブラリ (C API) リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ dstebz()

void dstebz ( char  range,
char  order,
int  n,
double  vl,
double  vu,
int  il,
int  iu,
double  abstol,
double  d[],
double  e[],
int *  m,
int *  nsplit,
double  w[],
int  iblock[],
int  isplit[],
double  work[],
int  iwork[],
int *  info 
)

対称三重対角行列の固有値 (二分法)

目的
本ルーチンは実対称三重対角行列 T の固有値を求める. 全固有値, 半開区間 (vl, vu] 内の全固有値, または, il 〜 iu番目の固有値を求めることができる.

オーバーフローを避けるために行列は, 最大要素が絶対値で overflow^(1/2) * underflow^(1/4) よりも大きくないように, スケーリングされていなければならない. また, 最大精度を得るためにはこれより小さすぎないようにしなければならない.

引数
[in]range= 'A': すべての固有値を求める.
= 'V': 半開区間 (vl, vu] のすべての固有値を求める.
= 'I': il 番目から iu 番目までの固有値を求める.
[in]order= 'B': 分割されたブロック (iblock, isplit を参照) ごとに固有値がグループ分けされ, ブロック内で最小から最大の順に並べられる.
= 'E': 行列全体の固有値が最小から最大の順に並べられる.
[in]n三重対角行列の行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る)
[in]vlrange = 'V': 固有値を求める区間の下端. vl 以下または vu より大きい固有値は返されない. (vl < vu)
range = 'A'または'I': 参照されない.
[in]vurange = 'V': 固有値を求める区間の上端. vl 以下または vu より大きい固有値は返されない. (vl < vu)
range = 'A'または'I': 参照されない.
[in]ilrange = 'I': 求める最小固有値の番号. (1 <= il <= iu <= n (n > 0 の場合). il = 1, iu = 0 (n = 0 の場合))
range = 'A'または'V': 参照されない.
[in]iurange = 'I': 求める最大固有値の番号. (1 <= il <= iu <= n (n > 0 の場合). il = 1, iu = 0 (n = 0 の場合))
range = 'A'または'V': 参照されない.
[in]abstol固有値の絶対誤差限界. 固有値(またはクラスター)は, abstol 以下の幅の区間に入っていると判断された場合にそこにあると見なされる. abstol がゼロ以下の場合, ulp*|T| が使用される. ただし, |T| は T の1ノルムを表す.
abstol がゼロではなくアンダーフローしきい値の2倍(2*dlamch('S'))に設定された場合に, 固有値が最も正確に計算される.
[in]d[]配列 d[ld] (ld >= n)
三重対角行列 T の n 個の対角要素.
[in]e[]配列 e[le] (le >= n - 1)
三重対角行列 T の n-1 個の副対角要素.
[out]m実際に求められた固有値の数 (0 <= m <= n)
(info = 2, 3 の説明も参照せよ.)
[out]nsplit行列 T の対角ブロック数. (1 <= nsplit <= n)
[out]w[]配列 w[lw] (lw >= n)
m 個の求められた固有値が w[] の先頭から入る. (dstebz は残りの n-m 要素を作業領域として使うことがある.)
[out]iblock[]配列 iblock[liblock] (liblock >= n)
e[j] がゼロまたは小さいような行/列 j それぞれにおいて, 行列 T はブロック対角行列に分割されると考えられる. 終了時 info = 0 であれば iblock[i] は固有値 w[i] がどのブロック(1 〜 ブロック数)に属するかを示す. (本ルーチンは残りの n - m 要素を作業領域として使うことがある.)
[out]isplit[]配列 isplit[lisplit] (lisplit >= n)
T が小行列に分割する分割点. 最初の小行列は行/列 1 〜 isplit[0], 2番目は行/列 isplit[0] + 1 〜 isplit[1], ... よりなる. nsplit番目は行/列 isplit[nsplit - 2] + 1 〜 isplit[nsplit - 1] = n よりなる. (最初の nsplit 要素のみが実際に使われるが, nsplit の値を前もって知ることはできないので isplit[] には n 要素分を用意しておかなければならない.)
[out]work[]配列 work[lwork] (lwork >= 4*n)
作業領域.
[out]iwork[]配列 iwork[liwork] (liwork >= 3*n)
整数作業領域.
[out]info= 0: 正常終了.
= -1: 入力パラメータ range の誤り. (range != 'A', 'V'および'I')
= -2: 入力パラメータ order の誤り. (order != 'B'および'E')
= -3: 入力パラメータ n の誤り. (n < 0)
= -5: 入力パラメータ vu の誤り. (vu <= vl)
= -6: 入力パラメータ il の誤り. (il < 1 または il > n)
= -7: 入力パラメータ iu の誤り. (iu < min(n, il) または iu > n)
= > 0: 一部または全部の固有値が収束しなかった, あるいは, 計算されなかった.
  = 1 or 3: 二分法がいくつかの固有値について収束しなかった. それらの固有値は負のブロック番号で示される.
  = 2 or 3: 固有値 il 〜 iu の全部を求めることができなかった. m < iu + 1 - il となる. (range = 'I')
  = 4: ゲルシュゴリン区間の初期値が小さすぎる. 固有値は計算されなかった. (range = 'I')
出典
LAPACK