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’inté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), dt 2.1 y(t0 ) = y0 (2) 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é y(t + ∆t) = y(t) + ∆t dy + O(∆t2 ) dt (3) 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; n = length(t); y = zeros(1,n); y(1) = y0; % on fixe la grille de temps % on fixe la taille du tableau y % 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 : yi+1 = yi + ∆t f (ti+1 , ỹ) + f (ti , yi ) 2 (6) 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 fonction 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 v̇ = −ω 2 x (7) On pose alors une variable vectorielle Y : x Y = v ! (8) 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 coefficients 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= , −ω 2 0 f : (t, X) 7→ A · X (11) 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 équations 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. 5