Saya mulai belajar bagaimana fisika DIY, dan saya punya pertanyaan tentang menerapkan integrasi pada tingkat paling dasar (yaitu ini bukan pertanyaan Euler vs RK4).
Hampir setiap contoh yang saya temui memiliki beberapa integrate()
fungsi yang mendapat catatan waktu sejak pembaruan terakhir, dan memperbarui percepatan (dan / atau kecepatan dan / atau posisi) sejak pembaruan terakhir.
Dalam bentuk yang paling sederhana: position += velocity * deltaTime
Namun, saya tidak mengerti mengapa itu terakumulasi seperti ini ketika bisa dengan mudah didapat dengan mengubah suatu fungsi . Misalnya: getPosition = makeNewFunction()
yang dapat mengembalikan sesuatu yang memiliki tanda tangan Time -> Position
, dan cara kerja fungsi tersebut dihasilkan melalui rumus matematika yang sesuai.
Dengan begitu, tidak ada akumulasi ... kapan pun posisi perlu didapatkan, ia memanggil fungsi itu dengan waktu saat ini.
Pemahaman pemula saya adalah bahwa ini juga akan menghindari kesalahan yang berasal dari akumulasi ... jadi mengapa ini tidak berhasil, apa yang saya lewatkan?
(Fwiw saya memang mengumpulkan bukti dasar konsep ide ini - meskipun itu juga menguji beberapa hal lain pada saat yang sama sehingga itu bukan contoh terbersih: https://github.com/dakom/ball-bounce-frp )
EDIT 1: seperti yang disebutkan dalam komentar, mungkin penting untuk menunjukkan bahwa saya belum belajar tentang mengubah akselerasi, atau berurusan dengan brengsek dan hal-hal lain yang memerlukan integrasi tingkat tinggi daripada akselerasi konstan.
EDIT 2: di sini adalah beberapa contoh kode dasar ide, dan pseudo javascript sintaks - catatan yang getKinematicPosition
adalah sebagian diterapkan sehingga mengembalikan fungsi baru saja Waktu -> Posisi:
Saya berpegang teguh pada posisi di sini tetapi itu bisa menjadi sesuatu yang lain, seperti getVelocity
, saya kira ...
getKinematicPosition = initialVelocity => acceleration => time =>
((.5 *acceleration) * (time * time)) + (initialVelocity * time);
getPosition = getKinematicPosition ([0,0,0]) (GRAVITY);
onTick = totalTime => {
position = getPosition (totalTime);
onCollision = () => {
getPosition = changeTheFunction(totalTime);
//changeTheFunction uses totalTime to base updates from 0
//it could use getKinematicPosition or something else entirely
}
}