# -*- coding: utf-8 -*-
# Created on Thu Aug 24 07:10:10 2023
# @author: mhebding

""" euler le script pour mettre en oeuvre la méthode d'Euler """

# équation différentielle d'ordre 1
# on définit la dérivée par le taux d'acroissement
# dy/dt = (y(t+h)-y(t))/dt
# on en tire y(t+h) = y(t) + h*dy/dt /!\

def euler(dy, y0, t0, tf, n):
    h = (tf-t0)/n # pas
    liste_t = []
    liste_y = []
    y = y0 # initialisation
    t = t0 # initialisation
    for k in range(n): # nombre d'itérations
        liste_t.append(t) # on ajoute t à la liste
        liste_y.append(y) # on ajoute y à la liste
        t = t + h # calcul de l'instant suivant
        y = y + h*dy(y,t) # calcul de la valeur suivante /!\
    return liste_t, liste_y # renvoi des listes
# dy représente la dérivée de y que l'on note habituellement dy/dt

# Exemple
E = 5 # échelon de tension
R = 1000000 # en Ohms
C = 100*10**-6 # 100 µF
tau = R*C

def ED_condensateur(y,t):
    # En posant uC = y on a dy/dt + y/tau = E/tau
    # dy/dt = (E-y)/tau
    dy = (E-y)/tau
    return dy

import matplotlib.pyplot as plt

print('Tau = {} s'.format(round(R*C),1)) # On affiche tau avec un texte et
# .format. Round permet l'arrondi.
n = 200 # nombre de points donnés en question 9
essai_t, essai_y = euler(ED_condensateur, 0, 0, 1000, n)
# l'équa. diff. est ED_condensateur, avec uC0 = 0, t0 = 0 et tf = 1s
plt.clf () # efface la figure courante
plt.plot(essai_t, essai_y) # tracé de y en fonction t
plt.title ("Charge d'un condensateur") # titre du graphe
plt.xlabel("Temps (s)") # nom des abscisses
plt.ylabel("uC (V)") # nom des ordonnées
plt.savefig('essai') # nom du fichier enregistré
plt.show() # affichage du graphe

# Source
"""
https://cpge-paradise.com/IPT/Cours/CI1-K-Euler.pdf
"""