# -*- coding: utf-8 -*-
# Created on Thu May 15 08:08:08 2025
# @author: mhebding
# DM1py - Euler 1



## I - LA methode d Euler en Python

# 1. 2. 3.
# y(t+h) = y(t) + h*dy/dt

def euler(dy, y0, t0, tf, n):
    h = (tf-t0)/n
    liste_t = []
    liste_y = []
    y = y0
    t = t0
    for k in range(n):
        liste_t.append(t)
        liste_y.append(y)
        t = t+h
        y = y+h*dy(y,t)
    return liste_t, liste_y 

# dy represente la derivee de y par rapport au temps

# dy/dt + 1/tau y = E/tau
# dy/dt = 1/tau*(E-y)

# 4.
def ED_charge(y,t):
    tau = R*C
    dy = (E-y)/tau
    return dy

# 5.
# y(t+h) = y(t) + h* (E-y(t))/tau

import matplotlib.pyplot as plt

# 6.
E = 5
R = 1000000 # 1000 kOhms
C = 100*10**-6 # 100 µF (c est enorme, cf la duree totale de 1000 s)
tau = R*C
print('Tau = {} s'.format(round(tau,1)))
n = 1000
essai_t, essai_y = euler(ED_charge, 0, 0, 1000, n)
plt.clf ()
plt.plot(essai_t, essai_y)
plt.title ("Essai charge d'un condensateur")
plt.xlabel("Temps (s)")
plt.ylabel("uC (V)")
plt.savefig('essai.png')
#plt.show()



## II - Charge d un condensateur fit par Euler

# 7.
def lecture(nom):
    with open(nom, "r") as fichier :
        lignes = fichier.readlines() # on lit le fichier
    liste_t, liste_uC = [], [] # liste vides pour stocker les donnees
    for i in range(1, len(lignes)): # on ne prends pas le titre des colonnes (range(1...))
        lignes[i] = lignes[i].replace(',', '.') # on remplace les , par des . si besoin (separateur decimal)
        lignes[i] = lignes[i].replace(';', '    ') # on remplace les ; par des tab si besoin (separateur des colonnes)
        lignes[i] = lignes[i].split() # on separe les colonnes
        liste_t.append(float(lignes[i][0])) # on ajoute la premiere colonne a la liste_t
        liste_uC.append(float(lignes[i][1])) # on ajoute la seconde colonne a la liste_uC
    return liste_t, liste_uC # on renvoie les listes

# le nom represente le nom du fichier

# 8.
donnees = lecture('RC_120.txt') # on affecte les donnees du fichier a une variables qui contient deux listes
print(donnees)

experience_t = donnees[0] # les dates t correspondent a la premiere liste de donnees
experience_uC = donnees[1] # les tensions uC correspondent a la seconde liste de donnees

# 9.
plt.clf ()
plt.plot(experience_t , experience_uC, "+")
plt.savefig('experience.png')
#plt.show()

# 10.
E = 4 # 4 V
R = 1000 # 1 k (adapter avec 1050)
C = 10*10**-6 # 10 µF (adapter avec 11)
modele_t, modele_uC = euler(ED_charge, 0, 0, 0.120, 200) #uC0=0, t0=0, tf=120ms, n=200
plt.plot(modele_t, modele_uC, color='red')
plt.title ("Confrontation modele-experience")
plt.xlabel("Temps (ms)")
plt.ylabel("uC (V)")
plt.savefig('Fitt.png')
#plt.show()