# -*- coding: utf-8 -*-
"""
Created on Fri Jun 23 12:25:04 2023

@author: cathe
"""

# 1- importation des bibliothèques et fonctions
import matplotlib.pyplot as plt
import numpy as np

# 2- conditions initiales et variables
VVeq=14.6 #mL
CHCl=0.005 #mol/L
V0=10.0 #mL
D_Veq=0.05 # mL, correspond à la tolérence ou à la demie étendue
ecart_type_CHCl=0.01*CHCl # %age associé à une loi normale
D_V0=0.1 #mL,correspond à la tolérence ou à la demie étendue
N= 10000 # nombre de tirages alléatoires pour la méthode MC

# 3- génération d'une liste de N valeurs de Veq, CHCl et V0 par tirage alléatoire
VVeq_MC=VVeq + D_Veq*np.random.uniform(-1,1,N)
CHCl_MC=np.random.normal(CHCl,ecart_type_CHCl,N)
V0_MC=V0 + D_V0*np.random.uniform(-1,1,N)

#3- Calcul des N valeurs de 1/C, tracé de l'histogramme, puis la myenne et l'incertitude
invCC_MC=[]
for i in range(len(VVeq_MC)):
    invCC_MC.append(1/(((CHCl_MC[i]*VVeq_MC[i])/V0_MC[i])))

#3- calcul de l'écart type 
#la distribution semblant normale (gaussienne), on utilise les formules toutes prêtes
moy=np.mean(invCC_MC)
u_invCCeq = np.std(invCC_MC,ddof=1)

#4- affichage des résultats
print('la valeur moyenne de 1/Ceq à t=180s vaut {:.1f} L/mol'.format(moy))
print('l invcertitude type vaut u(1/Ceq)={:.1f} L/mol'.format(u_invCCeq))

#4- tracé de l'histogramme
plt.hist(invCC_MC,bins='rice')
plt.xlabel('1/Ceq (L/mol)')
plt.ylabel('N')
plt.title('distribution de 1/Ceq')
plt.text(132,600,'u_invCCeq={:.1f} L/mol'.format(u_invCCeq))