奇妙な結果を持つ3次対4次シンプレクティック積分器のテスト


10

では私の答えMSEの質問 2D、ハミルトニアンの物理シミュレーションに関しては、私はより高次の使用を示唆しているシンプレクティック積分器を

次に、さまざまな時間ステップがさまざまな次数のメソッドのグローバル精度に及ぼす影響を示すのは良い考えだと思い、その効果のためにPython / Pylabスクリプトを作成して実行しました。比較のために私が選んだもの:

奇妙なことに、どのタイムステップを選択しても、テストでは、Ruthの3次法の方がRuthの4次法よりも1桁精度が高いようです。

したがって、私の質問は次のとおりです。詳細は以下。

これらの方法は、分離可能なハミルトニアン、つまりとして記述できる システムでその強さを展開します。 ここで、はすべての位置座標を含み、 は共役運動量を含み、 は運動論を表しますエネルギーとポテンシャルエネルギー。

H(q,p)=T(p)+V(q)
qpTV

この設定では、力と運動量を、それらが適用される質量によって正規化できます。したがって、力は加速度に変わり、モーメンタは速度に変わります。

シンプレクティックインテグレーターには、特別な(与えられた定数)係数が付属しており、これにおよびラベルを付けます。これらの係数を使用すると、システムを時間 から時間に進化させるための1つのステップは次の形式になります。a1,,anb1,,bntt+δt

  • 以下のために:i=1,,n

    1. すべての位置のベクトルを指定して、すべての加速度のベクトルを計算しますgq
    2. すべての速度のベクトルをvbigδt
    3. すべての位置のベクトルをqaivδt

知恵は今係数にあります。これらは、

[a1a2b1b2]=[121201](leap2)[a1a2a3b1b2b3]=[2323172434124](ruth3)[a1a2a3a4b1b2b3b4]=1223[12123212321201231](ruth4)

テストでは、1D初期値問題 これは分離可能なハミルトニアンを持っています。ここで、は識別されます。

y+y=0y(0)=1y(0)=0
(y(t),y(t))=(cost,sint)
(q,v)(y,y)

上記のメソッドとIVPを で統合しました。ステップサイズはで、整数はから間で選択されています。撮影leap2考慮の速さを、私は三倍そのメソッドのために。次に、結果の曲線を位相空間にプロットし 、曲線が理想的に再び到達するはずのズームインしました。t[0,2π]δt=2πNN10100N10T=2πN(1,0)t=2π

以下は、とプロットとズームです。N=12N=36

N = 12N = 12、ズーム

N = 36N = 36、ズーム

以下のために、leap2ステップサイズで より近い家に到着する起こるruth4 ステップサイズで。、ruth4オーバー勝利leap2。ただし、ruth4と同じステップサイズのruth3は、これまでにテストしたすべての設定で、他の両方よりもはるかに家に近づいています。N=122 π2π3N2πNN=36

Python / Pylabスクリプトは次のとおりです。

import numpy as np
import matplotlib.pyplot as plt

def symplectic_integrate_step(qvt0, accel, dt, coeffs):
    q,v,t = qvt0
    for ai,bi in coeffs.T:
        v += bi * accel(q,v,t) * dt
        q += ai * v * dt
        t += ai * dt
    return q,v,t

def symplectic_integrate(qvt0, accel, t, coeffs):
    q = np.empty_like(t)
    v = np.empty_like(t)
    qvt = qvt0
    q[0] = qvt[0]
    v[0] = qvt[1]
    for i in xrange(1, len(t)):
        qvt = symplectic_integrate_step(qvt, accel, t[i]-t[i-1], coeffs)
        q[i] = qvt[0]
        v[i] = qvt[1]
    return q,v

c = np.math.pow(2.0, 1.0/3.0)
ruth4 = np.array([[0.5, 0.5*(1.0-c), 0.5*(1.0-c), 0.5],
                  [0.0,         1.0,          -c, 1.0]]) / (2.0 - c)
ruth3 = np.array([[2.0/3.0, -2.0/3.0, 1.0], [7.0/24.0, 0.75, -1.0/24.0]])
leap2 = np.array([[0.5, 0.5], [0.0, 1.0]])

accel = lambda q,v,t: -q
qvt0 = (1.0, 0.0, 0.0)
tmax = 2.0 * np.math.pi
N = 36

fig, ax = plt.subplots(1, figsize=(6, 6))
ax.axis([-1.3, 1.3, -1.3, 1.3])
ax.set_aspect('equal')
ax.set_title(r"Phase plot $(y(t),y'(t))$")
ax.grid(True)
t = np.linspace(0.0, tmax, 3*N+1)
q,v = symplectic_integrate(qvt0, accel, t, leap2)
ax.plot(q, v, label='leap2 (%d steps)' % (3*N), color='black')
t = np.linspace(0.0, tmax, N+1)
q,v = symplectic_integrate(qvt0, accel, t, ruth3)
ax.plot(q, v, label='ruth3 (%d steps)' % N, color='red')
q,v = symplectic_integrate(qvt0, accel, t, ruth4)
ax.plot(q, v, label='ruth4 (%d steps)' % N, color='blue')
ax.legend(loc='center')
fig.show()

私はすでに単純なエラーをチェックしました:

  • ウィキペディアのタイプミスはありません。私は(特に、参照をチェックしている123)。
  • 係数列は正しいです。ウィキペディアの順序と比較すると、オペレーターアプリケーションの順序付けは右から左に機能することに注意してください。私の番号付けはCandy / Rozmusに同意します。それでも別の注文をしようとすると、結果はさらに悪くなります。

私の疑い:

  • ステップサイズの順序が間違っている:たぶん、Ruthの3次スキームは、どういうわけかはるかに小さい暗黙の定数を持っています。ステップサイズを本当に小さくすると、4次メソッドが勝つでしょうか?しかし、私はも試してみましたが、3次法の方が優れています。N=360
  • 間違ったテスト:私のテストで何か特別なことをすると、ルースの3次メソッドは高次メソッドのように動作しますか?

エラーの数値を教えてもらえますか?プロットから見分けるのは少し難しいです。エラーは変化にどのように比例しますか?メソッドの順序から期待どおりにスケーリングしますか?通常、これをチェックするために、対数ログプロットにに対してエラーをプロットします。NNN
Kirill

@キリル:それに取り組んでいます。すぐに編集されます。
ccorn

1
疑わしい点の1つは、線形rhsの選択です。メソッドの切り捨てエラーは通常、rhsの高次導関数に依存するため、rhsのすべての高次導関数が消えると、奇妙な収束動作が観察される場合があります。もっと珍しいrhsを試してみる価値はあるでしょう。
Kirill

回答:


9

以下キリルの提案、私はテストを実行したおおよそ幾何学的に値を増加させるのリストから、およびそれぞれについてとして誤差を計算 ここで、は近似を表します数値積分によって得られます。これが対数-対数プロットの結果です:NN

ϵ(N)=z~(2π)z~(0)2wherez~(t)=(y~(t),y~(t))
z~

ここに画像の説明を入力してください

したがって、ruth3は実際にはそのテストケースのruth4と同じ次数を持ち、暗黙的に定数はだけです。41100

面白い。私はさらに調査する必要があります、おそらく他のテストを試みます。

ちなみに、エラープロット用のPythonスクリプトへの追加は次のとおりです。

def int_error(qvt0, accel, qvt1, Ns, coeffs):
    e = np.empty((len(Ns),))
    for i,N in enumerate(Ns):
        t = np.linspace(qvt0[2], qvt1[2], N+1)
        q,v = symplectic_integrate(qvt0, accel, t, coeffs)
        e[i] = np.math.sqrt((q[-1]-qvt1[0])**2+(v[-1]-qvt1[1])**2)
    return e

qvt1 = (1.0, 0.0, tmax)
Ns = [12,16,20,24,32,40,48,64,80,96,128,160,192,
      256,320,384,512,640,768,1024,1280,1536,2048,2560,3072]

fig, ax = plt.subplots(1)
ax.set_xscale('log')
ax.set_xlabel(r"$N$")
ax.set_yscale('log')
ax.set_ylabel(r"$\|z(2\pi)-z(0)\|$")
ax.set_title(r"Error after 1 period vs #steps")
ax.grid(True)
e = int_error(qvt0, accel, qvt1, Ns, leap2)
ax.plot(Ns, e, label='leap2', color='black')
e = int_error(qvt0, accel, qvt1, Ns, ruth3)
ax.plot(Ns, e, label='ruth3', color='red')
e = int_error(qvt0, accel, qvt1, Ns, ruth4)
ax.plot(Ns, e, label='ruth4', color='blue')
ax.legend(loc='upper right')
fig.show()

質問には関係ありませんが、個別の回答として投稿するのではなく、変更や更新を質問自体に入れてもらえますか?これは、答えが質問に答えるべきであるという慣習を維持しました。
Kirill

1
@キリル:それ答えです。ruth3は確かに、次数が高く、定数が小さくなっています。対数対数誤差プロットを作成するというあなたの提案により発見されました。したがって、質問には回答があり、回答が私によって作成されたものであっても、回答後に質問の要点を変更することは絶対にありません。
ccorn

そうは言っても、さらなる分析を受け入れたいと思います。(自己回答形式の質問は自動的に受け入れられますが、私が推測するように変更することもできます。)
ccorn

2
少し見ただけで、説得力のある説明が見つかりませんでした。このruth3の 4次収束は、初期条件に大きく関係していますを設定して、全期間(または半期間)積分しないしてください。簡単に発生する可能性があることの1つは、トランケーションエラーに「ゼロ平均」コンポーネントがあり、完全な期間に積分するとキャンセルされることです。また、を試して、これが高微分係数と関係があるかどうかを確認しましたが、私のテストでは、初期条件と周期性がこれと関係があるようです。p00V(q)=1/q+logqV
キリル

2
これは超収束の表示です。このような単純なテストの問題は、多くの場合、この問題を引き起こします。線形方程式を使用すると、この動作が発生する可能性があり、それが発生すると、テイラー級数の奇数項がキャンセルされることがよくあります。解析解がない非線形テスト問題は、これが発生する可能性がはるかに低くなります。
Chris Rackauckas

2

、の誤差を全区間にわたってプロットし、期待される次数で与えられるステップサイズの累乗でスケーリングすると、プロットが得られますq¨=qq(0)=1,q˙(0)=0

ここに画像の説明を入力してください

予想通り、増加する部分区間のグラフは、主要な誤差係数である限界曲線にますます近づいています。1つのプロットを除いて、この収束は目に見えて急速であり、ほとんど分岐がありません。これは、ステップサイズが比較的大きい場合でも、先行する誤差項が他のすべての項を支配することを意味します。

3次のルース法では、成分の先行係数がゼロに見え、可視限界曲線が横軸に近いか横軸に等しくなります。表示されるグラフは、4次の誤差項の優位性を明確に示しています。4次エラーのスケーリングでは、他のプロットと同様のプロットが得られます。p

見てわかるように、3つのケースすべてで、成分の主要な次数のエラー係数は、全期間後のでゼロです。したがって、両方のコンポーネントのエラーを組み合わせると、コンポーネントの動作が支配的になり、ログログプロットの4次メソッドの印象が誤って与えられます。qt=2πp

コンポーネントの最大係数は、約ます。そこでのログログプロットは、正しいグローバルエラーの順序を反映しているはずです。q3π/2


Ruth3pの3次の誤差項の消失が線形方程式の単純さのアーチファクトであることは、非線形の例、と対応するプロットq¨=sin(q)q(0)=1.3, q˙(0)=0

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.