ทดสอบผู้รวบรวม symplectic ลำดับที่ 3 กับลำดับที่ 4 ด้วยผลลัพธ์ที่แปลกประหลาด


10

ในคำตอบของฉันกับคำถามเกี่ยวกับ MSEเกี่ยวกับการจำลองฟิสิกส์ 2D มิลผมได้แนะนำการใช้ที่สูงขึ้นเพื่อบูรณาการ symplectic

จากนั้นฉันคิดว่ามันเป็นความคิดที่ดีที่จะแสดงให้เห็นถึงผลกระทบของขั้นตอนเวลาที่แตกต่างกันเกี่ยวกับความแม่นยำระดับโลกของวิธีการที่มีคำสั่งต่างกันและฉันเขียนและเรียกใช้สคริปต์ Python / Pylab สำหรับการเปรียบเทียบฉันเลือก:

สิ่งที่แปลกคือไม่ว่าจะเลือกเวลาใดก็ตามวิธีเรียงลำดับที่ 3 ของ Ruth นั้นดูเหมือนจะแม่นยำกว่าในการทดสอบของฉันมากกว่าวิธีลำดับที่ 4 ของ Ruth ถึงแม้จะเรียงตามลำดับความสำคัญก็ตาม

คำถามของฉันคือ: ฉันทำอะไรผิดที่นี่ รายละเอียดด้านล่าง

วิธีการแฉแรงของพวกเขาในระบบที่มีการแยก Hamiltonians คือผู้ที่สามารถเขียนเป็น

H(q,p)=T(p)+V(q)
ที่qประกอบด้วยพิกัดตำแหน่งทั้งหมด pประกอบด้วยสักครู่คอนจูเกต, Tหมายถึงการเคลื่อนไหว พลังงานและพลังงานศักย์V

ในการตั้งค่าของเราเราสามารถทำให้กองกำลังและโมเมนต์เป็นปกติโดยมวลที่นำไปใช้ ดังนั้นกองกำลังเปลี่ยนเป็นการเร่งความเร็วและโมเมนตัมกลายเป็นความเร็ว

ผู้รวบรวม symplectic มาพร้อมกับการพิเศษ (ให้คงที่) สัมประสิทธิ์ซึ่งผมจะติดป้าย1 , ... , nและ1 , ... , n ด้วยค่าสัมประสิทธิ์เหล่านั้นขั้นตอนเดียวสำหรับการพัฒนาระบบจากเวลาt ถึงเวลาt + δ tใช้แบบฟอร์มa1,,anb1,,bntt+δt

  • สำหรับi=1,,n :

    1. คำนวณเวกเตอร์gของความเร่งทั้งหมด, ให้เวกเตอร์qของทุกตำแหน่ง
    2. เปลี่ยน vector vของความเร็วทั้งหมดโดยbigδt
    3. เปลี่ยนเวกเตอร์qของทุกตำแหน่งโดยฉันaivδ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 ด้วยวิธีการดังกล่าวข้างต้นมากกว่า กับ stepsize ของกับจำนวนเต็มได้รับการแต่งตั้งที่ไหนสักแห่งระหว่างและ100เมื่อพิจารณาถึงความเร็วของleap2ฉันได้เพิ่มสามเท่าสำหรับวิธีการนั้น จากนั้นผมก็พล็อตเส้นโค้งที่เกิดขึ้นในพื้นที่เฟสและซูมในที่ ที่โค้งควรมาถึงอีกครั้งที่tt[0,2π]δt=2πNN10100N(1,0)t=2πN(1,0)t=2π

นี่คือพล็อตและซูมสำหรับและ :N=12N=36

N = 12N = 12 ซูม

N = 36N = 36 ซูม

สำหรับ , leap2มีขนาดขั้นตอน ที่เกิดขึ้นจะมาถึงใกล้บ้านกว่าruth4 มีขนาดขั้นตอน{N} สำหรับN=122π3N2πNN=36 , 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 และถ้าฉันลองสั่งอีกครั้งผลลัพธ์จะแย่ลง

ความสงสัยของฉัน:

  • N=360
  • การทดสอบไม่ถูกต้อง: มีอะไรพิเศษเกี่ยวกับการทดสอบของฉันทำให้วิธีการเรียงลำดับที่ 3 ของ Ruth ทำหน้าที่เหมือนวิธีการสั่งซื้อที่สูงกว่าใช่ไหม

NN

@ Kirill: ทำงานในเรื่องนั้น จะแก้ไขในไม่ช้า
ccorn

1
สิ่งหนึ่งที่ฉันสงสัยเกี่ยวกับการเลือกเชิงเส้น rhs: การตัดทอนข้อผิดพลาดของวิธีการมักขึ้นอยู่กับอนุพันธ์ระดับสูงของ rhs ดังนั้นถ้าอนุพันธ์สูงของ rhs หายไปคุณอาจสังเกตพฤติกรรมการบรรจบแปลก ๆ มันอาจจะคุ้มค่าที่จะลองใช้จังหวะแปลก ๆ
คิริลล์

คำตอบ:


9

NN

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

ป้อนคำอธิบายรูปภาพที่นี่

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()

ไม่เกี่ยวข้องกับคำถาม แต่คุณสามารถเปลี่ยนแปลงและอัปเดตในคำถามแทนการโพสต์เป็นคำตอบแยกต่างหากได้หรือไม่? ทุ่งนี้รักษาการประชุมที่ตอบควรตอบคำถาม
คิริลล์

1
@ Kirill: มันเป็นคำตอบ รู ธ 3มีลำดับที่สูงขึ้นและค่าคงที่ที่นี่ลดลง ค้นพบเนื่องจากข้อเสนอแนะของคุณในการทำพล็อตข้อผิดพลาดบันทึกการทำงาน ดังนั้นจึงมีคำตอบให้กับคำถามและฉันจะไม่เปลี่ยนประเด็นคำถามเมื่อได้รับคำตอบแล้วแม้ว่าฉันจะแต่งคำตอบก็ตาม
ccorn

ที่กล่าวว่าฉันยินดีที่จะรับการวิเคราะห์เพิ่มเติม (Self-คำถามตอบได้รับการยอมรับโดยอัตโนมัติ แต่หนึ่งสามารถเปลี่ยนที่ฉันคิดว่า.)
ccorn

2
p00V(q)=1/q+logqV
คิริลล์

2
นี่คือการแสดงผลของ superconvergence ปัญหาการทดสอบอย่างง่ายเช่นนี้จบลงด้วยการมีปัญหานี้ในหลายกรณี การใช้สมการเชิงเส้นสามารถให้พฤติกรรมนี้และหลายครั้งที่เงื่อนไขแปลก ๆ ของซีรีส์เทย์เลอร์สามารถยกเลิกเมื่อเกิดเหตุการณ์ขึ้น ปัญหาการทดสอบแบบไม่เชิงเส้นที่ไม่มีโซลูชันการวิเคราะห์มีโอกาสเกิดขึ้นได้น้อยกว่ามาก
Chris Rackauckas

2

q¨=qq(0)=1,q˙(0)=0

ป้อนคำอธิบายรูปภาพที่นี่

ตามที่คาดไว้กราฟสำหรับการเพิ่มจำนวนของช่วงเวลาย่อยเข้าใกล้เส้นโค้งขีด จำกัด มากขึ้นซึ่งเป็นค่าสัมประสิทธิ์ข้อผิดพลาดนำ แต่พล็อตเรื่องเดียวการบรรจบกันนี้อย่างรวดเร็วอย่างเห็นได้ชัดแทบไม่มีความแตกต่างเลย ซึ่งหมายความว่าแม้จะมีขนาดขั้นตอนที่ค่อนข้างใหญ่คำว่าข้อผิดพลาดนำจะเป็นเงื่อนไขอื่น ๆ ทั้งหมด

p

qt=2πp

q3π/2


q¨=sin(q)q(0)=1.3, q˙(0)=0

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.