# Charge d'un condensateur : la methode d'Euler (chapitre 19) -- CORRIGE
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]
us = [0.0]
while ts[len(ts) - 1] < 5 * tau:
    u_suivant = us[len(us) - 1] + dt * (E - us[len(us) - 1]) / tau
    us.append(u_suivant)
    ts.append(ts[len(ts) - 1] + dt)

# ---- la solution exacte, pour comparer ----
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 ----
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")
# dt = 1 s   -> 5.000 V (ecart 0,7 %) : la courbe atteint E en UN pas
# dt = 0.1 s -> 4.974 V (ecart 0,2 %)
# dt = 0.05  -> 4.970 V (ecart 0,1 %) : Euler converge quand dt diminue
