<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>http://comp.chem.tohoku.ac.jp/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Diis_struct</id>
	<title>Diis struct - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="http://comp.chem.tohoku.ac.jp/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Diis_struct"/>
	<link rel="alternate" type="text/html" href="http://comp.chem.tohoku.ac.jp/mediawiki/index.php?title=Diis_struct&amp;action=history"/>
	<updated>2026-05-26T19:55:06Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.36.2</generator>
	<entry>
		<id>http://comp.chem.tohoku.ac.jp/mediawiki/index.php?title=Diis_struct&amp;diff=1116&amp;oldid=prev</id>
		<title>Hirano: ページの作成:「== 概要 == diis_struct はSCF計算に対する収束加速法であるDIIS法の計算を行う構造体である。  SCF計算は分極計算やWHAM計算等、多く…」</title>
		<link rel="alternate" type="text/html" href="http://comp.chem.tohoku.ac.jp/mediawiki/index.php?title=Diis_struct&amp;diff=1116&amp;oldid=prev"/>
		<updated>2026-05-26T04:17:20Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == diis_struct はSCF計算に対する収束加速法であるDIIS法の計算を行う構造体である。  SCF計算は分極計算やWHAM計算等、多く…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
diis_struct はSCF計算に対する収束加速法であるDIIS法の計算を行う構造体である。&lt;br /&gt;
&lt;br /&gt;
SCF計算は分極計算やWHAM計算等、多くの場面で見られ、DIIS法は容易に適用される。&lt;br /&gt;
&lt;br /&gt;
現在FreeFlexではWHAM計算のみにDIISを用いている。&lt;br /&gt;
&lt;br /&gt;
== 変数 ==&lt;br /&gt;
'''ndiis:''' DIISの次数。過去ndiis回のSCF結果から、次のステップでの解を予測する。&lt;br /&gt;
&lt;br /&gt;
'''n:''' データ配列の大きさ。&lt;br /&gt;
&lt;br /&gt;
'''x:''' 過去ndiis回のSCFデータ。 x(1:ndiis+1,1:n)&lt;br /&gt;
&lt;br /&gt;
== 計算の詳細 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
A\mathbf{x} = \mathbf{b}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
で表される連立方程式を解くことと、&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
L=\frac{1}{2}|A\mathbf{x}-\mathbf{b}|^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
を最小化する&amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;を求めることは等価である。&lt;br /&gt;
&lt;br /&gt;
ここで、過去&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;ステップ分の&amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;の線形結合により推定ベクトル&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathbf{x}^{n+1}=\sum_{i=1}^nc_i\mathbf{x}^i&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
を作ることを考える。&lt;br /&gt;
&lt;br /&gt;
ただしここでは&amp;lt;math&amp;gt;\sum_{i=1}^nc_i=1&amp;lt;/math&amp;gt;とする。&lt;br /&gt;
&amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;が&amp;lt;math&amp;gt;\mathbf{x}&amp;lt;/math&amp;gt;に依存しないとき、すなわち線形であるときには&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{x}^{n+1}&amp;lt;/math&amp;gt;により得られる残差は直ちに&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
L=\frac{1}{2}|A\mathbf{x}^{n+1}-\mathbf{b}|^2 \\&lt;br /&gt;
=\frac{1}{2}|\sum_ic_iA\mathbf{x}^i-\mathbf{b}|^2 \\&lt;br /&gt;
=\frac{1}{2}|\sum_ic_i\mathbf{p}^i|^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
と計算される。ここで残差ベクトル&amp;lt;math&amp;gt;\mathbf{p}_i=A\mathbf{x}^i-b&amp;lt;/math&amp;gt;である。&lt;br /&gt;
&lt;br /&gt;
推定解としてもっともらしいものは、&amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;を最小化するような&amp;lt;math&amp;gt;{c}&amp;lt;/math&amp;gt;の組である。&lt;br /&gt;
&lt;br /&gt;
拘束条件&amp;lt;math&amp;gt;\sum_{i=1}^nc_i=1&amp;lt;/math&amp;gt;が課せられているから、Lagrangeの未定乗数法により目的関数&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\mathscr{L}=L-\lambda(\sum_i c_i-1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
を定義すれば良い。&lt;br /&gt;
ここから&amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;を最小化する条件として、以下の式が得られる。&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial c_i}=\sum_j c_j\mathbf{p}^j\cdot\mathbf{p}^i-\lambda=0 \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial \lambda}=1-\sum_i c_i=0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらを行列形式で書けば&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\begin{pmatrix} B_{11}&amp;amp;B_{12}&amp;amp;\cdots&amp;amp;B_{1n}&amp;amp;-1 \\&lt;br /&gt;
 B_{21}&amp;amp;&amp;amp;&amp;amp;&amp;amp;-1 \\&lt;br /&gt;
 \vdots&amp;amp;&amp;amp;&amp;amp;&amp;amp;\vdots \\&lt;br /&gt;
 B_{n1}&amp;amp;&amp;amp;&amp;amp;&amp;amp;-1 \\&lt;br /&gt;
 -1&amp;amp;-1&amp;amp;-1&amp;amp;-1&amp;amp;0 \end{pmatrix}&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
c_1 \\ c_2 \\ \vdots \\ c_n \\ \lambda&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
0 \\ 0 \\ \vdots \\ 0 \\ -1&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
となる。ここで&amp;lt;math&amp;gt;B_{ij}=\mathbf{p}_i\cdot\mathbf{p}_j&amp;lt;/math&amp;gt;とした。&lt;br /&gt;
&lt;br /&gt;
== 出力 ==&lt;br /&gt;
現状下記が実装されている。 必要に応じて各自追加する。&lt;br /&gt;
&lt;br /&gt;
  subroutine init(ndiis,n)&lt;br /&gt;
  !!!&lt;br /&gt;
  !!! 配列のallocationやゼロセットを行う。&lt;br /&gt;
  !!!&lt;br /&gt;
  &lt;br /&gt;
  subroutine store(x)&lt;br /&gt;
  !!!&lt;br /&gt;
  !!! 過去のデータを保存する。&lt;br /&gt;
  !!!&lt;br /&gt;
  &lt;br /&gt;
  subroutine predict(x)&lt;br /&gt;
  !!!&lt;br /&gt;
  !!! 過去のデータからDIIS法により予測された、次のステップにおけるSCFの初期値を返す。&lt;br /&gt;
  !!!&lt;/div&gt;</summary>
		<author><name>Hirano</name></author>
	</entry>
</feed>