import numpy as np
import matplotlib.pyplot as plt

# Valeurs mesurées des grandeurs x, y et w
x_m=5e-3 # [thiosulfate] en mol/L
y_m=10 # volume équivalent en mL
w_m=50 # volume de la solution dosée en mL

# Précision/tolérance Delta sur les mesures des grandeurs x, y et w
Deltax=5e-6 # d'après CS sur [thiosulfate] en mol/L
Deltay=0.03 # d'après les informations inscrites sur la burette
Deltaw=0.02 # d'après les informations inscrites sur la pipette jaugée

# Grandeur calculée à partir de x, y et w
def z(x,y,w):
    return (x*y/(4*w))
z_exp=z(x_m,y_m,w_m)                  # valeur de la grandeur z déduite de l'expérience


# Nombre de simulations à effectuer pour déterminer l'incertitude type sur z 
N = 1000
# Création d'une liste qui contiendra les résultats des tirages aléatoires
Z = []
# Calculs de la grandeur issus de tirages aléatoires
for i in range(N):
    xi = np.random.uniform(x_m-Deltax,x_m+Deltax)
    yi = np.random.uniform(y_m-Deltay,y_m+Deltay)
    wi = np.random.uniform(w_m-Deltaw,w_m+Deltaw)
    Z.append(z(xi,yi,wi))

# Calcul et affichage moyenne et écart type
z_moy = np.average(Z)
z_ecartype = np.std(Z,ddof=1)
print("incertitude-type sur z u(z) =", z_ecartype)
print("valeur expérimentale z =",z_exp) 
print("valeur moyenne de z issue des tirages aléatoires z =",z_moy) 

# Représentation des valeurs obtenues dans un histogramme
plt.hist(Z,bins='rice')
plt.title('Résultat du tirage aléatoire')
plt.xlabel("z")
plt.show()