数値積分の実行
ベルレ法
分子動力学シミュレーションでは粒子を運動方程式に従って動かします。実際の粒子の位置や速度
を求めるためには運動方程式から作った差分式を利用します。粒子が個あるとき、運動方程式
は
![]() | (1) |
となり、速度は
![]() | (2) |
と書けます。これらの式は個ありますが、全て同じ形なので以降は添え字の
を省略しま
す。
時刻での位置
をテーラー展開すると
![]() | (3) |
![]() | (4) |
となり、同様には
![]() | (5) |
![]() | (6) |
![]() | (7) |
となります。この式では以上の項は無視しています。この 2 式から
![]() | (8) |
![]() | (9) |
が得られます。この式はベルレの式と呼ばれています。
ベルレ法では得られる位置と速度の時間がずれているので、式 (8) と式 (9) を以下のように変形 します。
![]() | (10) |
![]() | (11) |
この式は速度ベルレの式と呼ばれています。
ベルレ法のプログラミング
上で得られた速度ベルレの式は、速度の計算にと
が入っているためそのまま計
算することはできません。実際に計算をするときは、式を
![]() | (12) |
と
![]() | (13) |
の二つに分けて、力の計算の前後で計算を行います。
ベルレ法を用いたときのプログラムを作る場合は、無次元化によりとして、以下のような
流れになります。
![v′(t + Δt ) = v(t) + Δ2tF (t) 速 度 の 更V [1]
r(t + Δt ) = r(t) + Δtv ′(t + Δt) 位 置 の 更V
↓
r (t + Δt )か ら F (t + Δt )を 計Z 力 の 計Z
↓
v(t + Δt ) = v′(t + Δt ) + Δ2tF (t + Δt ) 速 度 の 更V[2]](md_program523x.png)
この流れをC言語風に書くと、位置をx、速度をv、力をfとして
v | += | f*dt*0.5; | 速度の更新[1] | |
x | += | v*dt; | 位置の更新 | |
x | → | f | 力の計算 | |
v | += | f*dt*0.5; | 速度の更新[2] |
となります。
ベルレ法のサンプルプログラム
サンプルとして落下運動をベルレ法で解いてみます。で、
、
で
一定の力
が働く場合の物体の運動は
![]() | (14) |
![]() | (15) |
と書けます。この結果とベルレ法で求めたの結果を比較するプログラムは以下のようになり
ます。
#include <stdio.h> #include <math.h> main() { int i = 0; double x,v,f; double t,dt; dt = 0.1; x = 0.0; v = 0.0; f = 9.8; for(i = 1; i < 30; i++){ t = i*dt; v += f*dt*0.5; x += v*dt; f = 9.8; v += f*dt*0.5; printf("%f %8.4f %8.4f %8.4f %8.4f %8.4f\n",t,x,t*t*4.9,v,t*9.8,f); } }
このプログラムの実行結果は以下のようになり、ベルレ法で計算した値と理論値 が一致していることがわかります。
virlet0.c virlet1.c時間 ベルレx 理論値x ベルレv 理論値v 力 0.100000 0.0490 0.0490 0.9800 0.9800 9.8000 0.200000 0.1960 0.1960 1.9600 1.9600 9.8000 0.300000 0.4410 0.4410 2.9400 2.9400 9.8000 0.400000 0.7840 0.7840 3.9200 3.9200 9.8000 中略 2.600000 33.1240 33.1240 25.4800 25.4800 9.8000 2.700000 35.7210 35.7210 26.4600 26.4600 9.8000 2.800000 38.4160 38.4160 27.4400 27.4400 9.8000 2.900000 41.2090 41.2090 28.4200 28.4200 9.8000
演習
粒子の初期位置を-1.0、初期速度を0.0、初期状態での力を1.0とし、 粒子に働く力がcos(t)で変化する場合の粒子運動を、 ベルレ法を使って数値計算し理論値と比較し、 そのグラフを作成せよ。 また、ベルレ法で使用する時間刻み幅を変更したとき、 計算値と理論値の差はどのようになるか調べよ。