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?
sumber
Jawaban:
Mengikuti saran Kirill , saya menjalankan tes dengan dari daftar nilai yang secara geometris meningkat, dan untuk setiap menghitung kesalahan sebagai mana mewakili perkiraan diperoleh dengan integrasi numerik. Ini adalah hasil dari plot log-log:N N
Jadi ruth3 memang memiliki sama agar sebagai ruth4 untuk kasus uji dan konstanta tersirat hanya besarnya.4 1100
Menarik. Saya harus menyelidiki lebih lanjut, mungkin mencoba tes lain.
Ngomong-ngomong, berikut adalah tambahan skrip Python untuk plot kesalahan:
sumber
Merencanakan kesalahan dari , selama interval penuh, diskalakan oleh kekuatan ukuran langkah yang diberikan oleh urutan yang diharapkan, memberikan plotq¨=−q q(0)=1,q˙(0)=0
Seperti yang diharapkan, grafik untuk meningkatkan jumlah sub-interval semakin mendekati kurva batas yang merupakan koefisien kesalahan utama. Dalam semua kecuali satu plot konvergensi ini terlihat sangat cepat, hampir tidak ada perbedaan. Ini berarti bahwa bahkan untuk ukuran langkah yang relatif besar istilah kesalahan utama mendominasi semua istilah lainnya.
Dalam metode Rut urutan ke-3, koefisien utama komponen tampaknya nol, kurva batas terlihat dekat atau sama dengan sumbu horizontal. Grafik yang terlihat jelas menunjukkan dominasi istilah kesalahan urutan keempat. Penskalaan untuk kesalahan urutan ke-4 memberikan plot yang mirip dengan yang lain.p
Seperti yang dapat kita lihat, dalam semua 3 kasus koefisien kesalahan urutan utama dalam komponen adalah nol pada setelah periode penuh. Dalam menggabungkan kesalahan dari kedua komponen, perilaku komponen mendominasi, memberikan kesan metode urutan ke-4 dalam plot loglog.q t=2π p
Koefisien maksimal dalam komponen dapat ditemukan sekitar . Plot loglog di sana harus mencerminkan urutan kesalahan global yang benar.q 3π/2
Bahwa lenyapnya istilah kesalahan tingkat 3 dalam Ruth3p adalah artefak dari kesederhanaan persamaan linear menunjukkan contoh non-linear , dengan plot yang sesuaiq¨=−sin(q) q(0)=1.3, q˙(0)=0
sumber