|
◆ z_fgmres()
void z_fgmres |
( |
int |
n, |
|
|
void(*)(int, const doublecomplex[], doublecomplex[]) |
matvec, |
|
|
void(*)(int, const doublecomplex[], doublecomplex[]) |
psolve, |
|
|
void(*)(int, const doublecomplex[], double, int, int *) |
chkconv, |
|
|
const doublecomplex |
b[], |
|
|
doublecomplex |
x[], |
|
|
int |
m, |
|
|
int |
maxiter, |
|
|
int * |
iter, |
|
|
double * |
res, |
|
|
int |
lwork, |
|
|
doublecomplex |
work[], |
|
|
int * |
info |
|
) |
| |
最小残差(FGMRES)法による連立一次方程式 Ax = b の解 (複素行列)
- 目的
- 前処理付き反復法(フレキシブル最小残差(FGMRES)法)により連立一次方程式 Ax = b の解を求める.
- 引数
-
[in] | n | 行列の次数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
[in] | matvec | 行列とベクトルの積をを求めるユーザーサブルーチンで, 次のように定義すること.
void matvec(int n, const doublecomplex x[], doublecomplex y[])
{
A*x を求め y[]に入れる.
}
|
[in] | psolve | 前処理行列の適用, すなわち方程式 M*x = b の解をを求めるユーザーサブルーチンで, 次のように定義すること. ここで, M は前処理行列である.
void psolve(int n, const doublecomplex b[], doublecomplex x[])
{
M*x = b の解を求め, x[]に入れる.
}
|
[in] | chkconv | 反復ごとに呼び出され収束判定を行うユーザーサブルーチンで, 次のように定義すること. ここで, x[]は現在の近似解, resは現在の残差ノルム norm(b - A*x), iterは現在の反復回数である. 本ルーチンは中間結果を出力するために使用することもできる.
void chkconv(int n, const doublecomplex x[], double res, int iter, int *ichk)
{
収束であれば *ichk = 1, そうでなければ *ichk = 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 + 5)*n + (m + 5)*m + 1) |
[out] | work[] | 配列 work[lwork]
作業領域. |
[out] | info | = 0: 正常終了.
< 0: (-info)番目の入力パラメータの誤り.
= 11: 最大反復回数を超えた.
= 12: ブレークダウンが発生した. |
|