共役勾配法
GPUによる科学計算の例として、たびたび出てくる共役勾配法(Conjugate Gradient Method)を、復習してみた。
http://daisy.math.sci.ehime-u.ac.jp/users/tsuchiya/math/linear/cg/
に、ソースコードがあったので、これを参考にアルゴリズムを整理すれば、Ax=bのxを求めようとした場合、
- x=0として、残差ベクトルr=b-Ax、修正ベクトルp=b、を初期値とする
- alpha=pr/pAp
- x=x+alpha*p, r=r-alpha*Ap
- もし、rが一定値以下なら、終了
- beta=-rAp/pAp
- p=r+beta*p
- 2に戻る
という感じ。演算自体は単純なので、すぐに実装できたが、なぜに修正ベクトルの更新が、p=r+beta*p で良いのかが、まだ理解しきれていないので、どうも気持ち悪い。