Chapitre 19

Activités Python

Dipôle RC

Activité

Résoudre avec la méthode d’Euler

Consigne

Ouvrez la page des scripts du chapitre pour consulter le code et télécharger les fichiers .py.

Le chapitre 05 annonçait la méthode d’Euler, qui permet de résoudre numériquement une équation différentielle ; elle sert ici à simuler l’évolution du dipôle RC.

L’idée d’Euler est de faire ce que fait la physique : avancer pas à pas. Le point de départ est l’équation différentielle elle-même, qui donne à chaque instant la pente de la courbe : duCdt=EuCτ. \frac{\mathrm{d}u_C}{\mathrm{d}t} = \frac{E - u_C}{\tau}.

Comment s’en servir numériquement ? On se souvient de la façon dont on estime une dérivée dans un tableau de mesures : faute de dérivée exacte, on prend le taux de variation entre deux instants voisins, duCdtΔuCΔt, \frac{\mathrm{d}u_C}{\mathrm{d}t} \simeq \frac{\Delta u_C}{\Delta t}, approximation d’autant meilleure que le pas Δt\Delta t est petit.

Découpons donc le temps en intervalles de largeur Δt\Delta t et notons unu_n la tension à la date tnt_n. Entre deux instants successifs, la variation s’écrit ΔuC=un+1un\Delta u_C = u_{n+1} - u_n ; en la reportant dans l’équation, avec la pente évaluée à l’instant déjà connu tnt_n : un+1unΔt=Eunτ. \frac{u_{n+1} - u_n}{\Delta t} = \frac{E - u_n}{\tau}. Il ne reste qu’à isoler la tension suivante — c’est la relation de récurrence d’Euler : un+1=un+Δt×Eunτ. u_{n+1} = u_n + \Delta t \times \frac{E - u_n}{\tau}.

Le script Ch19_euler.py (dossier scripts/) applique cette recette — listes et boucle, rien de plus — puis superpose le résultat à la solution exacte. Il s’exécute tel quel, à une ligne près (# À COMPLÉTER).

(La suite — solution exacte et tracé — est fournie et n’est pas à modifier.)

Type : graphique Titre : Méthode d’Euler comparée à la solution exacte (charge RC) Rôle : montrer que la méthode d’Euler approche la solution exacte, d’autant mieux que le pas est petit.

  • Axe horizontal : temps tt en secondes (s), de 00 à environ 5,155{,}15 (soit 5τ5\tau avec τ=1,0\tau = 1{,}0 s).
  • Axe vertical : tension uCu_C en volts (V), de 00 à environ 5,75{,}7 ; asymptote E=5,0E = 5{,}0 V.
  • Courbes : solution exacte E(1et/τ)E\left(1 - e^{-t/\tau}\right) (bleu, cBac, trait plein) ; Euler Δt=1\Delta t = 1 s (rouge, cPiege, marqueurs ronds) ; Euler Δt=0,25\Delta t = 0{,}25 s (vert, cDefi, marqueurs carrés).
  • Résultat lisible : les pas d’Euler suivent la courbe exacte ; plus Δt\Delta t est petit, plus l’approximation colle à la solution (E=5,0E = 5{,}0 V, τ=1,0\tau = 1{,}0 s).

Questions :

  1. Compléter la ligne d’Euler à partir de l’équation différentielle.
  2. Exécuter avec Δt=1,0\Delta t = 1{,}0 s (un pas égal à τ\tau) : que devient la courbe d’Euler, et pourquoi est-ce une mise en garde ?
  3. Comparer uC(5τ)u_C(5\tau) à la valeur exacte pour Δt=1,0\Delta t = 1{,}0 s, 0,10{,}1 s et 0,050{,}05 s. Que constate-t-on ?

Fiche O5 - Python (listes, boucles, append) : tout y est rappelé.

Script élève

# Charge d'un condensateur : la methode d'Euler (chapitre 19)
# L'equation differentielle du RC : du_C/dt = (E - u_C)/tau.
# Euler avance pas a pas : u_(n+1) = u_n + dt * (E - u_n)/tau.
# Le script s'execute tel quel, a UNE ligne pres (# À COMPLÉTER).
import math
import matplotlib.pyplot as plt

E = 5.0      # tension de la source (V)
tau = 1.0    # temps caracteristique tau = R*C (s)
dt = 0.1     # pas de temps (s) -- essayer aussi 1.0 puis 0.05

# ---- methode d'Euler : listes + boucle ----
ts = [0.0]   # les dates
us = [0.0]   # les tensions u_C (condensateur decharge a t=0)
while ts[len(ts) - 1] < 5 * tau:
    u_suivant = 0           # u_n + pente x pas   # À COMPLÉTER
    us.append(u_suivant)
    ts.append(ts[len(ts) - 1] + dt)

# ---- la solution exacte, pour comparer (fournie) ----
t_exact = []
u_exact = []
for k in range(501):
    t = 0.01 * k
    t_exact.append(t)
    u_exact.append(E * (1 - math.exp(-t / tau)))

# ---- trace (fourni) ----
plt.plot(t_exact, u_exact, label="solution exacte")
plt.plot(ts, us, "o-", label="méthode d'Euler")
plt.xlabel("t (s)")
plt.ylabel("u_C (V)")
plt.legend()
plt.show()

print("u_C a t = 5 tau : Euler", us[len(us) - 1], "V ; exact",
      E * (1 - math.exp(-5.0)), "V")

← Retour au portail du chapitre