数値積分アルゴリズム
ヴェルレ積分 ( フランス語発音: [vɛʁˈlɛ] )は、ニュートンの 運動方程式 を積分する ために使用される数値手法である 。 [1] 分子動力学 シミュレーションや コンピュータグラフィックス で粒子の 軌道を 計算するために頻繁に使用される 。このアルゴリズムは、1791年に ジャン・バティスト・ドゥランブル によって初めて使用され、それ以来何度も再発見されており、最近では1960年代に ルー・ヴェルレ によって分子動力学で使用されている。また、 1909年には PHカウエル と ACCクロメリンによって ハレー彗星 の軌道を計算するために使用され 、 1907年には カール・ストルマーによって 磁場 内の電気粒子の軌道を調べるために使用された(そのため ストルマー法 とも呼ばれる )。 [2]
ヴェルレ積分法は、単純な オイラー法に比べて大幅な計算コストの増加なしに、優れた 数値安定性 と、 時間可逆性 や 位相空間上のシンプレクティック形式の保存 など、 物理システム で重要な他の特性を提供します 。
ベーシック ストルマー ヴェルレ
初期条件が および である 型の 2階微分方程式 の場合 、 ステップサイズが である 時刻における 近似数値解は、 次の方法で得ることができます。
x
¨
(
t
)
=
あ
(
x
(
t
)
)
{\displaystyle {\ddot {\mathbf {x} }}(t)=\mathbf {A} {\bigl (}\mathbf {x} (t){\bigr )}}
x
(
t
0
)
=
x
0
{\displaystyle \mathbf {x} (t_{0})=\mathbf {x} _{0}}
x
˙
(
t
0
)
=
ヴ
0
{\displaystyle {\dot {\mathbf {x} }}(t_{0})=\mathbf {v} _{0}}
x
ん
≈
x
(
t
ん
)
{\displaystyle \mathbf {x} _{n}\approx \mathbf {x} (t_{n})}
t
ん
=
t
0
+
ん
Δ
t
{\displaystyle t_{n}=t_{0}+n\,\Delta t}
Δ
t
>
0
{\displaystyle \Delta t>0}
セット 、
x
1
=
x
0
+
ヴ
0
Δ
t
+
1
2
あ
(
x
0
)
Δ
t
2
{\textstyle \mathbf {x} _{1}=\mathbf {x} _{0}+\mathbf {v} _{0}\,\Delta t+{\tfrac {1}{2}}\mathbf { A} (\mathbf {x} _{0})\,\デルタ t^{2}}
n = 1, 2, ... の場合、繰り返し
x
ん
+
1
=
2
x
ん
−
x
ん
−
1
+
あ
(
x
ん
)
Δ
t
2
。
{\displaystyle \mathbf {x} _{n+1}=2\mathbf {x} _{n}-\mathbf {x} _{n-1}+\mathbf {A} (\mathbf {x} _ {n})\,\デルタ t^{2}.}
運動方程式
ニュートンの保存的物理システムに対する運動方程式は
ま
x
¨
(
t
)
=
ふ
(
x
(
t
)
)
=
−
∇
五
(
x
(
t
)
)
、
{\displaystyle {\boldsymbol {M}}{\ddot {\mathbf {x} }}(t)=F{\bigl (}\mathbf {x} (t){\bigr )}=-\nabla V{ \bigl (}\mathbf {x} (t){\bigr )},}
または個別に
メートル
け
x
¨
け
(
t
)
=
ふ
け
(
x
(
t
)
)
=
−
∇
x
け
五
(
x
(
t
)
)
、
{\displaystyle m_{k}{\ddot {\mathbf {x} }}_{k}(t)=F_{k}{\bigl (}\mathbf {x} (t){\bigr )}=- \nabla _{\mathbf {x} _{k}}V\left(\mathbf {x} (t)\right),}
どこ
t
{\displaystyle t}
時間です、
x
(
t
)
=
(
x
1
(
t
)
、
…
、
x
いいえ
(
t
)
)
{\displaystyle \mathbf {x} (t)={\bigl (}\mathbf {x} _{1}(t),\ldots ,\mathbf {x} _{N}(t){\bigr )}}
物体 の位置ベクトルの集合である。
いいえ
{\displaystyle N}
五
{\displaystyle V}
はスカラーポテンシャル関数であり、
ふ
{\displaystyle F}
はポテンシャルの 負の勾配であり 、粒子に働く力の総和を表す。
ま
{\displaystyle {\boldsymbol {M}}}
は質量行列 であり、通常は 各粒子の質量を持つブロックを含む対角行列 です。
メートル
け
{\displaystyle m_{k}}
この方程式は、ポテンシャル関数のさまざまな選択に対して、 相互作用する分子の運動から 惑星の軌道 まで、 さまざまな物理システムの進化を記述するために使用できます 。
五
{\displaystyle V}
質量を右側に持ってきて、多重粒子の構造を忘れる変換をすると、方程式は次のように簡略化される。
x
¨
(
t
)
=
あ
(
x
(
t
)
)
{\displaystyle {\ddot {\mathbf {x} }}(t)=\mathbf {A} {\bigl (}\mathbf {x} (t){\bigr )}}
位置に依存する加速度を表す 適切なベクトル値関数を使用します。通常、初期位置 と初期速度 も与えられます。
あ
(
x
)
{\displaystyle \mathbf {A} (\mathbf {x} )}
x
(
0
)
=
x
0
{\displaystyle \mathbf {x} (0)=\mathbf {x} _{0}}
ヴ
(
0
)
=
x
˙
(
0
)
=
ヴ
0
{\displaystyle \mathbf {v} (0)={\dot {\mathbf {x} }}(0)=\mathbf {v} _{0}}
ベルレ積分(速度なし)
この初期値問題を 離散化して数値的に解くには 、時間ステップ を選択し、サンプリング点のシーケンスを考慮します。タスクは、 正確な解の軌道上の
点に密接に従う 点のシーケンスを構築することです。
Δ
t
>
0
{\displaystyle \Delta t>0}
t
ん
=
ん
Δ
t
{\displaystyle t_{n}=n\,\Delta t}
x
ん
{\displaystyle \mathbf {x} _{n}}
x
(
t
ん
)
{\displaystyle \mathbf {x} (t_{n})}
オイラー法 では1 次微分方程式の 1 次導関数に 前方差分 近似を使用しますが、ヴェルレ積分では 2 次導関数に
中心差分 近似を使用すると考えられます。
Δ
2
x
ん
Δ
t
2
=
x
ん
+
1
−
x
ん
Δ
t
−
x
ん
−
x
ん
−
1
Δ
t
Δ
t
=
x
ん
+
1
−
2
x
ん
+
x
ん
−
1
Δ
t
2
=
1つの
ん
=
あ
(
x
ん
)
。
{\displaystyle {\begin{aligned}{\frac {\Delta ^{2}\mathbf {x} _{n}}{\Delta t^{2}}}&={\frac {{\frac {\ mathbf {x} _{n+1}-\mathbf {x} _{n}}{\Delta t}}-{\frac {\mathbf {x} _{n}-\mathbf {x} _{n-1}}{\Delta t}}}{\Delta t}}\\[6pt]&={\frac {\mathbf {x} _{n+ 1}-2\mathbf {x} _{n}+\mathbf {x} _{n-1}}{\デルタ t^{2}}}=\mathbf {a} _{n}=\mathbf {A} (\mathbf {x} _{n}).\end{aligned}}}
シュテルマー法 [3] で用いられる形式の ベルレ積分は、 この式を用いて、速度を使わずに前の2つの位置ベクトルから次の位置ベクトルを求める。
x
ん
+
1
=
2
x
ん
−
x
ん
−
1
+
1つの
ん
Δ
t
2
、
1つの
ん
=
あ
(
x
ん
)
。
{\displaystyle {\begin{aligned}\mathbf {x} _{n+1}&=2\mathbf {x} _{n}-\mathbf {x} _{n-1}+\mathbf {a} _{n}\,\Delta t^{2},\\[6pt]\mathbf {a} _{n}&=\mathbf {A} (\mathbf {x} _{n}).\end{整列}}}
離散化エラー
この方法に固有の時間対称性により、離散化によって積分に導入される局所誤差のレベルが、奇数次項(ここでは 3 次項)をすべて削除することによって低減されます。局所誤差は 、反復に 正確な値を挿入し、異なる時間方向の 位置ベクトルの 時点での テイラー展開を 計算することによって定量化されます。
Δ
t
{\displaystyle \Delta t}
x
(
t
ん
−
1
)
、
x
(
t
ん
)
、
x
(
t
ん
+
1
)
{\displaystyle \mathbf {x} (t_{n-1}),\mathbf {x} (t_{n}),\mathbf {x} (t_{n+1})}
t
=
t
ん
{\displaystyle t=t_{n}}
x
(
t
±
Δ
t
)
{\displaystyle \mathbf {x} (t\pm \Delta t)}
x
(
t
+
Δ
t
)
=
x
(
t
)
+
ヴ
(
t
)
Δ
t
+
1つの
(
t
)
Δ
t
2
2
+
b
(
t
)
Δ
t
3
6
+
お
(
Δ
t
4
)
x
(
t
−
Δ
t
)
=
x
(
t
)
−
ヴ
(
t
)
Δ
t
+
1つの
(
t
)
Δ
t
2
2
−
b
(
t
)
Δ
t
3
6
+
お
(
Δ
t
4
)
、
{\displaystyle {\begin{aligned}\mathbf {x} (t+\Delta t)&=\mathbf {x} (t)+\mathbf {v} (t)\Delta t+{\frac {\mathbf {a} (t)\Delta t^{2}}{2}}+{\frac {\mathbf {b} (t)\Delta t^{3}}{6}}+{\mathcal {O}}\left(\Delta t^{4}\right)\\\mathbf {x} (t-\Delta t)&=\mathbf {x} (t)-\mathbf {v} (t)\Delta t+{\frac {\mathbf {a} (t)\Delta t^{2}}{2}}-{\frac {\mathbf {b} (t)\Delta t^{3}}{6}}+{\mathcal {O}}\left(\Delta t^{4}\right),\end{aligned}}}
ここで、は 位置、 速度、 加速度、 ジャーク ( 時間に対する位置の 3 次微分)です。
x
{\displaystyle \mathbf {x} }
v
=
x
˙
{\displaystyle \mathbf {v} ={\dot {\mathbf {x} }}}
a
=
x
¨
{\displaystyle \mathbf {a} ={\ddot {\mathbf {x} }}}
b
=
a
˙
=
x
…
{\displaystyle \mathbf {b} ={\dot {\mathbf {a} }}={\overset {\dots }{\mathbf {x} }}}
これら2つの展開を加えると
x
(
t
+
Δ
t
)
=
2
x
(
t
)
−
x
(
t
−
Δ
t
)
+
a
(
t
)
Δ
t
2
+
O
(
Δ
t
4
)
.
{\displaystyle \mathbf {x} (t+\Delta t)=2\mathbf {x} (t)-\mathbf {x} (t-\Delta t)+\mathbf {a} (t)\Delta t^{2}+{\mathcal {O}}\left(\Delta t^{4}\right).}
テイラー展開の 1 次項と 3 次項が打ち消され、そのため、Verlet 積分器は単純なテイラー展開のみによる積分よりも 1 次正確になることがわかります。
ここでの加速度は厳密解 から計算されるのに対し 、反復では中心反復点 で計算される点に注意する必要があります 。厳密解と近似シーケンス間の距離であるグローバル誤差を計算する際、これら 2 つの項は正確には打ち消されず、グローバル誤差の順序に影響を及ぼします。
a
(
t
)
=
A
(
x
(
t
)
)
{\displaystyle \mathbf {a} (t)=\mathbf {A} {\bigl (}\mathbf {x} (t){\bigr )}}
a
n
=
A
(
x
n
)
{\displaystyle \mathbf {a} _{n}=\mathbf {A} (\mathbf {x} _{n})}
簡単な例
局所誤差と全体誤差の関係を理解するには、正確な解と近似解を明示的な式で表現できる簡単な例を調べると役立ちます。このタスクの標準的な例は 指数関数 です。
定数 を持つ 線形微分方程式を考えます 。その正確な基底解は およびです 。
x
¨
(
t
)
=
w
2
x
(
t
)
{\displaystyle {\ddot {x}}(t)=w^{2}x(t)}
w
{\displaystyle w}
e
w
t
{\displaystyle e^{wt}}
e
−
w
t
{\displaystyle e^{-wt}}
この微分方程式にストーマー法を適用すると、線形 回帰関係が得られる。
x
n
+
1
−
2
x
n
+
x
n
−
1
=
h
2
w
2
x
n
,
{\displaystyle x_{n+1}-2x_{n}+x_{n-1}=h^{2}w^{2}x_{n},}
または
x
n
+
1
−
2
(
1
+
1
2
(
w
h
)
2
)
x
n
+
x
n
−
1
=
0.
{\displaystyle x_{n+1}-2\left(1+{\tfrac {1}{2}}(wh)^{2}\right)x_{n}+x_{n-1}=0.}
これは、その特性多項式の根を見つけることで解くことができます
。これらは、
q
2
−
2
(
1
+
1
2
(
w
h
)
2
)
q
+
1
=
0
{\displaystyle q^{2}-2\left(1+{\tfrac {1}{2}}(wh)^{2}\right)q+1=0}
q
±
=
1
+
1
2
(
w
h
)
2
±
w
h
1
+
1
4
(
w
h
)
2
.
{\displaystyle q_{\pm }=1+{\tfrac {1}{2}}(wh)^{2}\pm wh{\sqrt {1+{\tfrac {1}{4}}(wh)^{2}}}.}
線形回帰の基本解は とです 。これらを厳密解と比較するために、テイラー展開を計算します。
x
n
=
q
+
n
{\displaystyle x_{n}=q_{+}^{n}}
x
n
=
q
−
n
{\displaystyle x_{n}=q_{-}^{n}}
q
+
=
1
+
1
2
(
w
h
)
2
+
w
h
(
1
+
1
8
(
w
h
)
2
−
3
128
(
w
h
)
4
+
O
(
h
6
)
)
=
1
+
(
w
h
)
+
1
2
(
w
h
)
2
+
1
8
(
w
h
)
3
−
3
128
(
w
h
)
5
+
O
(
h
7
)
.
{\displaystyle {\begin{aligned}q_{+}&=1+{\tfrac {1}{2}}(wh)^{2}+wh\left(1+{\tfrac {1}{8}}(wh)^{2}-{\tfrac {3}{128}}(wh)^{4}+{\mathcal {O}}\left(h^{6}\right)\right)\\&=1+(wh)+{\tfrac {1}{2}}(wh)^{2}+{\tfrac {1}{8}}(wh)^{3}-{\tfrac {3}{128}}(wh)^{5}+{\mathcal {O}}\left(h^{7}\right).\end{aligned}}}
この級数と指数級数の商 は から始まる ので、
e
w
h
{\displaystyle e^{wh}}
1
−
1
24
(
w
h
)
3
+
O
(
h
5
)
{\displaystyle 1-{\tfrac {1}{24}}(wh)^{3}+{\mathcal {O}}\left(h^{5}\right)}
q
+
=
(
1
−
1
24
(
w
h
)
3
+
O
(
h
5
)
)
e
w
h
=
e
−
1
24
(
w
h
)
3
+
O
(
h
5
)
e
w
h
.
{\displaystyle {\begin{aligned}q_{+}&=\left(1-{\tfrac {1}{24}}(wh)^{3}+{\mathcal {O}}\left(h^{5}\right)\right)e^{wh}\\&=e^{-{\frac {1}{24}}(wh)^{3}+{\mathcal {O}}\left(h^{5}\right)}\,e^{wh}.\end{aligned}}}
そこから、最初の基底解に対する誤差は次のように計算できることがわかる。
x
n
=
q
+
n
=
e
−
1
24
(
w
h
)
2
w
t
n
+
O
(
h
4
)
e
w
t
n
=
e
w
t
n
(
1
−
1
24
(
w
h
)
2
w
t
n
+
O
(
h
4
)
)
=
e
w
t
n
+
O
(
h
2
t
n
e
w
t
n
)
.
{\displaystyle {\begin{aligned}x_{n}=q_{+}^{n}&=e^{-{\frac {1}{24}}(wh)^{2}\,wt_{n}+{\mathcal {O}}\left(h^{4}\right)}\,e^{wt_{n}}\\&=e^{wt_{n}}\left(1-{\tfrac {1}{24}}(wh)^{2}\,wt_{n}+{\mathcal {O}}(h^{4})\right)\\&=e^{wt_{n}}+{\mathcal {O}}\left(h^{2}t_{n}e^{wt_{n}}\right).\end{aligned}}}
つまり、ローカル離散化誤差は 4 次ですが、微分方程式の 2 次により、グローバル誤差は 2 次となり、時間の経過とともに指数関数的に増加する定数を持ちます。
反復を開始する
計算中のステップ 、時間 での Verlet 反復の開始時に、 時間 の 位置ベクトルがすでに必要であることに注意してください 。一見すると、初期条件は初期時間 でのみわかっているため、これは問題を引き起こす可能性があります。 ただし、これらから加速度はわかっており、 2 次
テイラー多項式 を使用して最初の時間ステップでの位置の適切な近似値を取得できます。
n
=
1
{\displaystyle n=1}
t
=
t
1
=
Δ
t
{\displaystyle t=t_{1}=\Delta t}
x
2
{\displaystyle \mathbf {x} _{2}}
x
1
{\displaystyle \mathbf {x} _{1}}
t
=
t
1
{\displaystyle t=t_{1}}
t
0
=
0
{\displaystyle t_{0}=0}
a
0
=
A
(
x
0
)
{\displaystyle \mathbf {a} _{0}=\mathbf {A} (\mathbf {x} _{0})}
x
1
=
x
0
+
v
0
Δ
t
+
1
2
a
0
Δ
t
2
≈
x
(
Δ
t
)
+
O
(
Δ
t
3
)
.
{\displaystyle \mathbf {x} _{1}=\mathbf {x} _{0}+\mathbf {v} _{0}\Delta t+{\tfrac {1}{2}}\mathbf {a} _{0}\Delta t^{2}\approx \mathbf {x} (\Delta t)+{\mathcal {O}}\left(\Delta t^{3}\right).}
この場合、最初のタイム ステップの誤差は のオーダーになります 。多数のタイム ステップにわたるシミュレーションでは、最初のタイム ステップの誤差は、 位置ベクトルから までの距離についても、差の 商から まで の距離についても、 の時点での のオーダー である合計誤差のうち無視できるほど小さい量にすぎないため、これは問題 とは 見なされません。さらに、この 2 次グローバル誤差を取得するには、初期誤差が少なくとも 3 次である必要があります。
O
(
Δ
t
3
)
{\displaystyle {\mathcal {O}}\left(\Delta t^{3}\right)}
t
n
{\displaystyle t_{n}}
O
(
e
L
t
n
Δ
t
2
)
{\displaystyle {\mathcal {O}}\left(e^{Lt_{n}}\Delta t^{2}\right)}
x
n
{\displaystyle \mathbf {x} _{n}}
x
(
t
n
)
{\displaystyle \mathbf {x} (t_{n})}
x
n
+
1
−
x
n
Δ
t
{\displaystyle {\tfrac {\mathbf {x} _{n+1}-\mathbf {x} _{n}}{\Delta t}}}
x
(
t
n
+
1
)
−
x
(
t
n
)
Δ
t
{\displaystyle {\tfrac {\mathbf {x} (t_{n+1})-\mathbf {x} (t_{n})}{\Delta t}}}
一定でない時間差
ストルマー・ヴェルレ法の欠点は、時間ステップ( )が変化すると、微分方程式の解を近似できないことである。これは、式 [4]を使用して修正することができる。
Δ
t
{\displaystyle \Delta t}
x
i
+
1
=
x
i
+
(
x
i
−
x
i
−
1
)
Δ
t
i
Δ
t
i
−
1
+
a
i
Δ
t
i
2
.
{\displaystyle \mathbf {x} _{i+1}=\mathbf {x} _{i}+\left(\mathbf {x} _{i}-\mathbf {x} _{i-1}\right){\frac {\Delta t_{i}}{\Delta t_{i-1}}}+\mathbf {a} _{i}\Delta t_{i}^{2}.}
より正確な導出は、時刻 と 時刻 についてテイラー級数(2次)を使い、
t
i
{\displaystyle t_{i}}
t
i
+
1
=
t
i
+
Δ
t
i
{\displaystyle t_{i+1}=t_{i}+\Delta t_{i}}
t
i
−
1
=
t
i
−
Δ
t
i
−
1
{\displaystyle t_{i-1}=t_{i}-\Delta t_{i-1}}
v
i
{\displaystyle \mathbf {v} _{i}}
x
i
+
1
−
x
i
Δ
t
i
+
x
i
−
1
−
x
i
Δ
t
i
−
1
=
a
i
Δ
t
i
+
Δ
t
i
−
1
2
,
{\displaystyle {\frac {\mathbf {x} _{i+1}-\mathbf {x} _{i}}{\Delta t_{i}}}+{\frac {\mathbf {x} _{i-1}-\mathbf {x} _{i}}{\Delta t_{i-1}}}=\mathbf {a} _{i}\,{\frac {\Delta t_{i}+\Delta t_{i-1}}{2}},}
反復式は次のようになる。
x
i
+
1
=
x
i
+
(
x
i
−
x
i
−
1
)
Δ
t
i
Δ
t
i
−
1
+
a
i
Δ
t
i
+
Δ
t
i
−
1
2
Δ
t
i
.
{\displaystyle \mathbf {x} _{i+1}=\mathbf {x} _{i}+(\mathbf {x} _{i}-\mathbf {x} _{i-1}){\frac {\Delta t_{i}}{\Delta t_{i-1}}}+\mathbf {a} _{i}\,{\frac {\Delta t_{i}+\Delta t_{i-1}}{2}}\,\Delta t_{i}.}
速度の計算 – Størmer-Verlet 法
速度は基本的なシュテルマー方程式では明示的に与えられていませんが、運動エネルギーなどの特定の物理量の計算にはしばしば必要です。これは 分子動力学 シミュレーションで技術的な課題を生み出す可能性があります。なぜなら、時間 における位置がわかるまでは、システムの運動エネルギーと瞬間温度 を計算できないからです。この欠陥は、速度ベルレアルゴリズムを使用するか、位置項と 平均値定理を 使用して速度を推定することで対処できます 。
t
{\displaystyle t}
t
+
Δ
t
{\displaystyle t+\Delta t}
v
(
t
)
=
x
(
t
+
Δ
t
)
−
x
(
t
−
Δ
t
)
2
Δ
t
+
O
(
Δ
t
2
)
.
{\displaystyle \mathbf {v} (t)={\frac {\mathbf {x} (t+\Delta t)-\mathbf {x} (t-\Delta t)}{2\Delta t}}+{\mathcal {O}}\left(\Delta t^{2}\right).}
この速度項は位置項より 1 ステップ遅れていることに注意してください。これは 、 ではなく、時間 における速度に対するものであるため、 は の 2 次近似であること を意味します 。同じ議論ですが、時間ステップを半分にすると、 で の 2 次近似になります 。
t
{\displaystyle t}
t
+
Δ
t
{\displaystyle t+\Delta t}
v
n
=
x
n
+
1
−
x
n
−
1
2
Δ
t
{\displaystyle \mathbf {v} _{n}={\tfrac {\mathbf {x} _{n+1}-\mathbf {x} _{n-1}}{2\Delta t}}}
v
(
t
n
)
{\displaystyle \mathbf {v} (t_{n})}
v
n
+
1
2
=
x
n
+
1
−
x
n
Δ
t
{\displaystyle \mathbf {v} _{n+{\frac {1}{2}}}={\tfrac {\mathbf {x} _{n+1}-\mathbf {x} _{n}}{\Delta t}}}
v
(
t
n
+
1
2
)
{\displaystyle \mathbf {v} \left(t_{n+{\frac {1}{2}}}\right)}
t
n
+
1
2
=
t
n
+
1
2
Δ
t
{\displaystyle t_{n+{\frac {1}{2}}}=t_{n}+{\tfrac {1}{2}}\Delta t}
精度を犠牲にして、
時間における速度を近似するために間隔を短くすることができます。
t
+
Δ
t
{\displaystyle t+\Delta t}
v
(
t
+
Δ
t
)
=
x
(
t
+
Δ
t
)
−
x
(
t
)
Δ
t
+
O
(
Δ
t
)
.
{\displaystyle \mathbf {v} (t+\Delta t)={\frac {\mathbf {x} (t+\Delta t)-\mathbf {x} (t)}{\Delta t}}+{\mathcal {O}}(\Delta t).}
ベロシティ・ヴェルレ
関連し、より一般的に使用されているアルゴリズムは速度ヴェルレアルゴリズム [5]であり、これは リープフロッグ法 に似ています が、速度と位置が時間変数の同じ値で計算される点が異なります(リープフロッグ法では、名前が示すように、同じ値で計算されません)。これは同様のアプローチを使用しますが、速度を明示的に組み込んで、基本的なヴェルレアルゴリズムの最初の時間ステップの問題を解決します。
x
(
t
+
Δ
t
)
=
x
(
t
)
+
v
(
t
)
Δ
t
+
1
2
a
(
t
)
Δ
t
2
,
v
(
t
+
Δ
t
)
=
v
(
t
)
+
a
(
t
)
+
a
(
t
+
Δ
t
)
2
Δ
t
.
{\displaystyle {\begin{aligned}\mathbf {x} (t+\Delta t)&=\mathbf {x} (t)+\mathbf {v} (t)\,\Delta t+{\tfrac {1}{2}}\,\mathbf {a} (t)\Delta t^{2},\\[6pt]\mathbf {v} (t+\Delta t)&=\mathbf {v} (t)+{\frac {\mathbf {a} (t)+\mathbf {a} (t+\Delta t)}{2}}\Delta t.\end{aligned}}}
速度 Verlet の誤差は、基本 Verlet の誤差と同じ程度であることが示されています。速度アルゴリズムは必ずしもメモリを多く消費するわけではありません。基本 Verlet では 2 つの位置ベクトルを追跡しますが、速度 Verlet では 1 つの位置ベクトルと 1 つの速度ベクトルを追跡します。このアルゴリズムの標準的な実装スキームは次のとおりです。
計算します 。
v
(
t
+
1
2
Δ
t
)
=
v
(
t
)
+
1
2
a
(
t
)
Δ
t
{\displaystyle \mathbf {v} \left(t+{\tfrac {1}{2}}\,\Delta t\right)=\mathbf {v} (t)+{\tfrac {1}{2}}\,\mathbf {a} (t)\,\Delta t}
計算します 。
x
(
t
+
Δ
t
)
=
x
(
t
)
+
v
(
t
+
1
2
Δ
t
)
Δ
t
{\displaystyle \mathbf {x} (t+\Delta t)=\mathbf {x} (t)+\mathbf {v} \left(t+{\tfrac {1}{2}}\,\Delta t\right)\,\Delta t}
相互作用ポテンシャルから を使用して 導出します 。
a
(
t
+
Δ
t
)
{\displaystyle \mathbf {a} (t+\Delta t)}
x
(
t
+
Δ
t
)
{\displaystyle \mathbf {x} (t+\Delta t)}
計算します 。
v
(
t
+
Δ
t
)
=
v
(
t
+
1
2
Δ
t
)
+
1
2
a
(
t
+
Δ
t
)
Δ
t
{\displaystyle \mathbf {v} (t+\Delta t)=\mathbf {v} \left(t+{\tfrac {1}{2}}\,\Delta t\right)+{\tfrac {1}{2}}\,\mathbf {a} (t+\Delta t)\Delta t}
このアルゴリズムは可変時間ステップでも機能し、リープフロッグ法の 積分の「キック・ドリフト・キック」形式と同一です 。
半音速を排除すると、このアルゴリズムは次のように短縮される。
計算します 。
x
(
t
+
Δ
t
)
=
x
(
t
)
+
v
(
t
)
Δ
t
+
1
2
a
(
t
)
Δ
t
2
{\displaystyle \mathbf {x} (t+\Delta t)=\mathbf {x} (t)+\mathbf {v} (t)\,\Delta t+{\tfrac {1}{2}}\,\mathbf {a} (t)\,\Delta t^{2}}
相互作用ポテンシャルから を使用して 導出します 。
a
(
t
+
Δ
t
)
{\displaystyle \mathbf {a} (t+\Delta t)}
x
(
t
+
Δ
t
)
{\displaystyle \mathbf {x} (t+\Delta t)}
計算します 。
v
(
t
+
Δ
t
)
=
v
(
t
)
+
1
2
(
a
(
t
)
+
a
(
t
+
Δ
t
)
)
Δ
t
{\displaystyle \mathbf {v} (t+\Delta t)=\mathbf {v} (t)+{\tfrac {1}{2}}\,{\bigl (}\mathbf {a} (t)+\mathbf {a} (t+\Delta t){\bigr )}\Delta t}
ただし、このアルゴリズムでは、加速度は位置にのみ依存し 、速度には依存しないと 想定していることに注意してください 。
a
(
t
+
Δ
t
)
{\displaystyle \mathbf {a} (t+\Delta t)}
x
(
t
+
Δ
t
)
{\displaystyle \mathbf {x} (t+\Delta t)}
v
(
t
+
Δ
t
)
{\displaystyle \mathbf {v} (t+\Delta t)}
速度ヴェルレ法、および同様にリープフロッグ法の長期的な結果は、 半暗黙的オイラー法 よりも 1桁優れていることに留意してください。アルゴリズムは、速度の半分の時間ステップのシフトまではほとんど同じです。これは、上記のループを回転させてステップ 3 から開始し、ステップ 2 と 4 を組み合わせることでステップ 1 の加速項を除去できることに気付くことで証明できます。唯一の違いは、速度ヴェルレ法の中間点の速度が半暗黙的オイラー法の最終速度と見なされることです。
すべてのオイラー法のグローバル誤差は 1 次ですが、この方法のグローバル誤差は 中点法 と同様に 2 次です。さらに、加速度が実際に保存力学系または ハミルトン系 の力から生じる場合、近似のエネルギーは厳密に解かれた系の定数エネルギーの周りを本質的に振動し、グローバル誤差は半明示的オイラー法では 1 次、ヴェルレ・リープフロッグ法では 2 次になります。同じことが、線型運動量や角運動量など、常に保存されるか、シンプレクティック 積分器 でほぼ保存される系の他のすべての保存量にも当てはまります。 [6]
速度ヴェルレ法は、およびを使用したニューマークベータ法の特殊 な ケース です 。
β
=
0
{\displaystyle \beta =0}
γ
=
1
2
{\displaystyle \gamma ={\tfrac {1}{2}}}
アルゴリズム表現 速度 Verlet は 3D アプリケーションで一般的に役立つアルゴリズムである
ため 、C++ で記述されたソリューションは以下のようになります。このタイプの位置統合により、通常のオイラー法と比較して、3D シミュレーションやゲームの精度が大幅に向上します。
構造 体本体
{
ベクトル 3d 位置 { 0.0,0.0,0.0 } ;
Vec3d vel { 2.0 , 0.0 , 0.0 }; // x軸に沿って2m/s
Vec3d acc { 0.0 , 0.0 , 0.0 }; // 最初は加速なし
倍 質量 = 1.0 ; // 1kg
/**
* 「Velocity Verlet」統合を使用して位置と速度を更新します
* @param dt DeltaTime / タイムステップ [例: 0.01]
*/
void 更新 ( double dt )
{
Vec3d new_pos = pos + vel * dt + acc * ( dt * dt * 0.5 );
Vec3d new_acc = apply_forces ();
Vec3d new_vel = vel + ( acc + new_acc ) * ( dt * 0.5 );
位置 = 新しい位置 ;
vel = 新しいvel ;
acc = 新しいacc ;
}
/**
* オブジェクトに速度を適用するには、代わりに必要な力ベクトルを計算します。
* ここで蓄積された力を適用します。
*/
Vec3d apply_forces () 定数
{
Vec3d new_acc = Vec3d { 0.0 , 0.0 , -9.81 }; // Z軸の下方向に9.81 m/s²
// ここで他の力を適用します...
// 注意: Velocity Verlet は加速度が位置に依存すると想定しているため、`vel` に依存しないようにしてください。
new_acc を返します 。
}
};
エラー用語
ベルレ法のグローバルな打ち切り誤差は 、位置と速度の両方で です。これは、位置のローカル誤差が上記のとおりであるという事実とは対照的です 。この違いは、すべての反復にわたってローカルな打ち切り誤差が蓄積されるためです。
O
(
Δ
t
2
)
{\displaystyle {\mathcal {O}}\left(\Delta t^{2}\right)}
O
(
Δ
t
4
)
{\displaystyle {\mathcal {O}}\left(\Delta t^{4}\right)}
グローバル エラーは、次の点に注意して導き出すことができます。
error
(
x
(
t
0
+
Δ
t
)
)
=
O
(
Δ
t
4
)
{\displaystyle \operatorname {error} {\bigl (}x(t_{0}+\Delta t){\bigr )}={\mathcal {O}}\left(\Delta t^{4}\right)}
そして
x
(
t
0
+
2
Δ
t
)
=
2
x
(
t
0
+
Δ
t
)
−
x
(
t
0
)
+
Δ
t
2
x
¨
(
t
0
+
Δ
t
)
+
O
(
Δ
t
4
)
.
{\displaystyle x(t_{0}+2\Delta t)=2x(t_{0}+\Delta t)-x(t_{0})+\Delta t^{2}{\ddot {x}}(t_{0}+\Delta t)+{\mathcal {O}}\left(\Delta t^{4}\right).}
したがって
error
(
x
(
t
0
+
2
Δ
t
)
)
=
2
⋅
error
(
x
(
t
0
+
Δ
t
)
)
+
O
(
Δ
t
4
)
=
3
O
(
Δ
t
4
)
.
{\displaystyle \operatorname {error} {\bigl (}x(t_{0}+2\Delta t){\bigr )}=2\cdot \operatorname {error} {\bigl (}x(t_{0}+\Delta t){\bigr )}+{\mathcal {O}}\left(\Delta t^{4}\right)=3\,{\mathcal {O}}\left(\Delta t^{4}\right).}
同様に:
error
(
x
(
t
0
+
3
Δ
t
)
)
=
6
O
(
Δ
t
4
)
,
error
(
x
(
t
0
+
4
Δ
t
)
)
=
10
O
(
Δ
t
4
)
,
error
(
x
(
t
0
+
5
Δ
t
)
)
=
15
O
(
Δ
t
4
)
,
{\displaystyle {\begin{aligned}\operatorname {error} {\bigl (}x(t_{0}+3\Delta t){\bigl )}&=6\,{\mathcal {O}}\left(\Delta t^{4}\right),\\[6px]\operatorname {error} {\bigl (}x(t_{0}+4\Delta t){\bigl )}&=10\,{\mathcal {O}}\left(\Delta t^{4}\right),\\[6px]\operatorname {error} {\bigl (}x(t_{0}+5\Delta t){\bigl )}&=15\,{\mathcal {O}}\left(\Delta t^{4}\right),\end{aligned}}}
これは次のように一般化できます (帰納法で示すこともできますが、ここでは証明なしで示します)。
error
(
x
(
t
0
+
n
Δ
t
)
)
=
n
(
n
+
1
)
2
O
(
Δ
t
4
)
.
{\displaystyle \operatorname {error} {\bigl (}x(t_{0}+n\Delta t){\bigr )}={\frac {n(n+1)}{2}}\,{\mathcal {O}}\left(\Delta t^{4}\right).}
と の間の位置のグローバル誤差を考慮すると、 は 明らかである [ 引用が必要 ]
x
(
t
)
{\displaystyle x(t)}
x
(
t
+
T
)
{\displaystyle x(t+T)}
T
=
n
Δ
t
{\displaystyle T=n\Delta t}
error
(
x
(
t
0
+
T
)
)
=
(
T
2
2
Δ
t
2
+
T
2
Δ
t
)
O
(
Δ
t
4
)
,
{\displaystyle \operatorname {error} {\bigl (}x(t_{0}+T){\bigr )}=\left({\frac {T^{2}}{2\Delta t^{2}}}+{\frac {T}{2\Delta t}}\right){\mathcal {O}}\left(\Delta t^{4}\right),}
したがって、一定時間間隔における全体的な(累積的な)誤差は次のように表される。
error
(
x
(
t
0
+
T
)
)
=
O
(
Δ
t
2
)
.
{\displaystyle \operatorname {error} {\bigr (}x(t_{0}+T){\bigl )}={\mathcal {O}}\left(\Delta t^{2}\right).}
速度はVerlet積分器の位置から非累積的に決定されるため、速度のグローバル誤差も です 。
O
(
Δ
t
2
)
{\displaystyle {\mathcal {O}}\left(\Delta t^{2}\right)}
分子動力学シミュレーションでは、通常、グローバル エラーはローカル エラーよりもはるかに重要であるため、Verlet 積分器は 2 次積分器として知られています。
制約
制約のある複数の粒子のシステムは、オイラー法よりもベルレ積分で解く方が簡単です。ポイント間の制約は、たとえば、特定の距離にそれらを制約するポテンシャルや引力です。これらは、粒子を接続する バネ としてモデル化できます。無限の剛性のバネを使用すると、モデルはベルレ アルゴリズムで解くことができます。
1次元では、制約距離が である場合、制約のない位置と 時刻における 点の 実際の位置 の関係は 、アルゴリズムによって見つけることができます。
x
~
i
(
t
)
{\displaystyle {\tilde {x}}_{i}^{(t)}}
x
i
(
t
)
{\displaystyle x_{i}^{(t)}}
i
{\displaystyle i}
t
{\displaystyle t}
r
{\displaystyle r}
d
1
=
x
2
(
t
)
−
x
1
(
t
)
,
d
2
=
‖
d
1
‖
,
d
3
=
d
2
−
r
d
2
,
x
1
(
t
+
Δ
t
)
=
x
~
1
(
t
+
Δ
t
)
+
1
2
d
1
d
3
,
x
2
(
t
+
Δ
t
)
=
x
~
2
(
t
+
Δ
t
)
−
1
2
d
1
d
3
.
{\displaystyle {\begin{aligned}d_{1}&=x_{2}^{(t)}-x_{1}^{(t)},\\[6px]d_{2}&=\|d_{1}\|,\\[6px]d_{3}&={\frac {d_{2}-r}{d_{2}}},\\[6px]x_{1}^{(t+\Delta t)}&={\tilde {x}}_{1}^{(t+\Delta t)}+{\tfrac {1}{2}}d_{1}d_{3},\\[6px]x_{2}^{(t+\Delta t)}&={\tilde {x}}_{2}^{(t+\Delta t)}-{\tfrac {1}{2}}d_{1}d_{3}.\end{aligned}}}
ベルレ積分は、速度を使用して問題を解くのではなく、力と位置を直接関連付けるので便利です。
ただし、複数の拘束力が各粒子に作用すると問題が発生します。これを解決する 1 つの方法は、シミュレーション内のすべてのポイントをループすることです。これにより、すべてのポイントで、最後の拘束緩和がすでに使用されて、情報の拡散が高速化されます。シミュレーションでは、シミュレーションに小さな時間ステップを使用するか、時間ステップごとに固定数の拘束解決ステップを使用するか、特定の偏差に一致するまで拘束を解決することでこれを実装できます。
制約を局所的に一次近似する場合、これは ガウス・ザイデル法 と同じです。小さな 行列の場合、 LU 分解の方 が高速であることがわかっています 。大規模なシステムはクラスターに分割できます (たとえば、各 ラグドール = クラスター)。クラスター内では LU 法が使用され、クラスター間では ガウス・ザイデル法 が使用されます。行列コードは再利用できます。位置に対する力の依存性は局所的に一次近似でき、ベルレ積分をより暗黙的にすることができます。
SuperLU [7] のような洗練されたソフトウェアは、疎行列を使用して複雑な問題を解決します。行列(のクラスター)を使用するなどの特定の技術は、 音波を 形成せずに布のシートを介して伝播する力などの特定の問題に対処するために使用される場合があります 。 [8]
ホロノミック制約 を解決する別の方法は、 制約アルゴリズムを 使用することです 。
衝突反応
衝突に対処する方法の 1 つは、ペナルティ ベースのシステムを使用することです。これは基本的に、接触時にポイントに一定の力を適用します。これの問題は、与える力を選択するのが非常に難しいことです。力が強すぎると、オブジェクトは不安定になり、力が弱すぎると、オブジェクトが互いに貫通してしまいます。もう 1 つの方法は、投影衝突反応を使用することです。これは、問題のあるポイントを取得し、それを他のオブジェクトからできるだけ短い距離に移動させようとします。
後者の場合、Verlet 積分は衝突によってもたらされる速度を自動的に処理しますが、 衝突の物理法則 と一致する方法で処理されることは保証されません(つまり、運動量の変化が現実的であるとは保証されません)。速度項を暗黙的に変更する代わりに、衝突するオブジェクトの最終速度を明示的に制御する必要があります (前の時間ステップから記録された位置を変更することによって)。
新しい速度を決定する最も簡単な方法は、完全 弾性 衝突と 非弾性衝突の 2 つです。より制御性の高い、もう少し複雑な戦略としては、 反発係数 の使用があります。
参照
文学
^ Verlet, Loup (1967). 「古典流体に関するコンピュータ「実験」。I. レナード−ジョーンズ分子の熱力学的性質」。Physical Review . 159 (1): 98–103. Bibcode :1967PhRv..159...98V. doi : 10.1103/PhysRev.159.98 .
^ Press, WH; Teukolsky, SA; Vetterling, WT; Flannery, BP (2007). 「セクション 17.4. 2 次保存方程式」。 数値レシピ: 科学計算の芸術 (第 3 版)。 ニューヨーク: Cambridge University Press。 ISBN 978-0-521-88068-8 。
^ウェブページは、 Wayback Machine で 2004-08-03 にアーカイブされており、 Størmer 法の説明が記載されています。
^ Dummer, Jonathan. 「シンプルな時間補正ベルレ積分法」
^ Swope, William C.; HC Andersen; PH Berens; KR Wilson (1982 年 1 月 1 日)。「分子の物理的クラスター形成の平衡定数を計算するためのコンピュータシミュレーション法: 小さな水クラスターへの応用」。The Journal of Chemical Physics。76 ( 1 ): 648 (付録)。Bibcode : 1982JChPh..76..637S。doi :10.1063/1.442716。
^ エルンスト・ヘアラー;ルビッチ、クリスチャン。ワナー、ゲルハルト (2003)。 「Størmer/Verlet 法によって示される幾何学的数値積分」。 アクタ ヌメリカ 。 12 : 399–450。 Bibcode :2003AcNum..12..399H。 CiteSeerX 10.1.1.7.7106 。 土井 :10.1017/S0962492902000144。 S2CID 122016794。
^ SuperLU ユーザーズガイド。
^ Baraff, D.; Witkin, A. (1998). 「布シミュレーションにおける大きなステップ」 (PDF) . コンピュータグラフィックス議事録 . 年次会議シリーズ: 43–54.
外部リンク
Verlet 統合デモと Java アプレットとしてのコード
Thomas Jakobsen 著「Advanced Character Physics」
分子動力学シミュレーションの理論 – ページ下部
Verlet 統合は最新の JavaScript で実装されています – ページの下部