Saya membuat simulator astronomi sederhana yang harus menggunakan fisika Newton untuk mensimulasikan pergerakan planet dalam suatu sistem (atau benda apa pun, dalam hal ini). Semua benda adalah lingkaran dalam bidang Euclidean, yang memiliki sifat seperti posisi, kecepatan, massa, jari-jari dan gaya yang dihasilkan.
Saya ingin memperbarui alam semesta dalam langkah-langkah waktu yang kecil, biasanya beberapa milidetik, tetapi saya tidak yakin bagaimana cara menghitung perubahan posisi dengan benar.
Gaya adalah sederhana: fr = sum(G * body.m * bodyi.m / dist(body, bodyi)^2)
.
Tetapi bagaimana saya melanjutkan dari sana?
Saya bisa melakukan ini:
a = Fr/body.m
v += a*dt
position += v*dt
Tapi tentu saja itu salah. Mungkin jika saya menambahkan 0,5 sebagai faktor dalam perhitungan posisi?
time-integration
jcora
sumber
sumber
Jawaban:
Anda pada dasarnya mendapatkan jawabannya - tidak perlu faktor 0,5.
Pada dasarnya Anda memiliki sistem dua dimensi ODE orde pertama: mana semuanya adalah fungsi waktu kecuali mungkinm, dan titik menunjukkan turunan waktu. Jika Anda melakukan diferensiasi orde pertama sederhana, maju-Euler-esque ini, Anda menemukan x n + 1 -xn
Namun, forward-Euler secara inheren tidak stabil. Untungnya, ada metode simplektik tepat di sudut. (Itu artikel terkait lebih dari rintisan, tapi mungkin mengandung beberapa link yang berguna.) Kuncinya adalah untuk posisi muka dari ke t n + 1 menggunakan kecepatan di t n + 1 / 2 . Artinya, misalkan Anda diberi x 0 dan v 1 / 2 untuk setiap partikel. Kemudian Anda bisa menggunakan x n + 1tn tn + 1 tn + 1 / 2 x0 v1 / 2
sumber
0.5
faktornya? Tampaknya melakukan hal yang sama seperti mengambil kecepatann-1/2dt
detik yang lalu, itulah yang Anda sarankan.