|TOP Page|
前節ではCG法の収束が行列の固有値分布に強く依存することが分かった。
ここで、解くべき方程式を行列
を使って次のように変形できたとする。
但し、、
、
である。ここで、
は特異でない行列である。
が正定値対称の場合、
も正定値対称となる。そこで連立一次方程式
にCG法を適応することを考える。
もしも、が
よりも条件数が小さいようなよい固有値の分布をしているとすると、より早く解を求めることができることが分かる。
ここで行列とおく。以下、行列
、
や
を用いることなく、
の逆行列
のみを用いて、連立一次方程式
にCG法を適応しているのと同一になるようにCG法のアルゴリズムを書き直す。
の時、
となり、変形した連立一次方程式
は解かずとも解が求められる。
連立一次方程式にCG法した際の残差
、探索方向ベクトル
とする。
よって、、
とおくと、CG法の係数は次のように表すことができる。
CG法の関係式から、
が成り立つ。よってこれから、解,残差
,ベクトル
の更新について求めることができる。
よって、CG法のアルゴリズムは次のようになる。
  1.  
,
,
  2.  
  3.     
  4.     
  5.     
  6.     
  7.     
  8.     
  9.  
は前処理行列と呼ばれる。実際に用いられるのは前処理行列
そのものではなく、前処理行列
は連立一次方程式
を解いて
を求めることさえできればよい。
を解くことが
を解くこととあまり難しさが変わらなければ本末転倒である。つまり前処理行列
は
より簡単に解くことができる必要がある。前処理行列
には、
と十分に近い
という性質が求められる。
の時、
となり、わずか1回の反復で収束する。つまり
ならば、
となりよい固有値分布が得られ収束も早くなると考えられる。またCG法に限って言えば、
と表されていたので、前処理行列
は正定値対称でなくてはならない。逆に
が正定値対称の場合は
となるような実行列
が存在することが知られている。以上をまとめると、
前処理行列![]() ![]() ![]() ![]() |
ということがいえる。CG法向けの前処理行列が対称である前処理として代表的なものは
があげられる。不完全LU分解を前処理として使ったPCG法は特にICCG法と呼ばれよく使われる。
次のサンプルプログラムは次のようなポアソン方程式から生じるような線形一次方程式を
「0レベルの不完全ILU分解を前処理としたCG法」によって解くプログラムである。
DOWNLOAD | ILU_CG.zip |
---|
OS:WindowsXP, Windows2000 開発環境:VC++ 2005 言語:C++
このプログラムもまた実行すると収束の履歴がconv_history.datに保存され、gnuplotで見ることができる。
次のグラフはサンプルプログラムのCG法とICCG法の収束履歴を比較したものである。
前処理なしのCG法に比べてILU(0)_CG法は収束が各段に早くなっていることがわかる。