Vous êtes sur la page 1sur 5

Résolution d’équations différentielles avec

Matlab
Olivier Gauthé

1 Rappel sur les équations différentielles


1.1 Définition et généralités
Une équation différentielle ordinaire (ODE, ordinary differential equation)
est une équation reliant une fonction d’une variable réelle et ses dérivées, c’est
à dire de la forme
y 0 = f (t, y) (1)
où y est la fonction inconnue, y 0 sa dérivée et t la variable réelle. On ne s’in-
téressera pas ici aux équations différentielles partielles et on dira simplement
équation différentielle pour désigner une équation différentielle ordinaire. On
peut en fait définir une famille plus générale d’équations différentielles, de la
forme g(t, y, y 0 ) = 0. On se limitera dans ce cours aux équations explicites,
avec le terme y 0 en dehors de la fonction f .

1.2 Conditions initiales et théorème de Cauchy-Lipschitz


Une équation différentielle admet généralement une infinité de solution,
mais un problème physique, par exemple la chute d’une pierre, n’a qu’une seule
solution : celle qu’on mesure. Pour trouver la solution physique du problème
considéré, il faut fixer une condition initiale, c’est à dire un couple (t0 , y0 )
tel que y(t0 ) = y0 .
On appelle problème de Cauchy la donnée d’une équation différentielle et
d’une condition initiale. Le théorème de Cauchy-Lipschitz assure alors
que si la fonction f est suffisamment régulière, il existe une unique solution
au problème de Cauchy. On considèrera que cette condition de régularité est
toujours respectée par la suite.
Exemple : le problème de Cauchy y 0 = y, y(0) = 1 admet une unique
solution, la fonction exponentielle.

1.3 Résolution d’une équation différentielle


Dans la grande majorité des cas, on ne connaît pas de solution exacte à une
équation différentielle : les solutions analytiques sont des exceptions. On sait
qu’une solution exacte existe, mais on ne peut pas en dire plus. À défaut d’une

1
solution exacte, on peut résoudre numériquement une équation différentielle,
c’est à dire obtenir une valeur numérique approchée y(t) pour un ensemble de
temps discrets. L’objectif est que lorsque le pas de temps diminue, la solution
approchée converge vers la solution exacte.

2 Méthodes numériques
Nous allons détailler quelques méthodes numériques permettant de ré-
soudre l’équation différentielle
dy
= f (t, y), y(t0 ) = y0 (2)
dt

2.1 Méthode d’Euler


La méthode d’Euler est la méthode numérique la plus simple pour résoudre
une équation différentielle. Elle n’est jamais utilisée en condition réelle car peu
performante, mais elle a l’avantage de la simplicité. Elle consiste à partir du
point y0 à t0 et à intégrer la dérivée y 0 , qu’on obtient en utilisant l’équation
différentielle. On part du développement limité
dy
y(t + ∆t) = y(t) + ∆t + O(∆t2 ) (3)
dt
On insère l’équation différentielle (2) dans cette équation et on obtient y(t +
∆t) = y(t) + f (y, t). On fixe un pas de temps fini ∆t et une grille de temps
{ti } = {t0 + i∆t}, et on note yi = y(ti ). L’équation (3) donne alors le schéma
numérique :
yi+1 = yi + ∆t · f (ti , yi ) (4)
En fait, rien n’impose d’utiliser un pas de temps ∆t constant. Au contraire,
on obtient une meilleure précision en prenant un pas de temps variable bien
choisi.
L’erreur est cumulative : à chaque étape, on utilise le résultat de l’étape
précédente et on accroît l’erreur. À chaque étape, l’erreur commise est en
O(∆t2 ), l’erreur totale sur le résultat final est donc contrôlée comme O(∆t)
(méthode d’ordre 1), ce qui est assez lent : il faut un pas de temps très petit
pour obtenir un résultat proche de la valeur exacte.
Une implémentation de la méthode d’Euler pour résoudre l’équation (2)
sur l’intervalle [t0 , tf ] avec un pas de temps dt est donc, en code Matlab :
t = t0:dt:tf; % on fixe la grille de temps
n = length(t);
y = zeros(1,n); % on fixe la taille du tableau y
y(1) = y0; % on fixe la condition initiale

for i=1:n-1 % i+1 ne doit donc pas dépasser n


y(i+1) = y(i) + dt*f(t(i),y(i)); % schéma numérique
end

2
2.2 Autres méthodes numériques
La méthode d’Euler converge très lentement, l’erreur est mal contrôlée. On
cherche donc des algorithmes plus efficaces. On ne détaillera pas le déroulé des
méthodes, le lecteur intéressé est renvoyé à la littérature sur le sujet.

Méthode du point du milieu. La méthode du point du milieu consiste


à prendre la valeur de la dérivée au point situé au milieu de chaque intervalle
de temps. C’est une méthode d’ordre 2, c’est à dire que l’erreur est contrôlée
en O(∆t2 ). Le schéma numérique s’écrit

yi+1 = yi + ∆t · f (tmid , ymid ) (5)

avec tmid = ti + ∆t/2 et ymid = yi + ∆t/2 · f (ti , yi ).

Méthode de Heun. La méthode de Heun, ou méthode d’Euler améliorée


ou encore méthode de Runge-Kutta d’ordre 2 est une autre méthode d’ordre
2. Son schéma numérique est :
∆t  
yi+1 = yi + f (ti+1 , ỹ) + f (ti , yi ) (6)
2
avec ỹ = yi + ∆t · f (ti , yi ).

Méthode de Runge-Kutta d’ordre 4. la méthode de Runge-Kutta est


une méthode générale utilisable à n’importe quel ordre. Le schéma numérique
de l’ordre 4 s’écrit

tmid = ti + ∆t/2
k1 = ∆t · f (ti , yi )
k2 = ∆t · f (tmid , yi + k1 /2)
k3 = ∆t · f (tmid , yi + k2 /2)
k4 = ∆t · f (ti+1 , yi + k3 )
yi+1 = yi + (k1 + 2k2 + 2k3 + k4 )/6

2.3 Application
Implémenter la méthode du point du milieu et la méthode de Runge-Kutta
pour résoudre le problème de Cauchy y(t) = 2y, y(0) = 1 sur l’intervalle
de temps [0, 4]. Tracer les courbe des résultats obtenus par cette méthode,
par la méthode d’Euler ainsi que la solution exacte. Faire varier le pas de
temps et regarder comment les solutions évoluent. Tracer la courbe de l’erreur
exp(8) − y(4) en fonction du pas de temps pour différentes méthodes.

2.4 Utilisation de la fonction ode45


Matlab propose sa propre méthode de résolution d’équation différentielle
avec la fonction ode45. Aller lire l’aide en ligne de cette fonction. On lit que

3
la syntaxe est [t,y] = ode45(odefun,tspan,y0). Pour résoudre le problème
précédent, il faut donc rentrer

[t45,y45] = ode45(@(t,y) 2*y,[0,4],1)

Ici, on définit une fonction sans nom qui renvoie 2y et on passe une référence à
cette fonction comme argument à ode45. On aurait aussi pu définir cette fonc-
tion dans un fichier annexe fct_ode1.m et l’appeler avec ode45(@fct_ode1,
[0,4],1).
Matlab détermine tout seul sa grille de temps, on ne lui passe donc que les
bornes comme argument.

3 Équations différentielles d’ordres supérieurs


Nous avons jusqu’ici traité uniquement des fonctions différentielles d’ordre
1. En physique, on rencontre également des équations différentielles d’ordre
supérieur, comme l’équation du ressort ẍ + ω 2 x = 0. Le principe pour les
résoudre consiste à se ramener à une équation différentielle d’ordre 1. Pour
cela, on pose v = ẋ. On a alors les équations

 ẋ = v
(7)
 v̇ = −ω 2 x
On pose alors une variable vectorielle Y :
!
x
Y = (8)
v

et on cherche à quelle équation différentille obéit le vecteur Y . On calcule donc


sa dérivée Ẏ : ! ! !
ẋ v Y2
Ẏ = = = (9)
v̇ −ω 2 x −ω 2 Y1
où on a utilisé l’équation (7). On observe qu’on peut écrire chacun des coeffi-
cients de Ẏ en fonction de ceux de Y : on s’est donc ramené à une équation
différentielle d’ordre 1 en la variable Y :

Ẏ = f (t, Y ) (10)

avec la fonction f définie par :


!
0 1
A= , f : (t, X) 7→ A · X (11)
−ω 2 0

Ici, l’équation initiale est linéaire ce qui permet de ramener la fonction f


à un simple produit matriciel, de plus elle ne dépend pas de t. Dans le cas
général, f est quelconque.

4
Plus généralement, une équation différentielle scalaire d’ordre n
peut toujours se ramener à une équation vectorielle d’ordre 1 de
dimension n. Les conditions initiales s’écrivent alors Y (0) = Y0 , c’est à dire
qu’on fixe le vecteur initial, soit n scalaires. On peut ensuite appliquer les
méthodes numériques du chapitre précédent.
En pratique, la fonction ode45 ne résout que des équations différentielles
d’ordre 1, mais de dimension quelconque. Il faut donc ramener une équation
différentielle à une équation d’ordre 1 avant d’appeler ode45. Dans le cas du
ressort, on commence par construire la matrice A. On résout ensuite l’équation
différentielle sur l’intervalle [0, 2π] avec les conditions initiales x(0) = 1, v(0) =
0 en rentrant :

[t45,y45] = ode45(@(t,y) A*y,[0,2*pi],[1,0])

Noter que y45 est alors un tableau de taille (length(t45), 2) : la première


colonne y45(:,1) contient la valeur de la position à chaque instant ti et la
deuxième colonne y45(:,2) contient la vitesse au même instant.
Dans le cas général, le plus simple est d’écrire la fonction dY /dt dans un
fichier annexe et d’appeler cette fonction comme argument de ode45, plutôt
que de la définir dans la ligne d’appel de la fonction (se référer à l’aide en ligne).

Application : modifier les méthodes précédentes pour résoudre des équa-


tions différentielles d’ordre 2. Résoudre l’équation du ressort, tracer la vitesse
et la position en fonction du temps et observer comment la solution évolue en
fonction du pas de temps.