में मेरा उत्तर एक को एमएसई पर सवाल एक 2D Hamiltonian भौतिकी सिमुलेशन के बारे में, मैं एक उच्च क्रम का उपयोग कर सुझाव दिया है symplectic समकलक ।
फिर मैंने सोचा कि विभिन्न आदेशों के साथ वैश्विक सटीकता पर अलग-अलग समय के चरणों के प्रभावों को प्रदर्शित करना एक अच्छा विचार हो सकता है, और मैंने उस प्रभाव के लिए पायथन / पायलैब स्क्रिप्ट लिखी और चलाई। तुलना के लिए मैंने चुना:
- ( Leap2 ) विकिपीडिया के 2-क्रम उदाहरण जिसके साथ मैं, परिचित हूँ हालांकि मैं नाम के तहत यह पता मेंढक कूद ,
- ( रूथ 3 ) रूथ के 3-क्रम सहानुभूति समन्वयक ,
- ( ruth4 ) रूथ का 4-क्रम सहानुभूति समन्वक है ।
विचित्र बात यह है कि, मैं जो भी टाइमस्टेप चुनता हूं, रूथ की 3-ऑर्डर विधि मेरे परीक्षण में रूथ के 4-ऑर्डर विधि की तुलना में अधिक सटीक प्रतीत होती है, यहां तक कि परिमाण के एक क्रम से भी।
मेरा सवाल इसलिए है: मैं यहां क्या गलत कर रहा हूं? नीचे दिए गए विवरण।
विधियां अलग-अलग हैमिल्टन के साथ सिस्टम में अपनी ताकत को प्रकट करती हैं , अर्थात जिन्हें
हमारे सेटअप में, हम उन लोगों द्वारा बलों और गति को सामान्य कर सकते हैं जिन्हें वे लागू होते हैं। इस प्रकार बल त्वरण में बदल जाते हैं, और क्षण वेग में बदल जाते हैं।
सहानुभूति इंटीग्रेटर्स विशेष (दिए गए, निरंतर) गुणांक के साथ आते हैं जिन्हें मैं और लेबल । उन गुणांक के साथ, समय-प्रणाली के विकास का एक कदम -समय पर रूप ले लेता है
के लिए :
- सभी पदों के वेक्टर को देखते हुए सभी त्वरणों की वेक्टर की गणना करें
- द्वारा सभी वेगों के वेक्टर को बदलें
- द्वारा सभी पदों के वेक्टर को बदलें
ज्ञान अब गुणांक में निहित है। ये
परीक्षण के लिए, मैंने 1D प्रारंभिक मान समस्या
जिसमें एक अलग हैमिल्टन है। यहाँ, की पहचान ।
मैंने IVP को उपरोक्त विधियों के साथ में के चरणों के साथ एक पूर्णांक साथ कहीं और बीच चुना है । ले रहा है leap2 खाते में की गति, मैं तीन गुना कि विधि के लिए। फिर मैंने चरण स्थान में परिणामी वक्रों को प्लॉट किया और पर ज़ूम इन किया, जहाँ कर्व्स को आदर्श रूप से पर फिर से आना चाहिए ।एन(1,0)टी=2π
यहाँ और लिए प्लॉट और ज़ूम हैं :
के लिए , leap2 कदम आकार के साथ से घर के करीब आने के लिए होता है ruth4 कदम आकार के साथ । के लिए , ruth4 से अधिक जीत leap2 । हालांकि, ruth3 , के रूप में एक ही कदम आकार के साथ ruth4 , आता है बहुत करीब दोनों दूसरों की तुलना में घर के लिए, सभी सेटिंग्स में मैं अब तक का परीक्षण किया है।2 π 2π
यहाँ पायथन / पायलैब स्क्रिप्ट है:
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()
मैंने पहले ही सरल त्रुटियों के लिए जाँच कर ली है:
- कोई विकिपीडिया टाइपो नहीं। मैंने संदर्भों की जाँच की है, विशेष रूप से ( 1 , 2 , 3 )।
- मुझे गुणांक अनुक्रम सही मिला है। यदि आप विकिपीडिया के आदेश के साथ तुलना करते हैं, तो ध्यान दें कि ऑपरेटर आवेदन की अनुक्रमण दाएं से बाएं ओर काम करता है। मेरी संख्या कैंडी / रोज़्ज़स से सहमत है । और अगर मैं एक और आदेश देने की कोशिश करता हूं, तो परिणाम खराब होते हैं।
मेरा शक:
- गलत कदम आदेश: हो सकता है कि रूथ की 3-ऑर्डर स्कीम में किसी तरह से बहुत छोटे निहित स्थिरांक हों, और यदि चरण का आकार वास्तव में छोटा हो, तो 4-क्रम विधि जीत जाएगी? लेकिन मैंने को भी आजमाया है , और तीसरा क्रम अभी भी बेहतर है।
- गलत परीक्षण: मेरे परीक्षण के बारे में कुछ विशेष रूथ के 3-क्रम विधि को उच्च-क्रम विधि की तरह व्यवहार करने देता है?