Diis struct
概要
diis_struct はSCF計算に対する収束加速法であるDIIS法の計算を行う構造体である。
SCF計算は分極計算やWHAM計算等、多くの場面で見られ、DIIS法は容易に適用される。
現在FreeFlexではWHAM計算のみにDIISを用いている。
変数
ndiis: DIISの次数。過去ndiis回のSCF結果から、次のステップでの解を予測する。
n: データ配列の大きさ。
x: 過去ndiis回のSCFデータ。 x(1:ndiis+1,1:n)
計算の詳細
で表される連立方程式を解くことと、 を最小化するを求めることは等価である。
ここで、過去ステップ分のの線形結合により推定ベクトル を作ることを考える。
ただしここではとする。 がに依存しないとき、すなわち線形であるときには により得られる残差は直ちに 構文解析に失敗 (構文エラー): {\displaystyle L=\frac{1}{2}|A\mathbf{x}^{n+1}-\mathbf{b}|^2 \\ =\frac{1}{2}|\sum_ic_iA\mathbf{x}^i-\mathbf{b}|^2 \\ =\frac{1}{2}|\sum_ic_i\mathbf{p}^i|^2 } と計算される。ここで残差ベクトルである。
推定解としてもっともらしいものは、を最小化するようなの組である。
拘束条件が課せられているから、Lagrangeの未定乗数法により目的関数 構文解析に失敗 (不明な関数「\mathscr」): {\displaystyle \mathscr{L}=L-\lambda(\sum_i c_i-1) } を定義すれば良い。 ここからを最小化する条件として、以下の式が得られる。 構文解析に失敗 (不明な関数「\mathscr」): {\displaystyle \frac{\partial \mathscr{L}}{\partial c_i}=\sum_j c_j\mathbf{p}^j\cdot\mathbf{p}^i-\lambda=0 \\ \frac{\partial \mathscr{L}}{\partial \lambda}=1-\sum_i c_i=0 }
これらを行列形式で書けば
となる。ここでとした。
出力
現状下記が実装されている。 必要に応じて各自追加する。
subroutine init(ndiis,n) !!! !!! 配列のallocationやゼロセットを行う。 !!! subroutine store(x) !!! !!! 過去のデータを保存する。 !!! subroutine predict(x) !!! !!! 過去のデータからDIIS法により予測された、次のステップにおけるSCFの初期値を返す。 !!!