今回は共役勾配法(Conjugate gradient method, CG法)のお話です
これも勾配法の仲間で,最急降下法に比べてかなり賢いアルゴリズムとなります
坂和正敏著「非線形システムの最適化 一目的から多目的へ」【5.2】75頁をフォローします
前回と同じ2変数の簡単な最小化問題を考えます
conjugate gradient.wxm
x, y : 設計変数
obj : 評価関数(%o3)
J : 勾配ベクトル(%o4)
n : step数
m : 設計変数の数で当然2とします
設計変数の初期値も前回と同じ(0, 0)とします
※次のブロックは最適解に収束するまで繰り返すんですが・・・
2回目で早々に収束します(*゚Д゚)
step数がmの倍数なので共役方向dの初期化(-J)は行いません(画面出力は省略)
共役方向dとパラメータαを用いて更新した設計変数を%o19式に示します
objを停留させるαをfind_root関数を用いて一次探索します(%o20)
この結果から定まった設計変数を%o21式に示します
step数がmの倍数なので共役方向dの更新は行いません(%o22)
評価関数の値を%o24式に示します
設計変数の収束の様子を横軸にx, 縦軸にyとして%t25にプロットします
前々回の最急降下法がアホの子に見えます・・・('A`)
追記
昔は”共役傾斜法”と呼んでいたような気がします
ちなみに有限要素法などの大規模な連立一次方程式を解くためのソルバーとして不完全コレスキー分解付き共役勾配法(Incomplete Cholesky Conjugate Gradient method : ICCG法)がよく使われていました