# -*- coding: utf-8 -*-
"""
Created on Fri Jun 23 11:42:52 2023

@author: C. KAPOTA
"""
# 1- importation des bibliothèques et fonctions
import matplotlib.pyplot as plt
import numpy as np

# 2- conditions initiales et variables
C0=0.01 #mol/L
V0 = 10.0 #mL
CHCl = 0.005 #mol/L
t=[0.0,120.0,180.0,240.0,300.0,360.0,420.0]
Veq =[20.0,16.4,14.6,13.8,12.7,11.7,10.9]

#3- calcul de C
C=[]
for i in range(len(Veq)):
    C.append(CHCl*Veq[i]/V0)

#4- tracé de la courbe C=f(t)
plt.plot(t,C,'*r')
plt.xlabel('t (s)')
plt.ylabel('C (mol/L)')
plt.title('C=f(t)')
plt.grid() #parce que c'est plus joli
plt.show()

#3- calculs liés à la regression linéaire : 1/C=f(t)
invC=[] #invC correspond à l'inverse de C = 1/C
for i in range(len(C)):
    invC.append(1/C[i])
# modélisation invC=f(t) par un polynome de degré 1 grâce à la fo,nction polyfit
p=np.polyfit(t,invC,1) # retourne un array de 2 termes correspondant à [pente, oo]
# calcul des résidus
res=[]
for i in range(len(invC)):
    res.append(invC[i]-np.polyval(p,t[i]))

#4-Tracé la droite de regression linéaire et les points expérimentaux 
plt.plot(t,invC,'+b')
plt.plot(t,np.polyval(p,t),'--r')
plt.xlabel('t (s)')
plt.ylabel('1/C (L/mol)')
plt.title('1/C=f(t)')
plt.grid() #parce que c'est plus joli
plt.show()

#4- Tracé les résidus
plt.plot(t,res,'+b')
plt.xlabel('t (s)')
plt.ylabel('résidu 1/C (L/mol)')
plt.title('résidu=f(t)')
plt.axhline()
plt.grid() #parce que c'est plus joli
plt.show()

#4- affichage de la valeur de k, puisque le modèle est validé
print('k={:.2e} s.L/mol'.format(p[0])) #polyfit renvoie 1 array dont la pente est le 1ier terme cad p[0]
