Diis struct

提供: ComplexRI: Manual
ナビゲーションに移動 検索に移動

概要

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の初期値を返す。
 !!!