← Retour au menu des cours

Méthode d’Euler

Summary

Méthode d’Euler au premier ordre

Introduction

Soit yy une fonction du temps, et soit tt un instant donné. Le problème est le suivant :

Supposons que :

y=f(y,t) y' = f(y, t)

Comment en déduire y(t+Δt)y(t + \Delta t) et y(t+Δt)y'(t + \Delta t) ?

Idée de la méthode

On approxime la courbe par sa tangente au point tt.

D'une part :

On utilise le développement limité à l’ordre 1 :

y(t+dt)=y(t)+dty(t) y(t + dt) = y(t) + dt \cdot y'(t)

et on remplace les differentielles par des deltas :

y(t+Δt)y(t)+Δty(t) y(t + \Delta t) \approx y(t) + \Delta t \cdot y'(t)

D'autre part :

L'équation différentielle nous dit que :

y(t)=f(y(t),t) y'(t) = f(y(t), t)

il suffit alors de calculer :

y(t+Δt)=f(y(t+Δt),t+Δt) y'(t + \Delta t) = f(y(t + \Delta t), t + \Delta t)

Et c'est fini !

Et oui on a bien répondu à notre question initiale

Interprétation géométrique

On avance d’un petit pas dtdt en suivant la pente de la tangente.

Autrement dit :

C’est une approximation linéaire locale.

Précision

Bien que la méthode d’Euler soit simple et rapide, elle possède de grosses limitations :

Exemple simple

Équation :

y=y y' = y

Condition initiale :

y(0)=1 y(0) = 1

Solution exacte :

y(t)=et y(t) = e^t

Méthode d’Euler avec Δt=0.1\Delta t = 0.1 :

yn+1=yn+0.1yn y_{n+1} = y_n + 0.1 \cdot y_n
yn+1=1.1yn y_{n+1} = 1.1 \, y_n

On obtient une croissance exponentielle approximée.

Code Python

def euler(f, y0, t0, tf, dt):
    t = t0
    y = y0
    
    T = [t]
    Y = [y]
    
    while t < tf:
        y = y + dt * f(y, t)
        t = t + dt
        
        T.append(t)
        Y.append(y)
    
    return T, Y

Méthode d’Euler à l'ordre 2

L'histoire se répète.

Introduction

Soit yy une fonction du temps, et soit tt un instant donné. Le problème est le suivant :

Supposons que :

y=f(y,y,t) y'' = f(y, y', t)

Comment en déduire y(t+Δt)y(t + \Delta t) et y(t+Δt)y'(t + \Delta t) ?

Solution

1) D'une part :

On utilise le développement limité à l’ordre 1 :

y(t+dt)=y(t)+dty(t) y(t + dt) = y(t) + dt \cdot y'(t)

et on remplace les differentielles par des deltas :

y(t+Δt)y(t)+Δty(t) y(t + \Delta t) \approx y(t) + \Delta t \cdot y'(t)

2) D'une autre part :

On utilise le développement limité à l’ordre 1 de la dérivée :

y(t+dt)=y(t)+dty(t) y'(t + dt) = y'(t) + dt \cdot y''(t)

et on remplace les differentielles par des deltas :

y(t+Δt)y(t)+Δty(t) y'(t + \Delta t) \approx y'(t) + \Delta t \cdot y''(t)

3) Et enfin :

L'équation différentielle nous dit que :

y(t)=f(y,y,t) y''(t) = f(y, y', t)

il suffit alors de calculer :

y(t+Δt)=f(y(t+Δt),y(t+Δt),t+Δt) y''(t + \Delta t) = f(y(t + \Delta t), y'(t + \Delta t), t + \Delta t)

Et c'est fini !

Et oui on a bien répondu à notre question initiale.

Exo type concours CCINP

Voici le sujet :

Sujet CCINP Python Physique

Voici ton code :

dt = 0.1
tmax = 10
N = tmax/dt

T = [ i for i in range(0,tmax,dt)]

#a[n] = F[n] - 2*om0*zeta*v[n] - (om0)**2*x[n]


#Écrire une fonction resolution(F, om0, zeta)
#Qui renvoie le tableau complet de x et de v

def resolution(F,om0,zeta,x0,v0):
    X = [x0]
    V=[v0]
    for i in range (N):
        X.append( X[i] + V[i]*dt)
        V.append( V[i]+ (F[i] - 2*om0*zeta*V[i] - (om0)**2*X[i] )*dt)