University of Fukui, Department of Applied Physics

Koishi's Page

数値積分の実行

ベルレ法

分子動力学シミュレーションでは粒子を運動方程式に従って動かします。実際の粒子の位置や速度 を求めるためには運動方程式から作った差分式を利用します。粒子がN  個あるとき、運動方程式 は
d2ri   F-i
dt2  = mi    (i = 1,2, ...,N )
(1)

となり、速度は
dri
dt--= vi   (i = 1,2, ...,N )
(2)

と書けます。これらの式はN  個ありますが、全て同じ形なので以降は添え字のi  を省略しま す。

時刻t + Δt  での位置r (t + Δt )  をテーラー展開すると
                      dr(t)   Δt2-d2r-(t)
r (t + Δt ) = r(t) + Δt   dt  +  2    dt2  + ⋅⋅⋅
(3)

この式と式 (1)、式 (2) を使うと
                            Δt2 F (t)
r(t + Δt ) = r(t) + Δtv (t) +---------+  O((Δt )3)
                             2   m
(4)

となり、同様にr(t - Δt)  は
                               2
r(t - Δt ) = r(t) - Δtv (t) + Δt-F-(t)+  O((Δt )3)
                             2   m
(5)

となります。式 (4) と式 (5) の和と差を取ると
                                   2F-(t)-         4
r(t + Δt) + r(t - Δt) = 2r (t) + Δt   m   + O ((Δt) )
(6)

                                          4
r(t + Δt ) - r (t - Δt ) = 2Δtv (t) + O ((Δt) )
(7)

となります。この式では     4
(Δt )   以上の項は無視しています。この 2 式から
                                    F (t)
r(t + Δt ) = 2r(t) - r(t - Δt ) + Δt2----
                                     m
(8)

v (t) = --1- {r(t + Δt) - r(t - Δt)}
       2 Δt
(9)

が得られます。この式はベルレの式と呼ばれています。

ベルレ法では得られる位置と速度の時間がずれているので、式 (8) と式 (9) を以下のように変形 します。
                                2
                             Δt--F-(t)
r (t + Δt ) = r(t) + Δtv (t) + 2  m
(10)

                   Δt--
v(t + Δt) = v (t) + 2m  {F (t) + F (t + Δt)}
(11)

この式は速度ベルレの式と呼ばれています。

ベルレ法のプログラミング

上で得られた速度ベルレの式は、速度の計算にF(t)  とF (t + Δt )  が入っているためそのまま計 算することはできません。実際に計算をするときは、式を
                    Δt
v ′(t + Δt) = v(t) + ---F (t)
                    2m
(12)

と
v(t + Δt) = v ′(t + Δt ) + Δt-F (t + Δt)
                         2m
(13)

の二つに分けて、力の計算の前後で計算を行います。

ベルレ法を用いたときのプログラムを作る場合は、無次元化によりm =  1  として、以下のような 流れになります。

     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]

この流れをC言語風に書くと、位置をx、速度をv、力をfとして

v+=f*dt*0.5;  速度の更新[1]
x+=v*dt; 位置の更新
x→f 力の計算
v+=f*dt*0.5;速度の更新[2]

となります。

ベルレ法のサンプルプログラム

サンプルとして落下運動をベルレ法で解いてみます。t = 0  で、x =  0,v = 0,f = 9.8  、t > 0  で 一定の力f = 9.8  が働く場合の物体の運動は
    1
x = -f t2
    2
(14)

v = ft
(15)

と書けます。この結果とベルレ法で求めたx, v  の結果を比較するプログラムは以下のようになり ます。

#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)で変化する場合の粒子運動を、 ベルレ法を使って数値計算し理論値と比較し、 そのグラフを作成せよ。 また、ベルレ法で使用する時間刻み幅を変更したとき、 計算値と理論値の差はどのようになるか調べよ。

基礎知識

  • コマンドでの操作(1)「ディレクトリとファイル」

Qtを用いたC言語のプログラミング

  • Qt Creatorを用いたプログラミング(1)「コンパイルと実行」
  • Qt Creatorを用いたプログラミング(2)「デバッグ」

C言語を使ったプログラミング

  • プログラミング(1)「コンパイルと実行」
  • プログラミング(2)「変数」
  • プログラミング(3)「制御命令」
  • プログラミング(4)「関数」

分子動力学シミュレーションのプログラミング

  • 変数の無次元化
  • 初期位置の設定
  • 初期速度の設定
  • 力の計算
  • 数値積分の実行
  • シミュレーションプログラム作成
  • 動径分布関数の計算
  • 圧力の計算
  • シミュレーションの可視化

Copyright (C) T. Koishi