Trong câu trả lời của tôi cho một câu hỏi về MSE liên quan đến mô phỏng vật lý 2D Hamilton, tôi đã đề nghị sử dụng một bộ tích hợp đối xứng bậc cao .
Sau đó, tôi nghĩ rằng có thể là một ý tưởng tốt để chứng minh tác động của các bước thời gian khác nhau đối với độ chính xác toàn cầu của các phương thức với các đơn đặt hàng khác nhau, và tôi đã viết và chạy một kịch bản Python / Pylab cho hiệu ứng đó. Để so sánh tôi đã chọn:
- ( leap2 ) Ví dụ thứ 2 của Wikipedia mà tôi quen thuộc, mặc dù tôi biết nó dưới tên leapfrog ,
- ( ruth3 ) Nhà tích hợp đối xứng bậc 3 của Ruth ,
- ( ruth4 ) Nhà tích hợp đối xứng bậc 4 của Ruth .
Điều kỳ lạ là, bất kể dấu thời gian nào tôi chọn, phương pháp bậc 3 của Ruth dường như chính xác hơn trong thử nghiệm của tôi so với phương pháp bậc 4 của Ruth, thậm chí theo một độ lớn.
Do đó, câu hỏi của tôi là: Tôi đang làm gì sai ở đây? Chi tiết bên dưới.
Các phương thức mở ra sức mạnh của chúng trong các hệ thống với người Hamilton có thể tách rời , tức là những phương pháp có thể được viết là
trong đó bao gồm tất cả các tọa độ vị trí,
bao gồm mô men liên hợp,
đại diện cho động học năng lượng và năng lượng tiềm năng
Trong thiết lập của chúng tôi, chúng tôi có thể bình thường hóa lực lượng và mô men theo số lượng mà chúng được áp dụng. Do đó, các lực biến thành gia tốc, và mô men biến thành vận tốc.
Các tích hợp symplectic đi kèm với các hệ số đặc biệt (đã cho, không đổi) mà tôi sẽ gắn nhãn và . Với các hệ số đó, một bước để phát triển hệ thống theo thời gian đến thời điểm có dạng
Với :
- Tính vectơ của tất cả các gia tốc, cho vectơ của tất cả các vị trí
- Thay đổi vectơ của tất cả các vận tốc bằng
- Thay đổi vectơ của tất cả các vị trí theo
Sự khôn ngoan bây giờ nằm ở các hệ số. Đây là
Để thử nghiệm, tôi đã chọn bài toán giá trị ban đầu 1D
có Hamiltonian tách rời. Ở đây, được xác định bằng .
Tôi đã tích hợp IVP với các phương thức trên qua với một bước là với số nguyên được chọn ở đâu đó trong khoảng từ đến . Lấy leap2 tốc độ của vào tài khoản, tôi gấp ba cho phương pháp đó. Sau đó, tôi đã vẽ các đường cong kết quả trong không gian pha và phóng to ở trong đó các đường cong sẽ lý tưởng trở lại tại .N(1,0)t=2π
Dưới đây là các ô và thu phóng cho và :
Với , leap2 với kích thước bước tình cờ đến gần nhà hơn ruth4 với kích thước bước . Với , ruth4 thắng leap2 . Tuy nhiên, ruth3 , với cùng kích thước bước với ruth4 , đến gần nhà hơn nhiều so với cả hai loại khác, trong tất cả các cài đặt tôi đã thử nghiệm cho đến nay.2 π 2π
Đây là kịch bản 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()
Tôi đã kiểm tra các lỗi đơn giản rồi:
- Không có lỗi đánh máy Wikipedia. Tôi đã kiểm tra các tài liệu tham khảo, đặc biệt ( 1 , 2 , 3 ).
- Tôi đã có trình tự hệ số đúng. Nếu bạn so sánh với thứ tự của Wikipedia, lưu ý rằng trình tự ứng dụng toán tử hoạt động từ phải sang trái. Đánh số của tôi đồng ý với Candy / Rozmus . Và nếu tôi thử đặt hàng khác, kết quả sẽ tệ hơn.
Những nghi ngờ của tôi:
- Thứ tự bước sai: Có thể sơ đồ bậc 3 của Ruth có các hàm ngụ ý nhỏ hơn nhiều và nếu kích thước bước được thực hiện rất nhỏ, thì phương thức bậc 4 sẽ thắng? Nhưng tôi thậm chí đã thử , và phương pháp bậc 3 vẫn vượt trội.
- Thử nghiệm sai: Điều gì đó đặc biệt về thử nghiệm của tôi cho phép phương thức bậc 3 của Ruth hoạt động như một phương pháp bậc cao hơn?