# 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")
