Shifted BiCG法

とあるシミュレーションの問題では,シフト方程式と呼ばれる線形方程式
(A+\sigma I)x=b,\quad \sigma \in \mathbb{C},\quad A \in \mathbb{C}^{n \times n},\quad x,b \in \mathbb{C}^{n}
という,係数行列Aの対角成分がシフト量σだけ変化した方程式を解く必要が出てくるそうだ.Aは大規模で疎なものを対象としており,σは複数個現れるそうだ.これを解く方法としては,σだけ変化した係数行列をつくり,それをKrylov部分空間法なんかで解いてあげれば良いのだが,σの数だけ係数行列を新たに生成するのはあまり効率がよろしくない.

そこで,シフト方程式の係数行列を直接生成せずに,Ax=b(シード方程式と呼ばれている)を解く際に,ついでにシフト方程式も解いてあげて,全体の計算量を節約しよう,という解法が生み出された.さまざまな解法が生み出されているが,その1つに,BiCG法を拡張することで得られるShifted BiCG法がある.

論文に擬似コードが載っていたので,matlabで実装することにした.コード例はこんな感じ.シフト量σは複数個扱えるようにしている(はず).

シフト方程式が先に収束したらそれの反復は止めるようにしようとしたので,なんかとても中途半端な感じになっている(配列をまとめて処理するような書き方をしてしまったので,該当する要素については計算しない,というのがめんどくさくて投げた).そのうち直す(直さない).