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 = f(t, y) (1) où y est la fonction inconnue, y 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. On se limitera dans ce cours aux équations explicites, avec le terme y 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 (t 0, y 0 ) tel que y(t 0 ) = y 0. 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 = 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 2.1 Méthode d Euler dy dt = f(t, y), y(t 0) = y 0 (2) 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 y 0 à t 0 et à intégrer la dérivée y, qu on obtient en utilisant l équation différentielle. On part du développement limité y(t + t) = y(t) + t dy dt + O( t2 ) (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 {t i } = {t 0 + i t}, et on note y i = y(t i ). L équation (3) donne alors le schéma numérique : y i+1 = y i + t f(t i, y i ) (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( t 2 ), 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 [t 0, t f ] 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( t 2 ). Le schéma numérique s écrit y i+1 = y i + t f(t mid, y mid ) (5) avec t mid = t i + t/2 et y mid = y i + t/2 f(t i, y i ). 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 : avec ỹ = y i + t f(t i, y i ). y i+1 = y i + t ( f(ti+1, ỹ) + f(t i, y i ) ) (6) 2 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 t mid = t i + t/2 k 1 = t f(t i, y i ) k 2 = t f(t mid, y i + k 1 /2) k 3 = t f(t mid, y i + k 2 /2) k 4 = t f(t i+1, y i + k 3 ) y i+1 = y i + (k 1 + 2k 2 + 2k 3 + k 4 )/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 On pose alors une variable vectorielle Y : Y = ( ) x v et on cherche à quelle équation différentille obéit le vecteur Y. On calcule donc sa dérivée Ẏ : (ẋ ) ( ) ( ) v Y2 Ẏ = = v ω 2 = x ω 2 (9) Y 1 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 : avec la fonction f définie par : A = (7) (8) Ẏ = f(t, Y ) (10) ( ) 0 1 ω 2, f : (t, X) A X (11) 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) = Y 0, 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 t i 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