Dalam jawaban saya untuk pertanyaan tentang MSE tentang simulasi fisika Hamiltonian 2D, saya telah menyarankan menggunakan integrator symplectic tingkat tinggi .
Kemudian saya pikir itu mungkin ide yang baik untuk menunjukkan efek dari langkah waktu yang berbeda pada keakuratan global metode dengan pesanan yang berbeda, dan saya menulis dan menjalankan skrip Python / Pylab untuk efek itu. Sebagai perbandingan, saya memilih:
- ( leap2 ) Contoh ke-2 Wikipedia yang saya kenal, meskipun saya tahu itu dengan nama leapfrog ,
- ( ruth3 ) integrator symplectic orde ketiga Ruth ,
- ( ruth4 ) Integrator symplectic orde 4 dari Ruth .
Yang aneh adalah, apa pun catatan waktu yang saya pilih, metode urutan ketiga Ruth tampaknya lebih akurat dalam pengujian saya daripada metode urutan keempat Ruth, bahkan dengan urutan besarnya.
Pertanyaan saya adalah: Apa yang saya lakukan salah di sini? Detail di bawah.
Metode membuka kekuatan mereka dalam sistem dengan Hamiltonians yang dapat dipisahkan , yaitu yang dapat ditulis sebagai
mana terdiri dari semua koordinat posisi,
terdiri dari momentum konjugat, mewakili kinetika konjugat,
mewakili kinetik energi dan energi potensial
Dalam pengaturan kami, kami dapat menormalkan kekuatan dan momentum oleh massa yang digunakan. Dengan demikian kekuatan berubah menjadi akselerasi, dan momen berubah menjadi kecepatan.
Integrator symplectic datang dengan koefisien khusus (diberikan, konstan) yang akan saya label dan . Dengan koefisien tersebut, satu langkah untuk mengembangkan sistem dari waktu ke waktu berbentuk
Untuk :
- Hitung vektor dari semua akselerasi, diberi vektor dari semua posisi
- Ubah vektor dari semua kecepatan dengan
- Ubah vektor dari semua posisi dengan
Kebijaksanaan sekarang terletak pada koefisien. Ini adalah
Untuk pengujian, saya telah memilih masalah nilai awal 1D
yang memiliki Hamiltonian yang dapat dipisahkan. Di sini, diidentifikasi dengan .
Saya telah mengintegrasikan IVP dengan metode di atas lebih dari dengan stepsize dari dengan integer dipilih di suatu tempat antara dan . Memperhatikan kecepatan leap2 , saya membuat tiga kali lipat untuk metode itu. Saya kemudian memplot kurva yang dihasilkan dalam ruang fase dan diperbesar di mana kurva idealnya harus kembali lagi pada .
Berikut adalah plot dan zoom untuk dan :
Untuk , leap2 dengan ukuran langkah kebetulan lebih dekat ke rumah daripada ruth4 dengan ukuran langkah . Untuk , ruth4 menang atas leap2 . Namun, ruth3 , dengan ukuran langkah yang sama dengan ruth4 , tiba jauh lebih dekat ke rumah daripada yang lain, dalam semua pengaturan yang telah saya uji sejauh ini.
Berikut ini skrip 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()
Saya sudah memeriksa kesalahan sederhana:
- Tidak ada kesalahan ketik Wikipedia. Saya telah memeriksa referensi, khususnya ( 1 , 2 , 3 ).
- Saya sudah mendapatkan urutan koefisien yang benar. Jika Anda membandingkan dengan pemesanan Wikipedia, perhatikan bahwa urutan aplikasi operator berfungsi dari kanan ke kiri. Penomoran saya setuju dengan Candy / Rozmus . Dan jika saya mencoba pemesanan lain, hasilnya menjadi lebih buruk.
Kecurigaan saya:
- Urutan stepsize yang salah: Mungkin skema urutan ke-3 Ruth memiliki konstanta tersirat yang jauh lebih kecil, dan jika ukuran langkah dibuat sangat kecil, maka metode urutan ke-4 akan menang? Tetapi saya bahkan sudah mencoba , dan metode urutan ke-3 masih lebih unggul.
- Tes salah: Sesuatu yang istimewa tentang pengujian saya membuat metode tingkat ketiga Ruth berperilaku seperti metode tingkat tinggi?