ベレの方法

提供: testwiki
ナビゲーションに移動 検索に移動

テンプレート:翻訳直後

ベレの方法(ベレのほうほう、テンプレート:Lang-en-short)は、ニュートンの運動方程式数値積分する手法の一つ[1]ベレのアルゴリズムベレ法ベルレ積分法(テンプレート:Lang)、ベルレの方法などの呼び方もある。分子動力学法における粒子の軌跡(トラジェクトリ)のシミュレーションやコンピュータグラフィックスに頻繁に用いられる。1791年にジャン=バティスト・ジョゼフ・ドランブルが用いたのが最初で、その後も何回も再発見されているが、1960年代にLoup Verletが分子動力学法に用いてから広く使われるようになった。1909年にハレー彗星軌道を計算するためにフィリップ・コーウェルアンドリュー・クロンメリンにより用いられたり、1907年に磁場中の荷電粒子のトラジェクトリを研究するためにCarl Størmerにより用いられたりしている(そのため、Störmerの方法という異称もある)。[2]この手法の特徴として、数値的安定性が高く、時間反転対称性を持つことや位相空間上のシンプレクティック形式を保存するなど物理系において重要な性質を持つうえ、オイラー法と比べてもほとんど計算コストが増えないことが挙げられる。

基本

x¨(t)=A(x(t))の形の2階微分方程式を初期条件x(t0)=x0およびx˙(t0)=v0のもとで、Δt>0をステップサイズとして、tn=t0+nΔtにおける数値的近似解xnx(tn)は、下のようなアルゴリズムで求めることができる。

  • x1=x0+v0Δt+12A(x0)Δt2 と置く。
  • n = 1、2、...について次を繰り返す。
    xn+1=2xnxn1+A(xn)Δt2.

運動方程式

保存系におけるニュートンの運動方程式は

Mx¨(t)=F(x(t))=V(x(t))

もしくは粒子毎に

mkx¨k(t)=Fk(x(t))=xkV(x(t)),

と表わされる。ここで、

テンプレート:Mvarは時刻、
x(t)=(x1(t),,xN(t))テンプレート:Mvar個の物体の位置ベクトル、
テンプレート:Mvarはスカラーポテンシャル関数、
テンプレート:Mvarは負のポテンシャル勾配、すなわち粒子にはたらく力の集合、
テンプレート:Mvar質量行列で、各粒子の質量mkを対角要素にもつ行列である。

この等式は、相互作用する分子群惑星の軌道などさまざまな物理系が、さまざまなポテンシャル関数テンプレート:Mvarを決めたときどのように時間発展するかを記述するために用いることができる。

右辺に質量を移し、粒子系の構造を忘れることにすると、上の式は以下のように単純化することができる。

x¨(t)=A(x(t))

位置に依存する加速度を表す適切なベクトル値関数Aを使用します。通常、も与えられます。ここで、ベクトル値関数テンプレート:Mvarは位置依存加速度をあらわす。通常は、初期位置x(0)=x0および初速度v(0)=x˙(0)=v0も所与である。

ベレ積分(速度なし)

この初期値問題を離散化し、数値的に解くため、タイムステップΔt>0を選び、サンプル点列tn=nΔtを考える。このとき、問題は厳密解x(tn)をよく近似する点群列xnをもとめることに帰着する。

オイラー法が1階微分方程式中の1次微分を前進差分近似するのに対し、ベレ積分は2次微分を中心差分近似すると見ることができる。

Δ2xnΔt2=xn+1xnΔtxnxn1ΔtΔt=xn+12xn+xn1Δt2=an=A(xn)

「Störmerの方法」[3]で用いられる形式の「ベレ積分」は、 この式を用い、速度を使わずに以前の2つの位置から次の座標を与える。

xn+1=2xnxn1+anΔt2,an=A(xn)

離散化誤差

このアルゴリズムは本質的に時間反転対称性を持ち、離散化の際に奇数次の項が消え、Δtについて3次の項がなくなるため、局所誤差の大きさを低減することができる。局所誤差は厳密解x(tn1),x(tn),x(tn+1)を代入し、t=tnにおけるテイラー展開からx(t±Δt)をそれぞれ計算することにより定量できる。

x(t+Δt)=x(t)+v(t)Δt+a(t)Δt22+b(t)Δt36+𝒪(Δt4)x(tΔt)=x(t)v(t)Δt+a(t)Δt22b(t)Δt36+𝒪(Δt4)

ここで、xは位置、v=x˙は速度、a=x¨は加速度、b躍度である。

これら2つの級数を足し合わせると、以下の式を得る。

x(t+Δt)=2x(t)x(tΔt)+a(t)Δt2+𝒪(Δt4).

この式から、テイラー展開の1次および3次の項がうち消しあい、ベレ積分の精度が単なるテイラー展開よりも1次高くなっていることがわかる。

ここで、加速度a(t)=A(x(t))は厳密解を用いて計算されているが、逐次計算時には中心座標を用いてan=A(xn)のように計算されることに注意が必要である。大域誤差を計算する際には、この厳密解と近似解列との差は消えず、大域誤差に寄与する。

シンプルな例

局所誤差と大域誤差との関係について洞察を得るため、厳密解と近似解が陽に書き下せるシンプルな例を考えてみる。このような例として標準的なものとして指数関数があげられる。

テンプレート:Mvarを定数として、線形微分方程式x¨(t)=w2x(t)を考える。この方程式の厳密解はewtおよびewtである。

この微分方程式にStörmerの方法を適用すると、以下の線形漸化式を得る。

xn+12xn+xn1=h2w2xn,

もしくは

xn+12(1+12(wh)2)xn+xn1=0

これは特性多項式の根を求めること、すなわちq22(1+12(wh)2)q+1=0の解を求めることにより解くことができ、以下の根が得られる。

q±=1+12(wh)2±wh1+14(wh)2

上の線形漸化式のbasis solutionsテンプレート:訳語疑問点xn=q+nおよびxn=qnである。これらを厳密解と比較するため、テイラー展開すると以下を得る。

q+=1+12(wh)2+wh(1+18(wh)23128(wh)4+𝒪(h6))=1+(wh)+12(wh)2+18(wh)33128(wh)5+𝒪(h7).

この級数の指数関数ewhとの商は1124(wh)3+𝒪(h5)となるため、以下のように書ける。

q+=(1124(wh)3+𝒪(h5))ewh=e124(wh)3+𝒪(h5)ewh

ここから、最初のbasis solutionの誤差は以下のように算出される。

xn=q+n=e124(wh)2wtn+𝒪(h4)ewtn=ewtn(1124(wh)2wtn+𝒪(h4))=ewtn+𝒪(h2tnewtn)

したがって、局所離散化誤差は4次以上となるが、微分方程式が2階のため、大域誤差は2次で、時間的に指数的に増加する定数項をもつ。

逐次計算の開始

ベルレ法の最初のステップ、n=1t=t1=Δtで、x2を計算するためにはt=t1における位置ベクトルx1が必要となる。初期条件はt0=0に対してのみ所与なので、一見これは問題をはらんでいるようにみえる。しかし、加速度a0=A(x0)は既知であるため、最初のステップは2次までのテイラー展開を用いて計算することができる。

x1=x0+v0Δt+12a0Δt2x(Δt)+𝒪(Δt3).

この最初のステップの誤差は𝒪(Δt3)である。しかし、シミュレーションは長い時間、何ステップにもわたって行われ、時刻tnにおけるトータルの誤差は、xnx(tn)との距離およびxn+1xnΔtx(tn+1)x(tn)Δtとの比の両方でオーダー𝒪(eLtnΔt2)であり、最初のステップにおける誤差は無視できる。さらに言えば、この2次の大域誤差を得るためには初期誤差は最低でも3次である必要がある。

非一様なタイムステップ

Störmer–Verlet法の弱点として、タイムステップΔtが変化すると微分関数の近似解を与えなくなってしまう点である。この弱点は次の式を使うことにより修正できる[4]

xi+1=xi+(xixi1)(Δti/Δti1)+aiΔti2.

より厳密な導出は、tiにおける2次までのテイラー展開にti+1=ti+Δtiti1=tiΔti1を代入し、viを消去して以下を得る。

xi+1xiΔti+xi1xiΔti1=aiΔti+Δti12,

したがって、次の式を得る。

xi+1=xi+(xixi1)ΔtiΔti1+aiΔti+Δti12Δti

速度の計算:Störmer–Verlet法

基本的なStörmer方程式は速度を陽に与えないが、運動エネルギーなど特定の物理量を計算するためには速度が必要となる。このことは分子動力学法において、時刻tにおける運動エネルギーや瞬時温度を時刻t+Δtにおける位置を計算するまで計算できないという技術的な問題をひきおこす。この欠点は速度ベレ法を用いるか、平均値の定理を用いて以下のように位置から速度を推定することで対処することができる。

v(t)=x(t+Δt)x(tΔt)2Δt+𝒪(Δt2).

ここで、この速度項は時刻テンプレート:Mathではなく時刻tの速度であり、位置項の1ステップ後ろである。このことはvn=xn+1xn12Δtv(tn)の2次近似であることを意味する。同じ議論として、タイムステップを半分tn+1/2=tn+12Δtにしたvn+1/2=xn+1xnΔtv(tn+1/2)の2次近似である。

精度を犠牲にすれば、時刻テンプレート:Mathにおける速度を次のように近似することもできる。

v(t+Δt)=x(t+Δt)x(t)Δt+𝒪(Δt)

速度ベルレ法

関連する、より広く用いられているアルゴリズムとして速度ベルレ法があげられる[5]。この手法はリープ・フロッグ法に似ているが、同時刻の位置と速度を計算する点(リープ・フロッグ法では名前の含意するとおり計算しない)で違う。速度ベルレ法とベルレ法は似ているが、陽に速度を扱い、初期ステップにおける速度を明示的に解く点で異なる。

x(t+Δt)=x(t)+v(t)Δt+12a(t)Δt2,
v(t+Δt)=v(t)+a(t)+a(t+Δt)2Δt

速度ベルレ法とベルレ法の誤差は同じオーダーであることは示すことができる。ベルレ法では2時刻における位置を記憶しておく必要があるため、1時刻における位置と速度を記憶する速度ベルレ法の方がメモリ消費量が多いとは限らない。

  1. v(t+12Δt)=v(t)+12a(t)Δtを計算する。
  2. x(t+Δt)=x(t)+v(t+12Δt)Δtを計算する。
  3. x(t+Δt)を用いて相互作用ポテンシャルを計算し、a(t+Δt) を導出する。
  4. v(t+Δt)=v(t+12Δt)+12a(t+Δt)Δtを計算する。

半ステップ速度計算を省く場合、以下のように簡略化される。

  1. x(t+Δt)=x(t)+v(t)Δt+12a(t)Δt2 を計算する。
  2. x(t+Δt)を用いて相互作用ポテンシャルを計算し、a(t+Δt)を導出する。
  3. v(t+Δt)=v(t)+12(a(t)+a(t+Δt))Δt を計算する。

ただし、加速度a(t+Δt)x(t+Δt)のみに依存し、v(t+Δt)に依存しないことを前提としている。

速度ベルレ法は、長期的にはリープ・フロッグ法と同様にテンプレート:仮リンクよりもオーダー1つ分良い近似である。速度の時刻が半ステップずれる以外は殆ど同じである。このことは上述のループのステップ3から初めて、ステップ2と4を組み合わせればステップ1における加速度項は取り除けることに注意すればすぐに証明することができる。唯一の違いは、速度ベルレ法のける中間速度が半陰的オイラー法における最終速度として扱われることである。

オイラー法の大域誤差はオーダーは1であるのに対して、速度ベルレ法の大域誤差のオーダーは中点法と同じく2である。加えて、もし加速度が保存力もしくはテンプレート:仮リンクから定まる場合、エネルギーの近似値は厳密解における一定値のエネルギーのまわりを振動し、大域誤差は半陰的オイラー法ではオーダー1、速度ベルレ法およびリープ・フロッグ法ではオーダー2の範囲に収まる。系の運動量や角運動量などのシンプレクティック数値積分法で保存されるその他の量についても同じことが言える[6]

速度ベルレ法は、テンプレート:仮リンクテンプレート:Mathとした特殊例である。

アルゴリズムの表現

速度ベルレ法は3Dアプリケーション一般に有用なアルゴリズムであり、以下のようなC++実装により一般的に解ける。加速度の向きの変化をデモするため、簡略化された抗力を作用させているが、加速度が一定でない場合にのみ必要となる。

struct Body
{
    Vec3d pos { 0.0, 0.0, 0.0 };
    Vec3d vel { 2.0, 0.0, 0.0 }; // x軸正方向に 2 m/s
    Vec3d acc { 0.0, 0.0, 0.0 }; // 加速度の初期値は0
    double mass = 1.0; // 1kg
    double drag = 0.1; // rho*C*Area - 例示のための簡略化された抗力

    /**
     * Update pos and vel using "Velocity Verlet" integration
     * @param dt DeltaTime / time step [eg: 0.01]
     */
    void update(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);
        pos = new_pos;
        vel = new_vel;
        acc = new_acc;
    }

    Vec3d apply_forces() const
    {
        Vec3d grav_acc = Vec3d{0.0, 0.0, -9.81 }; // Z軸負方向に 9.81m/s^2
        Vec3d drag_force = 0.5 * drag * (vel * abs(vel)); // D = 0.5 * (rho * C * Area * vel^2)
        Vec3d drag_acc = drag_force / mass; // a = F/m
        return grav_acc - drag_acc;
    }
};

誤差項

ベルレ法の局所位置誤差は上述のとおりO(Δt4)、局所速度誤差はO(Δt2)である。

しかし、大域位置誤差はO(Δt2)、大域速度誤差はO(Δt2)である。これは次のように導出できる。

error(x(t0+Δt))=O(Δt4)

および

x(t0+2Δt)=2x(t0+Δt)x(t0)+Δt2x(t0+Δt)+O(Δt4)

より以下が導かれる。

error(x(t0+2Δt))=2error(x(t0+Δt))+O(Δt4)=3O(Δt4)

同様に繰り返せば、以下を得る。

error(x(t0+3Δt))=6O(Δt4)
error(x(t0+4Δt))=10O(Δt4)
error(x(t0+5Δt))=15O(Δt4)

この数列の一般項は以下のように得られる。

error(x(t0+nΔt))=n(n+1)2O(Δt4)

大域位置誤差はT=nΔtとしたときの位置x(t+T)の誤差であるから、次を得る。

error(x(t0+T))=(T22Δt2+T2Δt)O(Δt4)テンプレート:要出典

したがって、時間間隔を一定とした場合の大域(累積)誤差は以下のオーダーとなる。

error(x(t0+T))=O(Δt2)

ベルレ法では速度は位置に依存して非累積的に算出されるため、大域速度誤差のオーダーもO(Δt2)となる。

分子動力学シミュレーションでは通常、局所誤差よりも大域誤差のほうがはるかに重要であるため、ベルレ法はオーダー2の積分アルゴリズムとみなされる。

拘束

拘束条件下にある多粒子系は、ベルレ法を用いるほうがオイラー法よりも単純に解くことができる。質点間の拘束条件はたとえば距離を特定値に拘束したり引力を印加したりする条件が考えられるが、粒子間をばねで繋いだと考えることができる。無限に硬いばねを用いれば、このモデルはベルレ法で解くことができる。

一次元の場合、テンプレート:Mvar番目の質点の時刻テンプレート:Mvarにおける、拘束されない位置をx~i(t)、実際の位置をxi(t)とすると、これらの間の関係は以下のようなアルゴリズムで得ることができる。

d1=x2(t)x1(t),
d2=d1,
d3=d2rd2,
x1(t+Δt)=x~1(t+Δt)+12d1d3,
x2(t+Δt)=x~2(t+Δt)12d1d3.

ベルレ法は位置を直接力に関係づけるため、速度を用いて問題を解くよりも使いやすい。

しかし、各粒子に複数の拘束条件が課される場合、問題が起きる。この問題を解決するには、シミュレーションのタイムステップを小さくしたり、タイムステップごとに決まったステップ数の拘束緩和を行ったり、残差が特定の値を下回るまで拘束を緩和する、などの方法でシミュレーションを実装する。

拘束条件を1次までで局所近似する場合、これはガウス=ザイデル法と同等となる。行列が小さい場合、LU分解の方が速いことが知られている。大きな系もクラスター(例:ラグドール=クラスター)に分解できることがある。クラスター内ではLU分解を用い、クラスター間にはガウス=ザイデル法を用いればよい。行列のコードを再利用し、力の位置への依存性を1次局所近似することにより、ベルレ積分をより暗黙的にすることができる。

SuperLUを始めとした、疎行列を用いて複雑な問題を解くための洗練されたも存在する。また、例えば音波を形成することなく力を布を伝わらせるなどの特殊化された問題を取り扱うための特殊な技法もある[7]

テンプレート:仮リンクを解くには、テンプレート:仮リンクを扱えるアルゴリズムを用いる必要がある。

衝突応答

衝突に応答する一つの方法として、ペナルティに基く方法が挙げられる。この方法では基本的に衝突した点に力を加える。問題は、加える力をどのように決めるかである。力が強すぎると物体は不安定になり、弱すぎると互いに貫通してしまう。衝突に応答する別の方法としては投影法があり、衝突した物体を最小の移動距離で相手の物体の内部から出すように動かすことで衝突に応答する。

ベルレ法では、後者の方法で衝突した場合の速度が自動的に決定する。しかし、このことは衝突の物理が自動的に満たされる(すなわち運動量の変化が現実的なものとなる)ことを意味しない。速度項を暗黙的に変化させる代わりに、衝突した物体の最終速度を陽に(直前のタイムステップにおいて記録された位置を変化させることにより)制御する必要がある。

新しい速度を決める最も単純な方法として、完全弾性衝突もしくは完全非弾性衝突を仮定することが挙げられる。より複雑な制御方法では、反発係数を用いることもある。

関連項目

出典

外部リンク