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

◆ dsposv()

void dsposv ( char  uplo,
int  n,
int  nrhs,
int  lda,
double  a[],
int  ldb,
double  b[],
int  ldx,
double  x[],
double  work[],
float  swork[],
int *  iter,
int *  info 
)

(シンプルドライバ) 連立一次方程式 AX = B の解 (正定値対称行列) (混合精度反復改良法)

目的
本ルーチンは次の連立一次方程式を解く.
A * X = B
ここで, Aはn×n正定値対称行列, また, XおよびBはn×nrhs行列である.

dsposvは, まず単精度演算による分解を行い, その分解結果に反復改良を施してノルムに基づく精度(下記参照)において倍精度の解を得ることを試みる. それがうまくいかなかった場合, 倍精度演算による分解に切り替えて解を求める.

単精度のパフォーマンスが倍精度のそれに比較してそれほどよくない場合には, 反復改良法はよい方法とはいえない. 右辺の数や行列の大きさなどを考慮にいれて適切な方法をとらなければならないが, 今のところ常に反復改良を行うようになっている.

反復改良は次の場合に停止する.
  iter > itermax
あるいは
  すべての右辺について: rnrm < sqrt(n)*xnrm*anrm*eps*bwdmax
ただし
  iter は反復改良における現在の反復回数
  rnrm は残差の無限ノルム
  xnrm は解の無限ノルム
  anrm は行列Aの無限作用素ノルム
  eps はdlamch('E')によるマシンイプシロン
itermaxおよびbwdmaxの値は, それぞれ 30 および 1.0 に固定である.
引数
[in]uplo= 'U': Aの上三角部分を格納.
= 'L': Aの下三角部分を格納.
[in]n連立方程式の数, すなわち, 行列Aの行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る)
[in]nrhs右辺の数, すなわち, 行列Bの列数. (nrhs >= 0)
[in]lda二次元配列a[][]の整合寸法. (lda >= max(1, n))
[in,out]a[][]配列 a[la][lda] (la >= n)
[in] n×n正定値対称行列 A. uploに従い上三角部分あるいは下三角部分が参照される.
[out] 反復改良がうまくいった場合(info = 0 かつ iter >= 0, 下記参照), a[][]は変更されない. 倍精度による分解が使用された場合(info = 0 かつ iter < 0, 下記参照), 配列a[][]にはコレスキー分解 A = U^T*U または A = L*L^T の UまたはLが入る.
[in]ldb二次元配列b[][]の整合寸法. (ldb >= n)
[in]b[][]配列 b[lb][ldb] (lb >= nrhs)
n×nrhs右辺行列 B.
[in]ldx二次元配列b[][]の整合寸法. (ldx >= max(1, n))
[out]x[][]配列 x[lx][ldx] (lx >= nrhs)
info = 0 の場合, n×nrhs解行列 X.
[out]work[]配列 work[lwork] (lwork >= n*nrhs)
残差ベクトルを格納するために使用される.
[out]swork[]配列 swork[lswork] (lswork >= n*(n + nrhs))
単精度の係数行列および右辺/解行列に使用される.
[out]iter< 0: 反復改良が失敗し, 倍精度による分解を行った.
  = -1: 実装上あるいはハードウェア上の理由により倍精度計算に戻した.
  = -2: 精度を落とすことによりオーバーフローが起きたため倍精度計算に戻した.
  = -3: sgetrfのエラー.
  = -31: 反復が30回に達したため反復改良を停止した.
> 0: 反復改良がうまくいった. 反復回数を返す.
[out]info= 0: 正常終了
= -1: 入力パラメータ uplo の誤り (uplo != 'U'および'L')
= -2: 入力パラメータ n の誤り (n < 0)
= -3: 入力パラメータ nrhs の誤り (nrhs < 0)
= -4: 入力パラメータ lda の誤り (lda < max(1, n))
= -6: 入力パラメータ ldb の誤り (ldb < max(1, n))
= -8: 入力パラメータ ldx の誤り (ldx < max(1, n))
= i > 0: 倍精度で計算されたAのi×i首座小行列が正定値でないため分解を完了できなかった. また, 解を計算できなかった.
出典
LAPACK