Aller au contenu

Leçon 8

La méthode d'Euler en Python

Vidéo 8 : La méthode d'Euler en Python · 3 min 52 s · sous-titres en français

Le cours écrit

8.1 L'idée

On ne sait pas toujours résoudre une équation différentielle exactement. Le programme cite Euler parmi ceux qui ont structuré ces résolutions, aux côtés de Newton, D'Alembert, Lagrange, Cauchy, Clairaut et Riccati. La méthode d'Euler en donne une solution approchée. Elle repose sur la tangente : près d'un point, la courbe est proche de sa tangente. Pour hh proche de 00, y(x+h)≈y(x)+h y′(x).y(x + h) \approx y(x) + h\,y'(x). On part du point (x0 ;y0)(x_0\,;y_0) et on avance par petits pas de longueur hh, chaque fois le long de la droite dont le coefficient directeur est donné par l'équation. On obtient une ligne brisée proche de la courbe de la solution.

8.2 Le cas de y′=fy' = f

Pour l'équation y′=fy' = f avec y(x0)=y0y(x_0) = y_0, on calcule de proche en proche : xk+1=xk+h,yk+1=yk+h f(xk).x_{k+1} = x_k + h, \qquad y_{k+1} = y_k + h\,f(x_k).

En langage naturel (« ←\leftarrow » se lit « prend la valeur »), une étape s'écrit : y←y+h×f(x)y \leftarrow y + h \times f(x), puis x←x+hx \leftarrow x + h.

Exemple 40. Pour y′=1xy' = \dfrac1x avec y(1)=0y(1) = 0, la solution exacte est ln⁡\ln. Avec h=0,1h = 0{,}1, le premier pas donne y1=0+0,1×11=0,1y_1 = 0 + 0{,}1 \times \dfrac11 = 0{,}1, le deuxième y2=0,1+0,1×11,1≈0,190 9y_2 = 0{,}1 + 0{,}1 \times \dfrac{1}{1{,}1} \approx 0{,}190\,9. Après 1010 pas, on arrive à x=2x = 2 avec y≈0,718 8y \approx 0{,}718\,8, alors que ln⁡2≈0,693 1\ln 2 \approx 0{,}693\,1. Avec h=0,01h = 0{,}01 et 100100 pas, on obtient 0,695 70{,}695\,7 ; avec h=0,001h = 0{,}001 et 10001000 pas, 0,693 40{,}693\,4.

En Python. On range les valeurs dans deux listes, construites par ajouts successifs.

from math import exp

def euler(f, x0, y0, h, n):
    X = [x0]
    Y = [y0]
    for k in range(n):
        Y.append(Y[k] + h * f(X[k]))
        X.append(X[k] + h)
    return X, Y

def f(x):
    return exp(-x**2)

X, Y = euler(f, 0, 0, 0.1, 10)
print(Y[10])

Ce programme traite la fonction x↦e−x2x \mapsto \mathrm{e}^{-x^2}, qui n'a pas de primitive explicite. Il affiche 0.7778168240731773, valeur approchée de y(1)y(1) pour la solution telle que y(0)=0y(0) = 0. Avec un pas de 0.01 et 100100 pas, on obtient 0.7499786042621127 ; avec 0.001 et 10001000 pas, 0.747140131778599. La valeur approchée se stabilise vers 0,7470{,}747.

8.3 Le cas de y′=ay+by' = ay + b

La dérivée dépend maintenant de yy. On remplace y′y' par ay+bay + b : xk+1=xk+h,yk+1=yk+h (a yk+b).x_{k+1} = x_k + h, \qquad y_{k+1} = y_k + h\,(a\,y_k + b). La suite (yk)(y_k) vérifie yk+1=(1+ah) yk+hby_{k+1} = (1 + ah)\,y_k + hb : c'est une suite arithmético-géométrique.

def euler2(a, b, x0, y0, h, n):
    X = [x0]
    Y = [y0]
    for k in range(n):
        Y.append(Y[k] + h * (a * Y[k] + b))
        X.append(X[k] + h)
    return X, Y

X, Y = euler2(1, 0, 0, 1, 0.01, 100)
print(Y[100])

Ce programme traite y′=yy' = y avec y(0)=1y(0) = 1, dont la solution est l'exponentielle : il affiche une valeur approchée de e\mathrm{e}. Tu as vu cette construction en Première. Ici yk=(1+h)ky_k = (1 + h)^k.

Pas hh Nombre de pas Valeur approchée de e\mathrm{e} Écart avec e≈2,718 28\mathrm{e} \approx 2{,}718\,28
0,50{,}5 22 2,252{,}25 0,4680{,}468
0,10{,}1 1010 2,593 72{,}593\,7 0,1250{,}125
0,010{,}01 100100 2,704 82{,}704\,8 0,013 50{,}013\,5
0,0010{,}001 10001000 2,716 92{,}716\,9 0,001 40{,}001\,4

Ce que l'on observe. Quand on divise le pas par 1010, l'écart est à peu près divisé par 1010. Pour gagner une décimale, il faut dix fois plus de calculs.

Exemple 41 (la tarte). On reprend T′=−0,1 T+2T' = -0{,}1\,T + 2 avec T(0)=180T(0) = 180. Avec un pas de 55 minutes, yk+1=0,5 yk+10y_{k+1} = 0{,}5\,y_k + 10 et on obtient :

tt 00 55 1010 1515 2020
Euler, h=5h = 5 180180 100100 6060 4040 3030
Solution exacte 180180 117,04117{,}04 78,8678{,}86 55,7055{,}70 41,6541{,}65

L'approximation est grossière. Avec euler2(-0.1, 2, 0, 180, 0.1, 200), on trouve 41,4441{,}44 à t=20t = 20, et avec un pas de 0,010{,}01, 41,6341{,}63 : on se rapproche de la valeur exacte 41,6541{,}65.

À quoi ça sert, puisqu'on sait résoudre ? Pour les équations du chapitre, on peut comparer à la solution exacte et voir comment se comporte la méthode. Mais elle s'applique aussi aux équations que l'on ne sait pas résoudre : c'est son intérêt principal.

Lire le cours complet du chapitre

Exercices 15 et 16

  • Exercice 15 : à la main, puis en Python
  • Exercice 16 : Euler et les suites

Exercices du chapitre (PDF, 156 Ko)

Corrigés

Cherche d'abord les exercices sur ta feuille, puis compare avec le corrigé détaillé.

Corrigés du chapitre (PDF, 150 Ko)

Tu es hors connexion. Les chapitres téléchargés restent disponibles dans Hors connexion.