前処理付き共役勾配法
参考文献
- Wendland, H. (2017). Numerical Linear Algebra: An Introduction (Cambridge Texts in Applied Mathematics). Cambridge: Cambridge University Press. doi:10.1017/9781316544938
- 森 正武, 共立数学講座12 数値解析 (第2版), 共立出版 (2002)
前処理とは
前処理 (preconditioning) とは,ある線形連立方程式,
もう少し具体的に
ただし,
良い前処理とは
極端な例を挙げると,前処理によって,
したがって,単位行列に近くなるように,前処理を施すことが,良い前処理だということになります.
共役勾配法では,固有値が縮退していると反復回数が少なくなります.単位行列は1つの固有値しか持たないので,この点で,固有値の縮退している数が多いほど,単位行列に近いと言えます.
より数学的に厳密なことが知りたい方は,参考文献を参照してください.
前処理付き共役勾配法
今回は共役勾配法に前処理をつけることを考えます.
そのため
となる,行列
共役勾配法のアルゴリズム
ここで,共役勾配法のアルゴリズムを書いておきます.
これは,
Input:
Set
while
\alpha_j \coloneqq \frac{|| r_j ||_2^2}{\langle Ap_j, p_j\rangle_2} x_{j+1} \coloneqq x_j + \alpha_j p_j r_{j+1} \coloneqq r_j - \alpha_j Ap_j \beta_{j+1} \coloneqq \frac{||r_{j+1}||_2^2}{||r_j||_2^2} p_{j+1} \coloneqq r_{j+1} + \beta_{j+1} p_j j \coloneqq j+1
done
前処理付き共役勾配法のアルゴリズム(導出)
行列
の共役勾配法は,先述のアルゴリズムを適用すると,
Input:
Set
while
\alpha_j \coloneqq \frac{|| r_j ||_2^2}{\langle S^\mathrm{T}AS p_j, p_j\rangle_2} y_{j+1} \coloneqq y_j + \alpha_j p_j r_{j+1} \coloneqq r_j - \alpha_j S^\mathrm{T}AS p_j \beta_{j+1} \coloneqq \frac{||r_{j+1}||_2^2}{||r_j||_2^2} p_{j+1} \coloneqq r_{j+1} + \beta_{j+1} p_j j \coloneqq j+1
done
となる.この反復法によって得られた
これをもう少し変形して,直接解
変形
以下のように記号を定義する.
今,
これらを使って,
となることがわかる.したがって,
となる.
前処理付き共役勾配法のアルゴリズム
したがって,前処理付き共役勾配法のアルゴリズムは以下のようになる.
(注意:上までは
Input:
Set
while
\alpha_j \coloneqq \frac{ \langle r_j, z_j \rangle_2}{\langle Ap_j, p_j \rangle_2} x_{j+1} \coloneqq x_j + \alpha_j p_j r_{j+1} \coloneqq r_j - \alpha_j Ap_j \beta_j \coloneqq \frac{\langle r_{j+1}, z_{j+1} \rangle_2}{\langle r_j, z_j \rangle_2} z_{j+1} \coloneqq P r_{j+1} p_{j+1} \coloneqq z_{j+1} + \beta_{j+1} p_j j \coloneqq j+1
done
P として何を選べば良いか
これは,様々なものがあるが,ここでは,不完全コレスキー分解による前処理を紹介する.
正定値対称行列
ここで,
となり,すなわち,
となる.
これを利用する.もし,コレスキー分解が速やかに実行できて,
前処理行列
と求めることができる.
しかし,コレスキー分解をすることと,連立方程式
一方で,これと似たようなことをすれば,良い前処理行列が見つかりそうである.
したがって,コレスキー分解に近いことをして,前処理行列
不完全コレスキー分解
上記の通り,コレスキー分解のようなことをして,前処理行列
ここでは,不完全コレスキー分解を紹介する.
行列
行列
-
に属する添字の場合には,コレスキー分解の計算を行わず,その要素を\mathrm{M} とする.0 -
に属さない添字の場合には,通常通りコレスキー分解の計算を行い,要素の値を決定する.\mathrm{M}
と言う手順で,下三角行列
この方法では,
一方で,コレスキー分解ではないので,得られた分解,
は
不完全コレスキー分解前処理付き共役勾配法
不完全コレスキー分解によって得られる行列
すなわち,
とする.これはすなわち,
と選ぶことに対応する.
不完全コレスキー分解前処理付き共役勾配法のアルゴリズム
不完全コレスキー分解前処理付き共役勾配法のアルゴリズムをまとめておく.
Input:
Set
while
\alpha_j \coloneqq \frac{ \langle r_j, z_j \rangle_2}{\langle Ap_j, p_j \rangle_2} x_{j+1} \coloneqq x_j + \alpha_j p_j r_{j+1} \coloneqq r_j - \alpha_j Ap_j z_{j+1} \coloneqq (\tilde{L} \tilde{D} \tilde{L}^\mathrm{T})^{-1} r_{j+1} \beta_{j+1} \coloneqq \frac{\langle r_{j+1}, z_{j+1} \rangle_2}{\langle r_j, z_j \rangle_2} p_{j+1} \coloneqq z_{j+1} + \beta_{j+1} p_j j \coloneqq j+1
done
ここで,
と2段階で解く.第1式は前進代入,第2式は後退代入で解くことができる.
コレスキー分解
最後に付録としてコレスキー分解のアルゴリズムを示す.
以下は,正確には修正コレスキー分解と呼ばれる.
まずは導出.
コレスキー分解とは,正定値対称行列
と下三角行列
ここで,下三角行列
これは,
となって,
LU分解は,もしできるのであれば一意に定まるので,コレスキー分解も一意である.
実際,
となるが,これは,
となって,これによって,
いま,
であるから,結局,
となる.
コレスキー分解のアルゴリズム
コレスキー分解のアルゴリズムは以下のようになる.
Input:
l_{11} = a_{11} - for
toi =2 do;n - for j = 1 to i-1 do;
l_{ij} \coloneqq a_{ij} - for
tok = 1 do;j-1 l_{ij} \coloneqq l_{ij} - l_{ik}l_{jk}
l_{ij} \coloneqq l_{ij}/d_j
d_i \coloneqq a_{ii} - for
tok=1 do;i-1 d_i \coloneqq d_i - l_{ik} l_{ik}
d_i \coloneqq \sqrt{d_i}
- for j = 1 to i-1 do;
不完全コレスキー分解
不完全コレスキー分解は,