4 Numerical Integration

[Up] [Repository]

4.1 Integration of ODE

何か物理系が、変数の組x=(x1,x2,)で記述されているとしよう。この変数が時間に依存しており、その時間微分x˙が、xの関数として書かれている時、この系を 力学系(Dynamical System) と呼ぶ。特に、外力がなく、系を記述する変数だけで方程式が閉じている時、この系を 自励的(autonomous) と言う。以下、自励的な系のみを扱う。

我々は、時刻t=0における系の状態x(0)を指定した時、任意の時刻tの系の状態x(t)を知りたい。このような問題設定を初期値問題と呼び、数値計算における基本課題となっている。以下、簡単のために一次元系で考えよう。方程式は以下のように表現されている。

dxdt=f(x)

これを形式的に積分すると、任意の時刻tにおけるxの値は以下のように求めることができる。

x(t)=x(0)+0tf(x)dt

さて、右辺の積分は一般には厳密に求積することはできない。そこでなんらかの近似を行うことにしよう。最も簡単な近似は、短い時間hの間であればf(t)はあまり変化しないと思って、定数として扱ってしまうことであろう。

x(t+h)=x(t)+tt+hf(x)dtx(t)+f(x)h

こうして、x(t)からx(t+h)が求まるので、t=0からh刻みで次々と状態を更新していけば、任意の時刻のx(t)を求めることができる。このような方法を数値積分と呼び、特に今回の積分方法はオイラー法と呼ばれる。

このオイラー法の精度を調べてみよう。x(t+h)tのまわりでテイラー展開してみよう。

x(t+h)=x(t)+x˙(t)h+O(h2)

ここで、x˙=f(x)であったから、

x(t+h)=x(t)+f(x)h+O(h2)

オイラー法は、hに関して一次まで正しい。これを一次精度であると呼ぶ。さて、オイラー法は非常に精度が悪く、数値解が指数関数的に厳密解から離れていくことが知られている。

さて、オイラー法は、本来は時刻tからt+hまで時々刻々と変化する微分係数f(x)を、時刻tでの値で代表させたのだが、さすがにこれは乱暴に過ぎた。そこで、時間刻みhではなく、その中点h/2での時間微分を使うことにしよう。

まず、系を一次のオイラー法でh/2だけ時刻を進める。すると、その場所xm

xm=x(t)+f(x)h2

となる。この地点での微分係数f(xm)を使って、あらためて現在地点x(t)からx(t+h)の位置を推定すると、

x(t+h)=x(t)+f(xm)h

となる。これは中点法と呼ばれ、二次精度となる。念の為に確認しておこう。x(t+h)を二次までテイラー展開しよう。

x¨=dfdt=dfdxdxdt=f(x)f(x)

であることに注意すると、

x(t+h)=x(t)+x˙(t)h+x¨h22+O(h3)=x(t)+f(x)h+f(x)f(x)h22+O(h3)

となる。また、中点法は、

x(t+h)=x(t)+f(xm)h=x(t)+f(x(t)+f(x)h2)h=x(t)+f(x)h+f(x)f(x)h22+O(h3) となり、x(t+h)のテイラー展開とhの二次まで一致する。ここでは中点を一つだけとったが、これを4点とるのが古典的なRunge-Kutta法であり、比較的実装が容易で4次精度と精度が高いために広く使われている。

その他、これまでの軌跡を覚えておいて、そこから線形補完して場所を予測し、予測点を使って改めて将来の点を修正する、予測子-修正子法も広く使われている。

4.2 Integration of Equations of Motion

4.2.1 Euler method

さて、分子動力学法の運動方程式を考えよう。簡単のために一次元系を考える。ハミルトニアンH(p,q)に支配されている系の運動方程式は以下のように書けるのだった。

p˙=Hqq˙=Hp

この系は(p,q)の変数の組で記述されており、ハミルトニアンHp,qの関数であるから、変数の時間微分が自身の関数として表現されている。つまり、ハミルトンの運動方程式も力学系である。力学系であるから、通常の常微分方程式の数値積分法を使うことができる。

いま、系として調和振動子を考えよう。ハミルトニアンはH=p2/2+q2/2であり、運動方程式は以下のように書ける。

p˙=qq˙=p

さて、運動方程式における初期値問題とは、ある時刻t=0における初期値(p(0),q(0))から、任意の時刻tにおける値(p(t),q(t))を求めることである。まず、オイラー法を適用してみよう。時刻tの時の微分係数を使ってt+hの座標を予測するのであるから、

p(t+h)=pqhq(t+h)=q+ph

と求めることができる。なお、煩雑なのでp(t)q(t)pqと記述した。さて、時間非依存なハミルトンの運動方程式は、

H˙=Hpp˙+Hqq˙=0

であるから、ハミルトニアンが保存量となる。調和振動子系なら、p2/2+q2/2が保存されなければならない。計算してみよう。

p(t+h)2+q(t+h)2=(pqh)2+(q+ph)2=(1+h2)(p2+q2)

つまり、時刻tにおいてエネルギーがp2+q2であった系は、1ステップ後に(1+h2)倍に、nステップ進むと(1+h2)n倍になる。「オイラー法が厳密解から指数関数的にずれる」という意味がわかるであろう。

4.2.2 Velocity Verlet method

さて、調和振動子の運動方程式をオイラー法で数値積分するとエネルギーがあっという間に発散することがわかった。そこで、Runge-Kuttaや予測子-修正子法のような高次の数値積分法を使っても良いのだが、より簡便で、かつ非常に安定な数値積分法が発見された。velocity Verlet (VV)法である。以下の運動方程式を考えよう。

p˙=fq˙=p

簡単のために一次元系で、質量を1としている。f(q)は力であり、ポテンシャルV(q)によるものならf(q)=V(q)である。この運動方程式に対して、VV法は、以下のように構成される。

まず、位置については、二次までテイラー展開する。

q(t+h)=q(t)+q˙(t)h+q¨(t)h22=q+ph+fh22

ここで、運動方程式では位置の時間微分は速度、速度(運動量)の時間微分は力であるから、それぞれ既知なのがミソである。

速度も二次まで展開したいが、速度の微分は力であり、力の微分まで計算するのは面倒だ。そこで、差分を工夫する。先程、すでに時刻t+hにおける位置q(t+h)がわかっているので、その場所における力f(t+h)を使うことができる。すると、

p(t+h)=p+f(t+h)+f(t)2h

と表すことができる。これが二次まで正しいテイラー展開になっていることは容易に確認できるであろう。

さて、このようにして構築されたVV法は、位置に関しても運動量に関しても二次まで正しい展開になっているため、二次精度の数値積分法になっていることが予想される。事実、VV法は二次精度なのだが、この時間発展を行うと エネルギーが厳密に保存する

実際に調和振動子系で確認してみよう。VV法を適用すると

q(t+h)=q+phqh22=hp+(1h22)qp(t+h)=pq(t+h)+q(t)2h=(1h22)p+(h+h34)q

エネルギーの保存を確認すると、

p(t+h)2+(1h24)q(t+h)2=p2+(1h24)q2

となっている。つまり、H=(p2+q2)/2の代わりに、

H~=p22+(1h24)q22

が厳密に保存される。h0で、H~Hになることに注意しよう。VV法はステップが進んでも、もとのエネルギーからややずれた量が厳密に保存される。実はVV法は、シンプレクティック積分と呼ばれる手法の一種になっている。シンプレクティック積分は、軌道は厳密解からずれるものの、ずれたエネルギーが厳密に保存するため、長時間計算してもエネルギーが一方的にずれたりせず、安定した計算を可能となる。この、シンプレクティック積分が厳密に保存する「少しずれたハミルトニアン」を、「影のハミルトニアン」と呼んだりする。「影のハミルトニアン」の厳密な形が知られているのは線形の時のみである。これについては後述する。

VV法でエネルギーが保存する理由をもう少し詳しく見てみよう。シミュレーションによる時間発展とは、次の時刻t+hにおけるp(t+h),q(t+h)を、時刻tの座標p(t),q(t)で表現することである。簡単のため、以下ではP=p(t+h),Q=q(t+h)と表記することにすると、時間発展は(p,q)から(P,Q)への座標変換とみなすことができる。一般のこの変換は非線形だが、調和振動子の場合にはこの変形が線形となり、行列で表現することができる。

調和振動子にオイラー法を適用した場合を見てみよう。

P=pqhQ=q+ph

これが変数変換であることが見やすいように行列表示してみよう。

(PQ)=U(h)(pq)

ただし、U(h)は以下のような行列である。

U(h)=(1hh1)

U(h)は、(p,q)に作用して時間をhだけ進める行列(演算子)であるから、時間発展行列(演算子)になっている。さて、これは式だけ見れば一次変換であるから、その変換の性質は行列U(h)で決まる。特に重要なのが行列式|U(h)|である。一次変換において変換行列の行列式は、変換の前後で面積要素の変化率を表すのであった。オイラー法の場合、

|U(h)|=1+h2>1

であるから、この変換が、面積要素を拡大することがわかる。

同様に、VV法の時間発展行列を行列表現すると、

U(h)=(1h2/2hh+h3/41h2/2)

となり、明らかに|U(h)|=1となる。つまり、この行列による変換は、画像を歪めても、面積要素は保存する。実は、この時間発展行列の行列式が1であるということが、エネルギー、すなわちハミルトニアンが厳密に保存することと対応している。調和振動子におけるエネルギー(の2倍)p2+q2は、円の面積に対応する。オイラー法に対応する変換では、面積要素が毎ステップ拡大してしまうため、エネルギーが増えていってしまうが、VV法に対応する変換では、空間は歪むものの面積要素は保存されるため、エネルギーも保存する、という仕組みになっている。

4.3 Symplectic Integrator

4.3.1 Matrix Form

VV法が調和振動子の場合にエネルギーを保存するのは、時間発展を記述する行列の行列式が1であることに対応していた。実は、VV法は「Symplectic Integrator」と呼ばれる手法の一種になっており、Symplectic Integratorは指数分解公式から作られる。

ここでは、まずは調和振動子において指数分解公式から時間発展演算子を構築する様子を見てみよう。

運動方程式は行列の形で

ddt(pq)=(0110)L(pq)=L(pq)

と書ける。ここでLは時間微分を表す行列だ。これを形式的に積分すると、

(PQ)=ehLU(h)(pq)

つまり、時間微分行列を指数の肩の上に乗せると時間発展行列が得られる。

U(h)=exp(hL)

線形代数の講義でやったように、Lを対角化するなどすれば厳密に計算できて、

U(h)=(coshsinhsinhcosh)

となる。つまり、調和振動子の時間発展は回転で表すことができる。しかし、一般に時間発展行列(演算子)は厳密に求めることができないので、なんらかの近似をすることになる。

まず、オイラー法は以下のように近似している。

UE(h)=(1hh1)

厳密解と見比べてみて、1次まで正しい近似になっていることがわかるであろう。

さて、VV法はこうなっていた。

U(h)=(1h2/2hh+h3/41h2/2)

VV法による近似は、テイラー展開の二次まで正しい。ただし、三次の項をうまく付け加えることで、この行列の行列式を1にしているのがポイントである。

さて、今回はある行列Lを指数の肩に乗せたexp(hL)の表式が厳密に求められたが、そのためにはLを対角化する必要があり、もし対角化できたら問題は解けたと同義である。そこで、exp(ihL)を近似することを考えよう。

いま、行列Lが、iL = A + B$と二つの行列の和で書けるとしよう。

一般にABは非可換であるので、

eA+BeAeB

である。しかし、以下の等式が成り立つことが知られている。

eA+B=limn(eA/neB/n)n

これをLie-Trotter公式と言う。この式はnを無限に飛ばすと厳密だが、それを有限で止めることで、以下のように近似できる。

exp(hL)=exp(hA)exp(hB)+O(h2)exp(hL)=exp(h/2B)exp(hA)exp(h/2B)+O(h3)

これを指数分解公式と呼ぶ。最初の分解が一次、次が二次の公式である。

さて、ここで

A2=0,B2=0

という性質があったとしよう。すると、これらを指数の肩に乗せても二次以降が消えてしまうので、

exp(hA)=I+hAexp(hB)=I+hB

と、厳密に値を求めることができる。ただし、Iは単位行列である。このような分解を利用して数値積分を構成するのがシンプレクティック積分である。

調和振動子の時間微分行列(リュービル演算子)は

L=(0110)

であった。これを

L=(0110)=(0100)A+(0010)B=A+B

と分解しよう。明らかにA2=B2=0であるから、

exp(hA)=I+hAexp(hB)=I+hB

が成り立つ。さて、まずは一次の指数分解公式

eh(A+B)ehAehB

を考えてみよう。これを時刻tの座標(p,q)にかけると時刻t+hの座標(P,Q)が得られる。つまり、

(PQ)=ehAehB(pq)

である。まずはeh(B)を考えよう。

exp(hB)=I+hB=(10h1) であるから、

ehB(pq)=(10h1)(pq)=(pq+ph)

つまり、現在の速度pで位置が等速直線運動をさせたのと同じである。

次に、eh(A)をかけよう。

ehA(pq+ph)=(1h01)(pq+ph)=((1h2)phqq+ph)

行列の形からわかるように、これは運動量しか更新しない。以上の時間発展をまとめると、

(PQ)=(1h2hh1)U~1(h)(pq)

となり、近似された時間発展行列U~1(h)

U~1(h)=(1h2hh1)

となる。|U~1(h)|=1となっているのがわかるであろう。

このように

として時間積分を構築すると、オイラー法を適用したつもりが、一次のシンプレクティック積分になる(個人的に「なんちゃってオイラー法」と呼んでいる)。 正しいオイラー法は

と、更新前のqを覚えておかなければならない。

さて、指数分解公式がシンプレクティック積分を作る様子を見てみよう。もともと、時間発展行列は、時間微分行列Lを指数の肩に乗せたものであり、シンプレクティック性とはその行列式が1となること、つまり

|ehL|=1

を満たすことであった。さて、指数分解公式は時間微分行列 LA2=B2=0を満たすようにL=A+Bと分解し、それを使ってexp(hA)exp(hB)を組み合わせて時間発展行列を作る。ここで、A2=0であるから、

exp(hA)=I+hA

さて、行列A

A=(0100)

という形であったから、

1+hA=(1h01)

明らかに

|exp(hA)|=|I+hA|=1

と、行列式1になることがわかるであろう。

念の為、一般的にA2=0なら|exp(hA)|=1であることを証明しておこう。

まず、Xn=0と、べき乗してゼロになる行列を冪零行列と言う。冪零行列の固有値は全て0である。なぜなら固有値λと固有ベクトルvにはXv=λxの関係があるが、Xnv=λnxであり、Xn=0であるからλn=0、したがってλ=0である。さて、ある行列Xの行列式|X|は、固有値の積である。つまり、Xの固有値をλiとすると、

|X|=λ1λ2λN

また、行列指数関数eXの固有値は、固有値を指数の肩に乗せたものだ。したがって

|eX|=eλ1eλ2eλN

A2=0であるからAは冪零行列であり、冪零行列の固有値は全てゼロであるから、

|exp(hA)|=|exp(A)|h=1h=1

以上でA2=0なら|exp(hA)|=1が証明された。Bも同様である。

行列の積の行列式は、行列式の積になるから、eAeBの積で作られる行列はかならず行列式が1となる。つまり、変換の面積要素が保存される。これが指数分解公式がシンプレクティック積分を作る理由となる。

以上を行列の言葉でまとめておこう。

4.3.2 Liouville Operator

調和振動子の場合は、時間微分演算子、時間発展演算子が行列で書けた。しかし、一般に時刻tの座標(p,q)から時刻t+hの座標(P,Q)への写像は非線形となり、それぞれの演算子が行列では書けない。この場合の指数分解公式と、シンプレクティック性について見てみよう。

一般の時間微分演算子を考える。

(p˙q˙)=iL(pq)

ここに現れる演算子iLを、Liouville Operatorと呼ぶ。ハミルトンの運動方程式におけるリュービル演算子は以下のように書ける。

iL=HpqiLK+(Hqp)iLV

これを見て

iL=iLK+iLV

という分解を自然に思いつくであろう。さて、いまハミルトニアンが以下の様に、運動量のみに依存する項Kと座標のみに依存する項Vの和で書けていたとする。

H(p,q)=K(p)+V(q)

ただし、K(p)=p2/2mである。これを自然ハミルトニアンと呼ぶ。この場合、先程分解した二つの演算子が以下のようになる。

iLK=Hpq=KpqiLV=Hqp=Vpp

ここで、qの係数がpのみに依存し、pの係数がqのみに依存することに注意。さて、この演算子をpqに演算してみよう。

まずiLKpにかけると、qで消えるのでゼロである。qにかけると、

iLKq=Kpqq=Kp

Kpのみの関数であるから、さらにqで偏微分するとゼロになる。従って

(iLK)2q=0

全く同様に、

(iLV)2p=0

ここから、この演算子を指数関数の肩に乗せたものをpqに演算した結果を厳密に計算することができる。

eihLKp=0eihLKq=q+hKpveihLVq=0eihLVq=phVqf

ここで、pK=p/m=vは速度、qV=V(q)=fは力であるから、それぞれ「時間hの間等速直線運動をした時の座標の変化」「時間hの間、力fを受け続けた運動量の変化」を表している。あとは全く同様に指数分解公式を用いることで、数値積分法を構築できる。

一次のシンプレクティック積分法であれば、

eihLeihLVeihLK

と分解できるので、

(PQ)=eihLVeihLK(pq)

を計算すれば良い。これは、

というアルゴリズムになっている。

次に、二次の分解公式を考えよう。これは

eihLeihLV/2eihLKeihLV/2

と分解する方法だ。対応する数値積分アルゴリズムは

  1. 最初に現在の力がhだけ持続した時の力積により運動量を変化させ
  2. 次に更新された運動量で時間hだけ等速直線運動をさせ、
  3. 最後に更新された座標における力がh/2だけ持続した場合の力積変化を計算する

というアルゴリズムになっている。指数分解公式を使うというと難しく感じるが、要するに座標と運動量を更新する際、どちらかが止まっている(定数である)と思って、片方を更新するのを繰り返しているだけである。

4.3.3. Symplecity of Velocity Verlet Algorithm

では、最後にVV法が二次のシンプレクティック積分になっていることを示そう。自然ハミルトニアン

H=p2+V(q)

を考える。簡単のため、質量を1としている。

二次のシンプレクティック積分のアルゴリズムは

  1. 最初に現在の力がhだけ持続した時の力積により運動量を変化させ
  2. 次に更新された運動量で時間hだけ等速直線運動をさせ、
  3. 最後に更新された座標における力がh/2だけ持続した場合の力積変化を計算する

となっていた。時刻tにおいて、座標が(p,q)であったとしよう。このアルゴリズムにより更新された時刻t+hにおける座標を(P,Q)とする。

まず、現在かかっている力がh/2だけ持続したとして運動量を変化させる

p(t+h/2)=p+f(t)h2

次に、更新された運動量で時間hだけ等速直線運動をさせる。

Q=q+p(t+h/2)h

最後に、更新された座標Qにおける力がh/2だけ持続した場合の運動量変化を考える。

P=p(t+h/2)+f(t+h)h2

以上で、(p,q)から(P,Q)への写像、すなわち時間積分が完成した。p(t+h/2)を消去すると、

Q=q+ph+fh22P=p+f(t)+f(t+h)2h

これは、VV法に他ならない。

先程、二次の指数分解公式として

eihLeihLV/2eihLKeihLV/2

を考えた。この分解を逆にして、

eihLeihLK/2eihLVeihLK/2

とすると、数値積分法として

  1. まずh/2だけ等速直線運動をさせる
  2. 現在の力がhだけ持続したとして運動量を変化させる
  3. 最後に更新された運動量でh/2だけ等速直線運動をさせる

というステップを繰り返すアルゴリズムが構築できる。このステップを繰り返すと、同じ速度で座標をh/2の時間だけ二回更新するのが無駄である。そこで、

  1. hだけ等速直線運動をさせる
  2. 現在の力がhだけ持続したとして運動量を変化させる

というステップを繰り返しつつ、もし座標の情報が欲しい場合は時刻をh/2だけずらす、という方法が考えられた。これは座標と運動量が時間h/2だけずれて交互に更新されるように見えることからLeap-frog法と呼ばれる。

やっている計算は一次のシンプレクティック積分と変わらないのだが、観測のタイミングが異なると二次になるのが面白い点である。

4.3.4 Shadow Hamiltonian

シンプレクティック積分は、元のハミルトニアンから少しだけずれた「影のハミルトニアン」を厳密に保存する。一般に影のハミルトニアンが存在するか、存在するとして時間刻みに対する収束半径はどれくらいかは知られていないが、系が線形の場合は影のハミルトニアンを厳密に求めることができる。

以下、一次元調和振動子系において影のハミルトニアンを求めてみよう。

運動方程式は以下の通り。

p˙=qq˙=p

リュービル演算子に対応する時間微分行列は

L=(0110)

となる。これを

L=LA+AB=(0100)+(0010)

と分離しよう。時間発展行列U

U(h)=eh(LA+LB)

であるが、これを

AehLA=(1h01)BehLB=(10h1)

で近似することを考えよう。

もともと、p2+q2が保存量であったことから、影のハミルトニアンが、二次形式

H~=(pq)X(pq)

という形を仮定しよう(煩雑になるので1/2のファクターは除いてある)。厳密な保存量はX=Iである。

さて、時間発展演算子として、一次の近似、

U~1(h)=BA

を考えよう。これにより(p,q)(P,Q)になったとすると、

(PQ)=U~1(h)(pq)

影のハミルトニアンが保存することを要請すると、

(PQ)X(PQ)=(pq)X(pq)

ここから、

U~1tXU~1=X

であるから、

AtBtXBA=X

となる。ここで、BAt=ABt=Iであることから、両辺に左からABをかけると、

XBA=ABX

このXは一意には決まらないが、例えばX=Aと取れば良いことがわかる。ここから、

H~1=(pq)X(pq)=p2hpq+q2

これが一次の指数分解公式で作られたシンプレクティック積分の「影のハミルトニアン」である。もとのハミルトニアンからhの一次でずれていることがわかる。

二次の場合も同様に計算できる。計算の便利のために、以下の行列を定義する。

Ah=(0h/200)Bh=(00h/20)

ちょっとややこしいが、Ahの添え字はHalfを表す。ここで、

Ah2=ABh2=B

であることに注意。

VV法の時間発展演算子は

U~2(h)=AhBAh

であるから、

AhtBtAhtXAhBAh=X

を満たす行列Xを見つければ良い。

ここで、

BhAht=IAhBht=IAh2=ABh2=B

であることを使って、両辺に左からBhAh2Bhをかけると、

XAhBhBhAh=BhAhAhBhX

両辺が等しくなるようなXは、例えば

X=BhAh

とすれば良い。この時、影のハミルトニアンは

H~2=(pq)BhAh(pq)=p2+(1h24)q2

と求まる。

影のハミルトニアンの形

H~1=p2hpq+q2H~2=p2+(1h24)q2

の形を見ると、h2より大きくなると、形が楕円型から双曲型に変化し、数値計算が破綻することが予想される。

実際、調和振動子の場合には収束半径まで含めて影のハミルトニアンが厳密に計算できることが知られている(Kobayasih 2007)。

ここでは、影のハミルトニアンがp,qの二次形式であることを仮定して発見法的に求めたが、一般の場合において影のハミルトニアンが厳密に求められた例や、時間刻みに対する収束半径が求められた例を筆者は知らない。

[1] H. Kobayashi, Phys. Lett. A, Vol. 371, Issues 5–6, 26 November 2007, Pages 360-362, [doi:10.1016/j.physleta.2007.06.037](https://doi.org/10.1016/j.physleta.2007.06.037}