|
◆ z_diom_r()
void z_diom_r |
( |
int |
n, |
|
|
const doublecomplex |
b[], |
|
|
doublecomplex |
x[], |
|
|
int |
m, |
|
|
int |
maxiter, |
|
|
int * |
iter, |
|
|
double * |
res, |
|
|
int |
lwork, |
|
|
doublecomplex |
work[], |
|
|
int * |
info, |
|
|
doublecomplex |
xx[], |
|
|
doublecomplex |
yy[], |
|
|
int * |
irev |
|
) |
| |
不完全直交化法(DIOM)による連立一次方程式 Ax = b の解 (複素行列) (リバースコミュニケーション版)
- 目的
- 前処理付き反復法(不完全直交化法(DIOM))により連立一次方程式 Ax = b の解を求める.
- 引数
-
[in] | n | 行列の次数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
[in] | b[] | 配列 b[lb] (lb >= n)
右辺ベクトル b. |
[in,out] | x[] | 配列 x[lx] (lx >= n)
[in] 解の初期推定値.
[out] 求められた近似解. |
[in] | m | 打ち切りパラメータ. (0 < m <= n) |
[in] | maxiter | 最大反復回数. (maxiter > 0) |
[out] | iter | 最終的な反復回数. |
[out] | res | 最終的な残差ノルム norm(b - A*x). |
[in] | lwork | 配列 work[]のサイズ. (lwork >= 2*(m + 1)*n + (m + 1)*m) |
[out] | work[] | 配列 work[lwork]
作業領域. |
[out] | info | = 0: 正常終了.
< 0: (-info)番目の入力パラメータの誤り.
= 11: 最大反復回数を超えた.
= 12: ブレークダウンが発生した. |
[in,out] | xx[] | matvec および psolve演算のための配列 xx[]. |
[in,out] | yy[] | matvec および psolve演算のための配列 yy[]. |
[in,out] | irev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に irev = 0 に設定しておくこと. それ以降の呼び出し時にはirevの値を変更してはならない(収束時を除く).
[out] 0 以外のときには下記処理を行ってから再び本ルーチンを呼び出すこと.
= 0: 処理終了. 正常終了かどうかはinfoをチェックすること.
= 1, 2: matvec演算. A*xx を yy[] に設定すること. 他の変数を変更してはならない.
= 21, 22: psolve演算. M*xx = yy の解を xx[] に設定すること. 他の変数を変更してはならない.
= 91, 92: 収束判定を行うために反復ごとに戻る. 収束時には irev = 99 として, それ以外のときは irev を変更せずに再度呼び出すこと. x[], iter および res にはその反復時の最新の値が入っているので収束判定のために使用するとよい. また, 中間結果出力のために使ってもよい. |
|