Sto iniziando a imparare come fare la fisica fai-da-te e ho una domanda sull'implementazione dell'integrazione al livello più elementare (cioè questa non è una domanda di Eulero contro RK4).
Quasi ogni esempio che ho incontrato ha una integrate()
funzione che ottiene il timestep dall'ultimo aggiornamento e aggiorna l'accelerazione (e / o velocità e / o posizione) dall'ultimo aggiornamento.
Nella forma più semplice: position += velocity * deltaTime
Tuttavia, non capisco perché si accumuli in questo modo quando potrebbe essere facilmente ottenuto cambiando una funzione . Ad esempio: getPosition = makeNewFunction()
che potrebbe restituire qualcosa che ha la firma Time -> Position
e il funzionamento interno di quella funzione viene generato tramite l'appropriata formula matematica.
In questo modo, non c'è accumulo ... ogni volta che la posizione deve essere ottenuta, chiama quella funzione con l'ora corrente.
La mia comprensione da principiante è che questo eviterebbe anche gli errori derivanti dall'accumulo ... quindi perché non funziona, cosa mi sto perdendo?
(FWIW ho fatto messo insieme una prova di base del concetto di questa idea-anche se è anche testare un paio di altre cose allo stesso tempo, quindi non è l'esempio più pulito: https://github.com/dakom/ball-bounce-frp )
EDIT 1: come menzionato nei commenti, è probabilmente importante sottolineare che non ho ancora imparato a modificare l'accelerazione o a gestire jerk e altre cose che richiedono un'integrazione di ordine superiore rispetto all'accelerazione costante.
MODIFICA 2: ecco alcuni esempi di codice di base dell'idea e sintassi pseudo javascript - nota che getKinematicPosition
è parzialmente applicata, quindi restituisce una nuova funzione di Just Time -> Posizione:
Sto mantenendo la posizione qui, ma potrebbe essere qualcos'altro, tipo getVelocity
, immagino ...
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
}
}