RK4, Derivati, Comprensione della fisica dei giochi


8

Gafferon Games ha un ottimo articolo sull'integrazione RK4 per simulazioni di fisica delle costruzioni che può essere trovato qui: Nozioni di base sull'integrazione

Personalmente le mie conoscenze di matematica e fisica potrebbero usare il miglioramento. Mi sento a mio agio nel regno della matematica vettoriale, dei trigoni, di alcune statistiche (ho dovuto usare formule di regressione di linea lineare per software, ecc.), E fondamentalmente la maggior parte delle cose da scuola superiore al college del primo anno.

Ora alla domanda, ho letto questo articolo, ho scaricato l'origine associata e ho eseguito il debug riga per riga per cercare di capire cosa sta succedendo e sento ancora che non riesco a ottenere quello che sto guardando. Ho cercato su Internet cercando di trovare le versioni "For Dummies", francamente imparo un po 'diversamente e osservando le formule tutto il giorno con l'accento sulla memorizzazione non lo taglierò perché devo capire cosa sta succedendo, quindi può essere flessibile applicandolo.

Quindi, ecco quello che penso di aver capito finora, ma spero che qualcun altro possa chiarirmi o correggermi completamente. L'RK4 utilizza un passo di Eulero, quindi basa questo per spostarsi in avanti nel tempo per calcolare molti più passi essenzialmente di Eulero (?) E determina usando una somma ponderata quale sia la migliore posizione e velocità per il fotogramma successivo?

Inoltre quel metodo di accelerazione (convertito in AS3):

private function acceleration(state:State, time:Number):Number
{
    const k:int = 10;
    const b:int = 1;
    return - k*state.x - b*state.v;
}

prende una massa costante (10) e una forza (1)? e restituisce alcuni strani calcoli Non ho idea del perché ...- posizione * di massa - forza *? che cosa?

Quindi per il mio ultimo po 'di confusione, nei metodi di valutazione che sembrano (AS3):

private function evaluateD(initial:State, time:Number, dtime:Number, d:Derivative):Derivative
{
    var state:State = new State();
    state.x = initial.x + d.dx*dtime;
    state.v = initial.v + d.dv*dtime;
    var output:Derivative = new Derivative();
    output.dx = state.v;
    output.dv = acceleration(state, time+dtime);
    return output;
}

Memorizziamo un nuovo stato con il passaggio temporale, quindi impostiamo una derivata per tornare ... Capisco come viene usato nel processo di approssimazione, ma cos'è questo !:

output.dx = state.v;
output.dv = acceleration(state, time+dtime); 

// ok I get we are getting the new velocity since v = a * t, obviously I   
// don't what acceleration() is returning though. 

Impostiamo la variazione dell'uscita derivata in posizione sulla nuova velocità degli stati? Eh?

Infine, questa simulazione di test viene eseguita nel modo seguente:

var state:State = new State();
state.x = 100;
state.v = 0;

t = 0;
dt = 0.1;

while (Math.abs(state.x)>0.001 || Math.abs(state.v)>0.001)
{
    trace(state.x, state.v);
    integrate(state, t, dt);
    t += dt;
}

Quindi stiamo impostando un nuovo stato con un valore posizionale di 100 e una velocità di 0? Qual è il punto di questa simulazione se non abbiamo velocità ...

Comunque, inutile dire che sono piuttosto confuso e mi sono allontanato dal pianeta Terra. Sperare che qualcuno là fuori possa chiarire questo per me.


Se i giochi sono ciò che cerchi, RK4 è eccessivo e, a causa del suo rapporto costo / stabilità, non è la scelta migliore nemmeno per quei cambiamenti improvvisi e bruschi nella tua accelerazione. Se stai cercando una discussione su quale tipo di integratori valga la pena scegliere, oltre a come costruire un simulatore piuttosto semplicistico, posso raccomandare un rapporto tecnico su esattamente questi problemi: arxiv.org/pdf/1311.5018v1.pdf
teodron,

1
Interessante, prenderò un caffè e lo rileggerò! Personalmente, sono interessato a comprendere il più possibile dalla simulazione di base a quella avanzata. Ne ho fatte alcune molto semplici attualmente, ma questa è puramente una ricerca di conoscenza in modo da poter migliorare la mia flessibilità come sviluppatore. Grazie per il riferimento, lo apprezzo molto!
Bennett Yeates,

Risposte:


6

RK4 è un esempio di integratore numerico . L'integrazione di Euler è un concetto simile, ma è molto meno preciso. L'integrazione numerica non è esatta, ma molto meglio per un computer da gestire in una situazione in tempo reale come un gioco. Il motivo per cui si utilizza RK4 anziché Euler è che RK4 tiene conto dell'integrazione del secondo e del terzo derivato (accelerazione e jerk) e quindi si adatta molto meglio alla soluzione analitica.

RK4 è essenzialmente un'espansione in serie di Taylor dell'equazione differenziale che definisce l'accelerazione rispetto allo spostamento e alla velocità. Ciò consente di integrare forze che dipendono da queste quantità, come ad esempio nei vincoli e persino nella gravitazione universale. Le espansioni della serie Taylor sono utili nella programmazione poiché i computer possono valutarle in modo molto efficiente.

La accelerationfunzione utilizzata è un esempio è un semplice sistema a molla smorzata, non gravitazionale. kè la costante elastica di Hooke e bviene utilizzata per inumidire il sistema (rimuovere l'energia). Per praticamente tutti i vincoli relativi alla molla nel tuo motore, vorrai smorzarli poiché gli errori numerici possono causare un enorme accumulo di energia, facendo esplodere la simulazione. Se stavi usando l'integrazione di Eulero, questo sarebbe molto peggio.

Per quanto riguarda acceleration(), un motore fisico più completo calcolerà le accelerazioni lineari e angolari in base alle forze (coppie). Le forze da sommare potrebbero includere gravità (costante o basata sulla gravitazione universale), galleggiamento e molle (la maggior parte dei vincoli può essere modellata utilizzando molle rigide).

Alla tua terza domanda è facile rispondere. In cinematica, ci sono tre quantità di base: spostamento (posizione), velocità e accelerazione. L'accelerazione è la derivata della velocità, che è la derivata dello spostamento (sia rispetto al tempo). Un derivato è solo la velocità con cui cambia qualcosa. Derivative.dxsignifica "il derivato di State.x".

Poiché la simulazione presuppone che la molla sia ancorata all'origine e abbia una lunghezza di riposo pari a zero, uno spostamento di 100 significa che la particella inizierà a oscillare. La simulazione del test termina quando la particella non si muove ed è vicina all'origine.


Un'altra descrizione è che puoi pensare a RK4 come un'espansione di Taylor all'equazione differenziale.
RandyGaul,

Questa è un'ottima risposta e ha davvero rivelato alcuni buchi nella mia conoscenza della fisica. Potete fornire alcuni riferimenti a un buon punto di partenza per capire cos'è un sistema a molla ammortizzata, coppie, ecc.? Credo che mi mancheranno sicuramente queste meccaniche più avanzate. La tua risposta mi chiarisce molto, soprattutto perché ho iniziato di recente i polinomi di Taylor.
Bennett Yeates


Perfetto, la khanacademy era dove stavo pensando.
Bennett Yeates
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.