Keyword: スパースソルバー, sparse solver, RGMRES, 疎行列, SSOR
概要
本サンプルは以下に示す非対称実スパース連立方程式を解くC言語によるプログラムです。 連立方程式は係数行列と右辺ベクトルとして与えます。
以下のプログラム例ではRGMRES法 (restarted generalized minimal residual method) を用いていますが、その他にCGS法 (conjugate gradient squared method)、及びBICGSTAB法 (bi-conjugate gradient stabilised method) に対応しています。(入力データの method = 'RGMRES' の部分を method = 'CGS'、method = 'BICGSTAB' にそれぞれ置き換える事で手法を選ぶことが可能です)
またプリコンディショナーにはSSOR (symmetric successive-over-relaxation) を用いていますが、その他にJacobi の指定及びプリコンディショナーを使用しない設定が可能です。(入力データの precon = 'S' の部分をそれぞれ precon = 'J'、precon = 'N' に置き換えることで指定可能です)
※本サンプルはnAG Toolbox for MATLAB®が提供する関数 f11de()のExampleコードです。実行にはMATLAB®本体(他社製品)とnAG Toolbox for MATLAB®が必要です。
本サンプル及び関数の詳細情報はf11de のマニュアルページをご参照ください。
入力データ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
method = 'RGMRES '; precon = 'S'; a = [2; 1; -1; -3; -2; 1; 1; 5; 3; 1; -2; -3; -1; 4; -2; -6]; irow = [int32(1);1;1;2;2;2;3;3;3;3;4;4;4;5;5;5]; icol = [int32(1);2;4;2;3;5;1;3;4;5;1;4;5;2;3;5]; omega = 1.05; b = [0; -7; 33; -19; -28]; m = int32(1); tol = 1e-10; maxitn = int32(1000); x = [0; 0; 0; 0; 0]; [xOut, rnorm, itn, ifail] = ... f11de(method, precon, a, irow, icol, omega, b, m, tol, maxitn, x)
- method には用いる計算手法 (=RGMRES) を指定しています。
- precon にはプリコンディショナーを指定しています。"S"はSSOR(Symmetric successive-over-relaxation)を意味します。
- irow には非ゼロ要素の行番号を指定しています。
- icol には非ゼロ要素の列番号を指定しています。
- omega にはSSORプリコンディショナーのリラックスパラメータであるω (=1.05) を与えています。SSOR以外のプリコンディショナーを用いる場合にはこの数値は無視されます。
- b には右辺ベクトルの値を指定しています。全部で5個の数値が指定されています。
- m には RGMRES法の再開サブスペース空間の次元 m (=1)を与えています。
- tol には計算精度 tol (=1.e-10)を与えています。
- maxitn には最大反復数 maxitn (=1000) を与えています。
- x には解の初期値を与えています。 全部で5個の数値が指定されています。 ここでは初期値として全て 0 を与えています。
- 最後に本関数を呼び出す構文を指定しています。
出力結果
1 2 3 4 5 6 7 8 9 10 11 12
xOut = 1.0000 2.0000 3.0000 4.0000 5.0000 rnorm = 5.0871e-09 itn = 13 ifail = 0
- xOut は求まった解を示しています。
- rnorm は求まった解の残差ノルムを示しています。
- itn は解を求める際の反復数を示しています。(この例では13回)
- ifail は関数がエラーを検知しなければ"0"が出力されます。