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)
計算の詳細
構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\displaystyle A\mathbf{x} = \mathbf{b} } で表される連立方程式を解くことと、 構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\displaystyle L=\frac{1}{2}|A\mathbf{x}-\mathbf{b}|^2 } を最小化するを求めることは等価である。
ここで、過去ステップ分のの線形結合により推定ベクトル を作ることを考える。
ただしここではとする。 がに依存しないとき、すなわち線形であるときには 構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\displaystyle \mathbf{x}^{n+1}} により得られる残差は直ちに 構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\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 } と計算される。ここで残差ベクトル構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\displaystyle \mathbf{p}_i=A\mathbf{x}^i-b} である。
推定解としてもっともらしいものは、構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\displaystyle L} を最小化するような構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\displaystyle {c}} の組である。
拘束条件構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\displaystyle \sum_{i=1}^nc_i=1} が課せられているから、Lagrangeの未定乗数法により目的関数 構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\displaystyle \mathscr{L}=L-\lambda(\sum_i c_i-1) } を定義すれば良い。 ここから構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\displaystyle L} を最小化する条件として、以下の式が得られる。 構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\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 }
これらを行列形式で書けば 構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\displaystyle \begin{align} \begin{pmatrix} B_{11}&B_{12}&\cdots&B_{1n}&-1 \\ B_{21}&&&&-1 \\ \vdots&&&&\vdots \\ B_{n1}&&&&-1 \\ -1&-1&-1&-1&0 \end{pmatrix} \begin{pmatrix} c_1 \\ c_2 \\ \vdots \\ c_n \\ \lambda \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \\ \vdots \\ 0 \\ -1 \end{pmatrix} \end{align} }
となる。ここで構文解析に失敗 (MathML、ただし動作しない場合はSVGかPNGで代替(最新ブラウザーや補助ツールに推奨): サーバー「https://wikimedia.org/api/rest_v1/」から無効な応答 ("Math extension cannot connect to Restbase."):): {\displaystyle B_{ij}=\mathbf{p}_i\cdot\mathbf{p}_j} とした。
出力
現状下記が実装されている。 必要に応じて各自追加する。
subroutine init(ndiis,n) !!! !!! 配列のallocationやゼロセットを行う。 !!! subroutine store(x) !!! !!! 過去のデータを保存する。 !!! subroutine predict(x) !!! !!! 過去のデータからDIIS法により予測された、次のステップにおけるSCFの初期値を返す。 !!!