![]() |
|
![]() |
La méthode de Runge-Kutta est une méthode permettant l'intégration
numérique d'une équation différentielle du premier ordre. La version
donnée ici est une approximation à l'ordre 4 de la dérivée
(il existe des méthodes de Runge-Kutta pour différents ordres, mais
le meilleur compromis précision/vitesse est l'ordre 4). Nous donnons
ici une méthode dites à pas variable : on intègre les équations
sur Δt
en un pas, puis sur Δt
en 2 pas (i.e., en passant par
) ; si l'écart entre le 2 résultats est supérieur à une précision
donnée, Δt
est divisé par 2, sinon, il est multiplié par 2 pour le pas suivant.
Cela permet de faire des grands pas de temps quand le système évolue
lentement et de faire des pas de temps petits si ces variations sont
rapides.
L'algorithme donné ici est une adaptation de celui fourni dans la bibliothèque Numerical Receipes pour le C/C++. Nous donnons ``2 versions'' : la première (C++ uniquement) est à utiliser si vous avez fait une classe pour représenter l'objet que vous voulez faire évoluer. La seconde est utilisable en C standard comme en C++ correspond à une programmation non-objet. Dans les 2 cas, le code peut vous paraître un peu long mais vous n'avez pas grand chose à faire.
Supposons que vous ayez écrit une classe MonSystem décrivant le système que vous voulez faire évoluer.
Télécharger les fichiers DynamicalSystem.h et DynamicalSystem.C. Nous donnons le prototype ci-dessous (contenu du fichier DynamicalSystem.h).
#define _DYNAMICALSYSTEM_
class DynamicalSystem
{
protected:
int NVariable;
double Precision;
double Hestimate;
double Hmin;
public:
DynamicalSystem(int n);
virtual void EDP(double t,double *X,double *dX){}
void RungeKutta(double *y, double t1,double t2);
void SetPrecision(double p){Precision=p;}
void SetHmin(double h){Hmin=h;}
void SetHestimate(double h){Hestimate=h;}
private:
double *vector(int N);
void nrerror(char * error_text);
void free_vector(double *v);
int odeint(double *ystart, double x1, double x2, double eps,
double h1, double hmin, int *nok, int *nbad);
void rk4(double *y, double *dydx, double x, double h, double *yout);
void rkqc(double *y, double *dydx, double *x, double htry,
double eps, double *yscal, double *hdid, double *hnext);
};
#endif
Votre classe MonSystem devra être écrite de cette façon :
class MonSystem : public DynamicalSystem
{
...
public:
MonSystem(...);
void EDP(double t, double *X, double *dX);
...
};
MonSystem::MonSystem(...) : DynamicalSystem(4)
{
}
...
![]() | |
![]() | |
![]() | |
![]() |
La compilation de votre programme se fera en 2 temps. Le premier consiste à compiler DynamicalSystem.C sans faire d'édition de lien ; par exemple avec CC, vous taperez
Télécharger le fichier rk4.C
Vous devrez inclure ce fichier à votre programme (#include RK4.C). Ensuite, au lieu d'appeler la méthode d'Euler, vous appellerez la fonction RungeKutta ; son premier argument est un pointeur sur votre tableau de conditions initiales à t = t1 (y[0]...y[N-1]). Ce tableau est de dimension N (argument 2). En sortie, ce tableau contient les valeurs à t = t2 . Les 2 arguments t1 et t2 sont le temps initial et final pour l'intégration. Le dernier argument est le nom de votre fonction contenant les équations du mouvement. Si cette fonction s'appelle EDP, son prototype doit être
This document was generated using the LaTeX2HTML translator Version 2021 (Released January 1, 2021)
The command line arguments were:
latex2html -split 1 -html_version 3.2,math -no_navigation RungeKutta.tex
The translation was initiated on 2025-03-11