平均値と変動

平均を計算するための数式

注記: このセクションは ref 179 からのものです。

分析時に、平均値 \(\left<x\right>\) と変動を計算します。

(24)\[\left<(\Delta x)^2\right>^{{\frac{1}{2}}} ~=~ \left<[x-\left<x\right>]^2\right>^{{\frac{1}{2}}}\]

以下は、量 \(x\) の平均値を計算する必要がある。系列の N 個の \(x_i\) の値の分散 \(\sigma_x\) は、次から計算できる。

(25)\[\sigma_x~=~ \sum_{i=1}^{N_x} x_i^2 ~-~ \frac{1}{N_x}\left(\sum_{i=1}^{N_x}x_i\right)^2\]

残念ながら、この式は数値的に正確ではありません。特に、\(\sigma_x^{{\frac{1}{2}}}\)\(x_i\) の値と比較して小さい場合に、その精度が低下します。以下に示す(同等の)式の方が数値的に正確です。

(26)\[\sigma_x ~=~ \sum_{i=1}^{N_x} [x_i - \left<x\right>]^2\]

with

(27)\[\left<x\right> ~=~ \frac{1}{N_x} \sum_{i=1}^{N_x} x_i\]

使用する (25)(27) を使用する場合、一次には \(x_i\) の系列全体を2回処理する必要があります。1回目は \(\left<x\right>\) を決定し、もう1回目は \(\sigma_x\) を計算するために使用します。一方、(24)\(x_i\) の系列全体を1回の連続スキャンで処理するだけで済みます。ただし、(25) を別の形式に変換し、部分合計を含むようにすることで、連続的な更新アルゴリズムを使用できます。部分合計を定義します。

(28)\[X_{n,m} ~=~ \sum_{i=n}^{m} x_i\]

および部分分散

(29)\[\sigma_{n,m} ~=~ \sum_{i=n}^{m} \left[x_i - \frac{X_{n,m}}{m-n+1}\right]^2\]

これは示すことができる

(30)\[X_{n,m+k} ≈ X_{n,m} + X_{m+1,m+k}\]

および

(31)\[\begin{split}\begin{aligned} \sigma_{n,m+k} &=& \sigma_{n,m} + \sigma_{m+1,m+k} + \left[~\frac {X_{n,m}}{m-n+1} - \frac{X_{n,m+k}}{m+k-n+1}~\right]^2~* \nonumber\\ && ~\frac{(m-n+1)(m+k-n+1)}{k} \end{aligned}\end{split}\]

\(n=1\) の場合、以下の結果が得られます

(32)\[\sigma_{1,m+k} ~=~ \sigma_{1,m} + \sigma_{m+1,m+k}~+~ \left[~\frac{X_{1,m}}{m} - \frac{X_{1,m+k}}{m+k}~\right]^2~ \frac{m(m+k)}{k}\]

また、\(n=1\) および \(k=1\) の場合、\(eqn. %s <eqnvarpartial>\) は次のようになります。

(33)\[\begin{split}\begin{aligned} \sigma_{1,m+1} &=& \sigma_{1,m} + \left[\frac{X_{1,m}}{m} - \frac{X_{1,m+1}}{m+1}\right]^2 m(m+1)\\ &=& \sigma_{1,m} + \frac {[~X_{1,m} - m x_{m+1}~]^2}{m(m+1)} \end{aligned}\end{split}\]

ここで、以下の関係を利用しています。

(34)\[X_{1,m+1} ≈ X_{1,m} + x_{m+1}\]

数式:(33)(34) を使用して、平均値を計算します。

(35)\[\left<x\right> ~=~ \frac{X_{1,N_x}}{N_x}\]

および変動

(36)\[\left<(\Delta x)^2\right>^{{\frac{1}{2}}} = \left[\frac {\sigma_{1,N_x}}{N_x}\right]^{{\frac{1}{2}}}\]

これらは、データ全体を1回のスキャンで取得できます。

実装

GROMACS では、瞬間のエネルギー \(E(m)\) は、energy ファイル に、また \(\sigma_{1,m}\)\(X_{1,m}\) の値と一緒に保存されます。ステップのカウントは 0 から開始されますが、エネルギーと変動のステップは 1 から開始されます。つまり、このセクションで示されている方程式は、実際に実装されているものです。このセクションでは、コードと方程式の後の検証を容易にするために、ある程度詳細な導出を示します。

シミュレーションの一部

まず、シミュレーションで最初の部分、*例:*100 psを平衡状態とみなすことはよくあります。ただし、:ref:`ログファイル<log>`に表示される平均値と変動は、シミュレーション全体で計算されます。この場合、シミュレーションの一部として平衡状態に移行する初期段階の影響が大きくなるため、これらの平均値と変動が無効になる可能性があります。

使用:(30) および (31) を使用すると、軌跡の一部に対する平均値と標準偏差を計算できます。

(37)\[\begin{split}\begin{aligned} X_{m+1,m+k} &=& X_{1,m+k} - X_{1,m} \\ \sigma_{m+1,m+k} &=& \sigma_{1,m+k}-\sigma_{1,m} - \left[~\frac{X_{1,m}}{m} - \frac{X_{1,m+k}}{m+k}~\right]^{2}~ \frac{m(m+k)}{k}\end{aligned}\end{split}\]

または、より一般的に(\(p \geq 1\) および \(q \geq p\) の場合):

(38)\[\begin{split}\begin{aligned} X_{p,q} &=& X_{1,q} - X_{1,p-1} \\ \sigma_{p,q} &=& \sigma_{1,q}-\sigma_{1,p-1} - \left[~\frac{X_{1,p-1}}{p-1} - \frac{X_{1,q}}{q}~\right]^{2}~ \frac{(p-1)q}{q-p+1}\end{aligned}\end{split}\]

注意:この実装は必ずしも簡単ではありません。なぜなら、シミュレーションの各時間ステップでエネルギーが保存されないからです。したがって、\(X_{1,p-1}\)\(\sigma_{1,p-1}\) を、(33)(34) を使用して、時間 \(p\) の情報から構築する必要があります。

(39)\[\begin{split}\begin{aligned} X_{1,p-1} &=& X_{1,p} - x_p \\ \sigma_{1,p-1} &=& \sigma_{1,p} - \frac {[~X_{1,p-1} - (p-1) x_{p}~]^2}{(p-1)p}\end{aligned}\end{split}\]

2つのシミュレーションの結合

よくあるもう一つの問題は、2つのシミュレーションの変動を組み合わせる必要があることです。例えば、次の例を考えてみましょう:シミュレーションAとシミュレーションBがあり、それぞれ:math:`n`と:math:`m`ステップのシミュレーションです。ここで、シミュレーションBはシミュレーションAの続きであり、シミュレーションBは1から番号を始めるのではなく、:math:`n+1`から番号を始めます。この場合、部分和は問題ありません。シミュレーションAから:math:`X_{1,n}^A`を追加する必要があります。

(40)\[X_{1,n+m}^{AB} ≈ X_{1,n}^A + X_{1,m}^B\]

「2つの成分から部分分散を計算する場合、修正 Deltasigma を行う必要があります。」

(41)\[\sigma_{1,n+m}^{AB} ~=~ \sigma_{1,n}^A + \sigma_{1,m}^B +\Delta\sigma\]

もし、\(x_i^{AB}\) を、データポイントを統合し、再番号化したセットとして定義した場合、次のように記述できます:

(42)\[\sigma_{1,n+m}^{AB} ~=~ \sum_{i=1}^{n+m} \left[x_i^{AB} - \frac{X_{1,n+m}^{AB}}{n+m}\right]^2\]

そして、それによって

(43)\[\sum_{i=1}^{n+m} \left[x_i^{AB} - \frac{X_{1,n+m}^{AB}}{n+m}\right]^2 ~=~ \sum_{i=1}^{n} \left[x_i^{A} - \frac{X_{1,n}^{A}}{n}\right]^2 + \sum_{i=1}^{m} \left[x_i^{B} - \frac{X_{1,m}^{B}}{m}\right]^2 +\Delta\sigma\]

または

(44)\[\begin{split}\begin{aligned} \sum_{i=1}^{n+m} \left[(x_i^{AB})^2 - 2 x_i^{AB}\frac{X^{AB}_{1,n+m}}{n+m} + \left(\frac{X^{AB}_{1,n+m}}{n+m}\right)^2 \right] &-& \nonumber \\ \sum_{i=1}^{n} \left[(x_i^{A})^2 - 2 x_i^{A}\frac{X^A_{1,n}}{n} + \left(\frac{X^A_{1,n}}{n}\right)^2 \right] &-& \nonumber \\ \sum_{i=1}^{m} \left[(x_i^{B})^2 - 2 x_i^{B}\frac{X^B_{1,m}}{m} + \left(\frac{X^B_{1,m}}{m}\right)^2 \right] &=& \Delta\sigma\end{aligned}\end{split}\]

すべての \(x_i^2\) の項が消え、合計のカウンタ \(i\) に依存しない項を簡略化できます:

(45)\[\begin{split}\begin{aligned} \frac{\left(X^{AB}_{1,n+m}\right)^2}{n+m} \,-\, \frac{\left(X^A_{1,n}\right)^2}{n} \,-\, \frac{\left(X^B_{1,m}\right)^2}{m} &-& \nonumber \\ 2\,\frac{X^{AB}_{1,n+m}}{n+m}\sum_{i=1}^{n+m}x_i^{AB} \,+\, 2\,\frac{X^{A}_{1,n}}{n}\sum_{i=1}^{n}x_i^{A} \,+\, 2\,\frac{X^{B}_{1,m}}{m}\sum_{i=1}^{m}x_i^{B} &=& \Delta\sigma\end{aligned}\end{split}\]

私たちが2行目の3つの部分合計を認識し、(40) を使用して、次の結果を得ます:

(46)\[\Delta\sigma ~=~ \frac{\left(mX^A_{1,n} - nX^B_{1,m}\right)^2}{nm(n+m)}\]

もし、m=1 を挿入してこの値を検証すると、(33) が返されます。

エネルギー項の合計

プログラム gmx energy は、エネルギー項を1つに合計することも可能です。*例*として、ポテンシャル + 運動エネルギー = 運動エネルギーを計算できます。部分的な平均を計算する場合、エネルギー項 \(S\)\(s\) の場合に、これは簡単です。

(47)\[X_{m,n}^S ~=~ \sum_{i=m}^n \sum_{s=1}^S x_i^s ~=~ \sum_{s=1}^S \sum_{i=m}^n x_i^s ~=~ \sum_{s=1}^S X_{m,n}^s\]

変動に関しては、例えばポテンシャルと運動エネルギーの変動が打ち消し合うという点を考慮すると、さらに複雑になります。しかし、以前と同様の方法を試すことができます。具体的には、次のように記述します:

(48)\[\sigma_{m,n}^S ~=~ \sum_{s=1}^S \sigma_{m,n}^s + \Delta\sigma\]

もし、(29) を入力した場合:

(49)\[\sum_{i=m}^n \left[\left(\sum_{s=1}^S x_i^s\right) - \frac{X_{m,n}^S}{m-n+1}\right]^2 ~=~ \sum_{s=1}^S \sum_{i=m}^n \left[\left(x_i^s\right) - \frac{X_{m,n}^s}{m-n+1}\right]^2 + \Delta\sigma\]

これにより、以下のようになります。

(50)\[\begin{split}\begin{aligned} &~&\sum_{i=m}^n \left[\sum_{s=1}^S (x_i^s)^2 + \left(\frac{X_{m,n}^S}{m-n+1}\right)^2 -2\left(\frac{X_{m,n}^S}{m-n+1}\sum_{s=1}^S x_i^s + \sum_{s=1}^S \sum_{s'=s+1}^S x_i^s x_i^{s'} \right)\right] \nonumber \\ &-&\sum_{s=1}^S \sum_{i=m}^n \left[(x_i^s)^2 - 2\,\frac{X_{m,n}^s}{m-n+1}\,x_i^s + \left(\frac{X_{m,n}^s}{m-n+1}\right)^2\right] ~=~\Delta\sigma \end{aligned}\end{split}\]

(x_i^s)^2 が打ち消し合うため、以下のように簡略化できます:

(51)\[\begin{split}\begin{aligned} &~&\frac{\left(X_{m,n}^S\right)^2}{m-n+1} -2 \frac{X_{m,n}^S}{m-n+1}\sum_{i=m}^n\sum_{s=1}^S x_i^s -2\sum_{i=m}^n\sum_{s=1}^S \sum_{s'=s+1}^S x_i^s x_i^{s'}\, - \nonumber \\ &~&\sum_{s=1}^S \sum_{i=m}^n \left[- 2\,\frac{X_{m,n}^s}{m-n+1}\,x_i^s + \left(\frac{X_{m,n}^s}{m-n+1}\right)^2\right] ~=~\Delta\sigma \end{aligned}\end{split}\]

または

(52)\[-\frac{\left(X_{m,n}^S\right)^2}{m-n+1} -2\sum_{i=m}^n\sum_{s=1}^S \sum_{s'=s+1}^S x_i^s x_i^{s'}\, + \sum_{s=1}^S \frac{\left(X_{m,n}^s\right)^2}{m-n+1} ~=~\Delta\sigma\]

もし、現在、最初の項を (47) を使用して展開すると、次のようになります。

(53)\[-\frac{\left(\sum_{s=1}^SX_{m,n}^s\right)^2}{m-n+1} -2\sum_{i=m}^n\sum_{s=1}^S \sum_{s'=s+1}^S x_i^s x_i^{s'}\, + \sum_{s=1}^S \frac{\left(X_{m,n}^s\right)^2}{m-n+1} ~=~\Delta\sigma\]

これにより、次のように再定義できます:

(54)\[-2\left[\sum_{s=1}^S \sum_{s'=s+1}^S X_{m,n}^s X_{m,n}^{s'}\,+\sum_{i=m}^n\sum_{s=1}^S \sum_{s'=s+1}^S x_i^s x_i^{s'}\right] ~=~\Delta\sigma\]

または

(55)\[-2\left[\sum_{s=1}^S X_{m,n}^s \sum_{s'=s+1}^S X_{m,n}^{s'}\,+\,\sum_{s=1}^S \sum_{i=m}^nx_i^s \sum_{s'=s+1}^S x_i^{s'}\right] ~=~\Delta\sigma\]

これにより

(56)\[-2\sum_{s=1}^S \left[X_{m,n}^s \sum_{s'=s+1}^S \sum_{i=m}^n x_i^{s'}\,+\,\sum_{i=m}^n x_i^s \sum_{s'=s+1}^S x_i^{s'}\right] ~=~\Delta\sigma\]

「すべてのデータポイント \(i\) を評価する必要があるため、一般的にはこれは不可能です。したがって、左辺 \(\sigma_{m,n}^S\)\(\sigma_{m,n}^S\) の推定値を、利用可能なデータポイントのみを使用して計算できます。シミュレーション内のすべての時間ステップを使用して平均を計算できますが、エネルギーの保存頻度によって、その精度は制限されます。この操作は、例えば xmgr などのプログラムで簡単に実行できるため、GROMACS には組み込まれていません。