import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

""" chargement du tableau de mesures: les colonnes sont séparées par
	le point virgule, le séparateur de décimale est le point. On saute
	les deux premières lignes qui contiennent les titres et unités.
	Attention, la dernière ligne ne doit pas être vide! """
xdata , ydata = np.loadtxt("mesures.txt", delimiter=';', skiprows=2, unpack=True, encoding="utf-8")

""" courbe théorique en fonction de t et les paramètres à ajuster"""
def temperature(t, T_0,k,T_ext):
  return (T_0-T_ext) * np.exp(-k*t) + T_ext

""" ajustement de la courbe expérimentale avec une courbe théorique
    p0 contient des valeurs initiales grossières pour les paramètres"""
p_optimise, pcov = curve_fit(temperature,xdata,ydata,p0=(40.0, 0.3, 20))

""" résultats pour les paramètres ajustés"""
T_0 = p_optimise[0]
k = p_optimise[1]
T_ext = p_optimise[2]
print('To   = '+str(T_0)+' °C')
print('k    = '+str(k)+' /s')
print('Text = '+str(T_ext)+' °C')

""" calcul de la courbe théorique avec la fonction et 
	les paramètres ajustés"""
xaxis = np.linspace(0,200,200) 
curve_y = temperature(xaxis,T_0,k,T_ext)

"""tracé de la mesure et de la modélisation pour comparaison"""
plt.plot(xdata,ydata,'+', markersize=5)
plt.plot(xaxis,curve_y,'-')
plt.xlim(0,150)
plt.title("Modélisation de la courbe de refroidissement du capteur")
plt.xlabel("t /s")
plt.ylabel("T / ${}^oC$")
plt.show()
