|
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
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).
Votre classe MonSystem devra être écrite de cette façon :
}
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
Runge-Kutta en C++
La classe DynamicalSystem
Dans cette classe, le constructeur est appelé
avec le nombre de variables (i.e., le nombre d'équations différentielles
à intégrer). La variable Precision sert à changer le pas au
cours de l'intégration. Hestimate et Hmin sont respectivement
les pas supposé et minimum utilisés pour l'intégration. En principe,
leurs valeurs par défaut permettent de résoudre la plupart des problèmes.
La méthode RungeKutta est
la méthode que vous appellerez dans votre classe MonSystem ; elle
prend comme arguments un pointeur sur des doubles (c'est votre tableau
de conditions initiales), le temps initial et le temps final. Les
valeurs à l'instant final remplacerons les conditions initiales dans
le tableau.
#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
Utilisation de cette classe
class MonSystem : public DynamicalSystem
{
...
public:
MonSystem(...);
void EDP(double t, double *X, double *dX);
...
};
MonSystem::MonSystem(...) : DynamicalSystem(4)
{
...
Explications
Compilation
Ceci est fait une fois pour toute. Ensuite, si votre programme
s'appelle MonPrg.C, vous taperez
à chaque fois que vous aurez modifier MonPrg.C.
Runge-Kutta : fonction C utilisable en C++
Utilisation
où t