J'ai regardé autour en ligne pendant quelques temps maintenant pour des méthodes d'intégration pour un moteur de physique que j'essaye de coder pour le plaisir (dois aimer le nerdiness là: P). J'ai trouvé la méthode d'Euler, RK4, et Verlet (ainsi que la version corrigée dans le temps). J'ai aussi essayé de trouver certaines de mes méthodes. Je me demandais si vous en connaissiez d'autres que vous trouviez intuitifs ou utiles. Merci. EDIT: Merci pour toute votre aide jusqu'à maintenant. En ce qui concerne la clarification: peut-être que je veux dire l'intégration numérique. Étonnamment, dans toutes mes recherches, je n'ai pas trouvé autant que le NOM technique pour ce que j'essaie de faire! Peut-être décrivant mon problème spécifique rendra ma question plus claire. Disons que je veux simuler une balle se déplaçant à travers un champ gravitationnel circulaire (ou sphérique une fois que j'implémente 3d). Cette bille rencontrera des vecteurs de force qui peuvent être utilisés pour calculer un vecteur d'accélération correspondant au point où se trouve la bille sur cette coche spécifique. De votre classe de physique, vous savez que la vitesse = accélération * temps mais mon problème est que la balle est techniquement sur ce point pendant un instant, représenté mathématiquement dans le calcul par dt. Évidemment, je ne peux pas utiliser un nombre infinitésimal en C++ donc je dois approximer la solution en utilisant des méthodes d'intégration instantanée (un terme que j'ai entendu dans certaines lectures mais je peux me tromper complètement) ou ce que vous pensez s'appelle intégration numérique. juste donc j'ai changé le titre).Quels sont les bons algorithmes d'intégration numérique pour un moteur physique?
Voici mon (succès) tentative de mise en œuvre de la méthode d'Euler de l'intégration numérique:
//For console output. Note: I know I could just put "using namespace std;" but I hate doing that.
#include <iostream>
using std::cout;
using std::system;
using std::endl;
//Program entry
int main (void)
{
//Variable decleration;
double time = 0;
double position = 0;
double velocity = 0;
double acceleration = 2;
double dt = 0.000001; //Here is the "instantanious" change in time I was talking about.
double count = 0; //I use count to make sure I am only displaying the data at whole numbers.
//Each irritation of this loop is one tick
while (true)
{
//This next bit is a simplified form of Euler's method. It is what I want to "upgrade"
velocity += acceleration * dt;
position += velocity * dt;
if (count == 1/dt) //"count == 1/dt" will only return true if time is a whole number.
{
//Simple output to console
cout << "Time: " << time << endl;
cout << "Position: " << position << endl;
cout << "------------------" << endl;
system ("pause");
count = 0; //To reset the counter.
}
//Update the counters "count" and "time"
count++;
time += dt;
}
return 1; //Program exit
}
Parce que l'accélération est constante et cette différence est en fait résoluble (pourquoi je l'utilise pour tester, la solution est position = temps^2, ceci est assez précis mais si vous le compliquez un peu, par exemple en faisant varier l'accélération dans le temps, l'algorithme perd de sa précision très rapidement, encore une fois merci
Qu'entendez-vous par "intégration instantanée"? Voulez-vous dire "intégration numérique?" –
Je pense que l'auteur signifie "intégration numérique des équations différentielles ordinaires". La méthode de Runge-Kutta est plutôt bonne. – lapk
@Nicol Bolas J'ai fait de mon mieux pour clarifier pour vous les gars. – AnalyticalInsanity