ในคำตอบของฉันกับคำถามเกี่ยวกับ MSEเกี่ยวกับการจำลองฟิสิกส์ 2D มิลผมได้แนะนำการใช้ที่สูงขึ้นเพื่อบูรณาการ symplectic
จากนั้นฉันคิดว่ามันเป็นความคิดที่ดีที่จะแสดงให้เห็นถึงผลกระทบของขั้นตอนเวลาที่แตกต่างกันเกี่ยวกับความแม่นยำระดับโลกของวิธีการที่มีคำสั่งต่างกันและฉันเขียนและเรียกใช้สคริปต์ Python / Pylab สำหรับการเปรียบเทียบฉันเลือก:
- ( leap2 ) ตัวอย่างที่ 2 สั่งวิกิพีเดีย ที่ผมคุ้นเคย แต่ฉันรู้ว่ามันภายใต้ชื่อเกมเสือข้ามห้วย ,
- ( ruth3 ) รู ธ ที่ 3 เพื่อบูรณาการ symplectic ,
- ( ruth4 ) รู ธ ที่ 4 สั่งบูรณาการ
สิ่งที่แปลกคือไม่ว่าจะเลือกเวลาใดก็ตามวิธีเรียงลำดับที่ 3 ของ Ruth นั้นดูเหมือนจะแม่นยำกว่าในการทดสอบของฉันมากกว่าวิธีลำดับที่ 4 ของ Ruth ถึงแม้จะเรียงตามลำดับความสำคัญก็ตาม
คำถามของฉันคือ: ฉันทำอะไรผิดที่นี่ รายละเอียดด้านล่าง
วิธีการแฉแรงของพวกเขาในระบบที่มีการแยก Hamiltonians คือผู้ที่สามารถเขียนเป็น
ในการตั้งค่าของเราเราสามารถทำให้กองกำลังและโมเมนต์เป็นปกติโดยมวลที่นำไปใช้ ดังนั้นกองกำลังเปลี่ยนเป็นการเร่งความเร็วและโมเมนตัมกลายเป็นความเร็ว
ผู้รวบรวม symplectic มาพร้อมกับการพิเศษ (ให้คงที่) สัมประสิทธิ์ซึ่งผมจะติดป้าย1 , ... , nและข1 , ... , ข n ด้วยค่าสัมประสิทธิ์เหล่านั้นขั้นตอนเดียวสำหรับการพัฒนาระบบจากเวลาt ถึงเวลาt + δ tใช้แบบฟอร์ม
สำหรับ :
- คำนวณเวกเตอร์ของความเร่งทั้งหมด, ให้เวกเตอร์ของทุกตำแหน่ง
- เปลี่ยน vector ของความเร็วทั้งหมดโดย
- เปลี่ยนเวกเตอร์ของทุกตำแหน่งโดยฉัน
ภูมิปัญญาตอนนี้อยู่ในสัมประสิทธิ์ นี่คือ
สำหรับการทดสอบฉันได้เลือกปัญหาค่าเริ่มต้น 1D
ฉันได้บูรณาการ IVP ด้วยวิธีการดังกล่าวข้างต้นมากกว่า กับ stepsize ของกับจำนวนเต็มได้รับการแต่งตั้งที่ไหนสักแห่งระหว่างและ100เมื่อพิจารณาถึงความเร็วของleap2ฉันได้เพิ่มสามเท่าสำหรับวิธีการนั้น จากนั้นผมก็พล็อตเส้นโค้งที่เกิดขึ้นในพื้นที่เฟสและซูมในที่ ที่โค้งควรมาถึงอีกครั้งที่tN(1,0)t=2π
นี่คือพล็อตและซูมสำหรับและ :
สำหรับ , leap2มีขนาดขั้นตอน ที่เกิดขึ้นจะมาถึงใกล้บ้านกว่าruth4 มีขนาดขั้นตอน{N} สำหรับ , ruth4ชัยชนะเหนือleap2 อย่างไรก็ตามruth3 ที่มีขนาดขั้นตอนเดียวกับruth4มาถึงบ้านมากขึ้นกว่าทั้งสองในทุกการตั้งค่าที่ฉันได้ทดสอบมาแล้ว
นี่คือสคริปต์ 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()
ฉันได้ตรวจสอบข้อผิดพลาดธรรมดาแล้ว:
- ไม่มีการพิมพ์วิกิพีเดีย ฉันได้ตรวจสอบการอ้างอิงโดยเฉพาะอย่างยิ่ง ( 1 , 2 , 3 )
- ฉันมีลำดับสัมประสิทธิ์ถูกต้อง หากคุณเปรียบเทียบกับการสั่งซื้อของ Wikipedia โปรดทราบว่าการเรียงลำดับของแอปพลิเคชันผู้ให้บริการจะทำงานจากขวาไปซ้าย เลขที่ฉันเห็นด้วยกับขนมหวาน / Rozmus และถ้าฉันลองสั่งอีกครั้งผลลัพธ์จะแย่ลง
ความสงสัยของฉัน:
- การทดสอบไม่ถูกต้อง: มีอะไรพิเศษเกี่ยวกับการทดสอบของฉันทำให้วิธีการเรียงลำดับที่ 3 ของ Ruth ทำหน้าที่เหมือนวิธีการสั่งซื้อที่สูงกว่าใช่ไหม