Perché RK4 è meglio dell'integrazione di Euler? [chiuso]


20

Alla fine di queste fantastiche diapositive , l'autore confronta tutti i diversi integratori presentati. In un modo o nell'altro, mancano tutti tranne Integrazione migliorata di Eulero e Integrazione di Runge Kutta 4 , che entrambi superano tutti i test.

Suppongo che dovrei menzionare che sto lavorando a un gioco 2D che non richiede molta fisica. Sono solo curioso di sapere dove l'integrazione di Euler migliorata non sarebbe all'altezza e si dovrebbe usare invece RK4.

Il mio gioco consiste principalmente di gravità semplice (salto e caduta), movimento lungo gli assi X e Y e collisione del riquadro di delimitazione. Vale la pena implementare RK4 o un Eulero migliorato sarebbe sufficiente? Vedo molte discussioni in cui gli utenti di Euler Integration sono castigati, ma da quello che posso vedere, Euler migliorato è quivalente in semplici questioni 2D. Immagino che sarebbe anche più veloce.


offtopic, ma quelle aree sono ottime diapositive, molto chiare con gli esempi e tutto il resto. Grazie per quel link!
Roy T.

Se questo è davvero fuori tema qui probabilmente sarebbe una buona scelta per la scienza computazionale .
David Z

Inoltre: integrazione di Verlet corretti nel tempo - sembra simile a Eulero migliorato: troppo pigro per capire se è esattamente lo stesso. TCV è eccezionale perché puoi essere indulgente con il tuo passo temporale fisso (altri integratori vogliono un passo temporale fisso garantito).
Jonathan Dickinson,

1
Impossibile modificare: vedo che lo menziona. Non sono sicuro che la sua implementazione sia corretta in termini di requisiti delle condizioni iniziali come indicato nell'articolo: ma non ho mai visto quel problema di gravità con la mia implementazione di TCV se calcolavo correttamente le condizioni iniziali.
Jonathan Dickinson,

Risposte:


15

Personalmente preferisco Velocity Verlet per la maggior parte delle simulazioni. Nella mia esperienza con questo metodo, è abbastanza adatto per equazioni piuttosto rigide. Sembra che questo metodo "Euler migliorato" sia abbastanza simile a quello di Velocity Verlet e si basi su una classe di metodi di integrazione nota come predittore-correttore . Al giorno d'oggi puoi leggere molte cose su questi metodi, a partire dai "Grandi passi nella simulazione della stoffa" di David Baraff, dove il potere dei metodi impliciti brilla davvero. La loro rovina è che tu:

  1. devono avvicinarsi ai giacobiani o agli assiani e poi devono
  2. calcolare una discreta quantità di inversioni di matrice per frame.

Quindi se non sei un guru della matematica, potresti incastrare le dita. Sperimenta il metodo che preferisci e accontentati di quello che sembra funzionare meglio per te. Semplice non è sempre meglio, ma per framerate interattivi conosco solo una parola: compromesso.

Alcune risorse aggiuntive che potresti voler consultare:

Jakobsen è una specie di genio per aver avuto un'idea così semplice per un problema pretenzioso (la sua specialità è la crittografia se non sbaglia, ma è riuscito a dimostrare l'equivalenza matematica del suo metodo con una classe di algoritmo iterativo di Gauss-Seidel, che è convergente ). Per semplicità, prova questo prima di approfondire i metodi impliciti.

MODIFICA DOPO : Recentemente ho ricevuto un documento su questo problema dell'utilizzo di integratori espliciti per la simulazione del corpo morbido o semirigido e di quale sia il loro impatto sulle prestazioni e sulla qualità. Questo documento dovrebbe servire da guida per la scelta di un certo integratore, a seconda dello scenario.


1
+1 Questa era in realtà una risposta di qualità davvero buona in termini di contenuto: ma era un po 'troppo difficile da digerire (muro di testo). Ho scoperto che una buona formattazione aiuta sempre a ottenere voti positivi. L'ho migliorato e spero che tu ottenga i voti positivi che meriti.
Jonathan Dickinson,

Grazie Jonathan, l'ho fatto in fretta, trascurando la procedura "amichevole per i lettori", ma ho dovuto menzionare quelle poche fonti in quanto sono usate molto frequentemente anche oggi).
Teodron,

10

Q: Perché usare l'avanzato Runge Kutta?
A: Perché è molto esatto.

Q: Perché no?
A: Dato che stai realizzando un gioco e un motore fisico molto preciso non ha importanza, deve solo essere abbastanza buono da ingannare il giocatore.

A proposito, se hai un forte smorzamento in caso di collisione, come farebbe la maggior parte dei platform, un semplice Eulero va bene.

Consiglio vivamente che, a differenza del codice nella presentazione, usi la fisica a passi fissi, che ti fa risparmiare qualche potenziale problema tecnico e ti consente di risolvere il problema del guadagno o della perdita di energia della palla in un modo molto semplice. Scegli la via di mezzo tra l'integrazione esplicita e implicita:

velocity += 0.5 * acceleration;
position += velocity;
velocity += 0.5 * acceleration;

Ciò che la presentazione non mostra è come gestire le collisioni in modo che gli oggetti non sembrino andare oltre i confini. La semplice soluzione a questo problema è utilizzare un'alta frequenza di aggiornamento. Una soluzione più complessa ma potenzialmente migliore è quella di spostare indietro gli oggetti al momento della collisione, l'implementazione esatta dipende dal comportamento fisico desiderato.


1
+1 per "ingannare il giocatore" - ma personalmente ho fatto esplodere sistemi "molto semplici" a causa dell'integrazione di Eulero.
Jonathan Dickinson,

@JonathanDickinson Direi che non è a causa dell'integrazione di Eulero, ma piuttosto a causa di un mix di circostanze, l'integrazione di Eulero è solo una di queste. Se hai un esempio, sono sicuro di poter trovare un modo per evitare l'esplosione dei sistemi.
aaaaaaaaaaaa

Oh, è su alcune cose VB6 davvero vecchie (quando avevo letteralmente circa 14 anni) prima che venissi a conoscenza di RK / Verlet - Non ho nemmeno più il codice: il che dà alta credibilità al fatto che avrebbe potuto essere qualcos'altro nel miscuglio :).
Jonathan Dickinson,

1
Immagino che dovrei aggiungere che non appena inizi a fare casini con l'attrazione tra gli oggetti piuttosto che la semplice gravità, mi sembra ragionevole intensificare il metodo di integrazione, potrebbe non essere strettamente necessario, ma se hai la potenza di elaborazione il l'unico aspetto negativo è il codice leggermente più complesso.
aaaaaaaaaaaa

1

La presentazione ha un errore. Il metodo indicato dal presentatore come "Euler migliorato" è in realtà il metodo Velocity Verlet!

Vedere qui per una fonte più autorevole: http://www.physics.udel.edu/~bnikolic/teaching/phys660/numerical_ode/node5.html

Anche le stesse equazioni sono in Wikipedia .

Un comune miglioramento immediato rispetto al metodo di Euler è il metodo Midpoint che probabilmente il presentatore aveva in mente ma ha finito per confondere Velocity Verlet con Euler migliorato. L'unica differenza tra il metodo Midpoint e il Velocity Verlet è che la velocità è la media dell'ultima e della successiva accelerazione anziché dipendere solo dall'ultima accelerazione.

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.