|
|
◆ dsgesv()
| void dsgesv |
( |
int |
n, |
|
|
int |
nrhs, |
|
|
int |
lda, |
|
|
double |
a[], |
|
|
int |
ipiv[], |
|
|
int |
ldb, |
|
|
double |
b[], |
|
|
int |
ldx, |
|
|
double |
x[], |
|
|
double |
work[], |
|
|
float |
swork[], |
|
|
int * |
iter, |
|
|
int * |
info |
|
) |
| |
(シンプルドライバ) 連立一次方程式 AX = B の解 (一般行列) (混合精度反復改良法)
- 目的
- 本ルーチンは次の連立一次方程式を解く. ここで, Aはn×n行列, また, XおよびBはn×nrhs行列である.
dsgesvは, まず単精度演算による分解を行い, その分解結果に反復改良を施してノルムに基づく精度(下記参照)において倍精度の解を得ることを試みる. それがうまくいかなかった場合, 倍精度演算による分解に切り替えて解を求める.
単精度のパフォーマンスが倍精度のそれに比較してそれほどよくない場合には, 反復改良法はよい方法とはいえない. 右辺の数や行列の大きさなどを考慮にいれて適切な方法をとらなければならないが, 今のところ常に反復改良を行うようになっている.
反復改良は次の場合に停止する.
iter > itermax
あるいは
すべての右辺について: rnrm < sqrt(n)*xnrm*anrm*eps*bwdmax
ただし
iter は反復改良における現在の反復回数
rnrm は残差の無限ノルム
xnrm は解の無限ノルム
anrm は行列Aの無限作用素ノルム
eps はdlamch('E')によるマシンイプシロン
itermaxおよびbwdmaxの値は, それぞれ 30 および 1.0 に固定である.
- 引数
-
| [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.
[out] 反復改良がうまくいった場合(info = 0 かつ iter >= 0, 下記参照), a[][]は変更されない. 倍精度による分解が使用された場合(info = 0 かつ iter < 0, 下記参照), 配列a[][]には分解 A = P*L*U のLおよびUが入る. Lの対角要素(= 1)は格納されない. |
| [out] | ipiv[] | 配列 ipiv[lipiv] (lipiv >= n)
置換行列Pを定義するピボットインデックス. 第i行が第ipiv[i-1]行と交換されたことを表す. 単精度による分解(info = 0 かつ iter >= 0), および, 倍精度による分解(info = 0 かつ iter < 0)のどちらにも対応する. |
| [in] | ldb | 二次元配列b[][]の整合寸法. (ldb >= max(1, 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: 入力パラメータ n の誤り (n < 0)
= -2: 入力パラメータ nrhs の誤り (nrhs < 0)
= -3: 入力パラメータ lda の誤り (lda < max(1, n))
= -6: 入力パラメータ ldb の誤り (ldb < max(1, n))
= -8: 入力パラメータ ldx の誤り (ldx < max(1, n))
= i > 0: 倍精度で計算されたUのi番目の対角要素が0である. 分解を完了したが, Uが特異であるため解を計算できなかった. |
- 出典
- LAPACK
|