"""
Created on Sat Nov 25 17:05:18 2023

@author: staron
"""

# On importe les bibliotèques utiles
# ----------------------------------
import numpy as np
from matplotlib import pyplot as plt
from scipy.optimize import curve_fit

# Données expérimentales
# ----------------------
texp = np.array([0.01,0.86,1.71,2.57,3.43,4.28,5.14,5.99,6.85,7.71,8.57,9.42,10.29,11.15, 12.01])
uexp = np.array([-2.73e-03,1.57,2.57,3.35,3.97,4.29,4.48,4.77,4.96,5.02,5.07,5.06,5.11,5.15,5.16])
plt.plot(texp,uexp,'+',label='points expérimentaux')

# On donne l'expression analytique de la fonction modèle
# ------------------------------------------------------
def fonction(t,E,tau):
    u=E*(1-np.exp(-t/tau))
    return u

# Recherche des meilleurs paramètres au sens des moindres carrés
# --------------------------------------------------------------
initial_values = [1,1]    # on propose des valeurs initiales des paramètres à l'algorithme d'ajustement 
best_values,covar = curve_fit(fonction,texp,uexp,p0=initial_values)      # el corazon de la machina ! 
t=np.linspace(0,12,1000)  # tableau de temps plus dense pour la représentation graphique du modèle  
modele = fonction(t,best_values[0],best_values[1])
plt.plot(t,modele,label="modélisation\nE = %.2f V\ntau = %.2f s"%(best_values[0],best_values[1]))
plt.title("Etude de la charge d'un condensateur")
plt.xlabel("t(s)"), plt.ylabel("u(V)")
plt.grid(), plt.legend()