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

◆ z_cocr()

void z_cocr ( 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  mode,
int  maxiter,
int *  iter,
double *  res,
int  lwork,
doublecomplex  work[],
int *  info 
)

COCR(Conjugate Orthogonal Conjugate Residual)法による連立一次方程式 Ax = b の解 (複素対称行列)

目的
前処理付き反復法(COCR法)により複素対称行列を係数とする連立一次方程式 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[]に入れる.
}
注 - 行列 M は正定値であること.
[in]chkconv反復ごとに呼び出され収束判定を行うユーザーサブルーチンで, 次のように定義すること. ここで, x[]は現在の近似解, resは現在の残差ノルム, 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]mode引数 chkcnv および res において返す残差ノルムを選択することができる.
= 0: norm(b - A*x) を返す. ただし, 反復ごとに1回のmatvec演算が追加で必要になる.
= 1: M^(-1)*norm(b - A*x) を返す.
(上記以外の値であれば mode = 0 とみなす)
[in]maxiter最大反復回数. (maxiter > 0)
[out]iter最終的な反復回数.
[out]res最終的な残差ノルム.
[in]lwork配列 work[]のサイズ. (lwork >= 6*n)
[out]work[]配列 work[lwork]
作業領域.
[out]info= 0: 正常終了.
< 0: (-info)番目の入力パラメータの誤り.
= 11: 最大反復回数を超えた.
= 12: 行列 A が特異である.