#-----------------------------------------------------------------------
# Calcul d'incertitudes, loi normale, méthode Monte Carlo
#-----------------------------------------------------------------------

# Bibliothèques utilisées
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

# Constantes
pi = np.pi

# Paramètres modifiables
Nt = 100000 # nombre de tirages

#Definitions des fonctions
def gaussienne(x,x0,s) :
    """Définition de la fonction gaussienne"""
    return np.exp(-(x-x0)**2/(2*s**2)) / (s*np.sqrt(2*pi))

def moyenne(X) :
    """Renvoie la valeur moyenne d'une série de données"""
    sum = 0
    for x in X :
        sum += x
    return sum/len(X)

def std_dev(X) :
    """Renvoie l'écart type d'une série de données"""
    sum = 0
    moy = moyenne(X)
    for x in X :
        sum += (x - moy)**2
    return np.sqrt(sum/len(X))

#Tirages, calculs
# np.random.normal(m,s,N) renvoies un array de taille N dont la distribution est une gaussienne centrée sur m et d'écart type s
A = np.random.normal(2,0.1,Nt) # à changer
# B = np.random.normal() # à compléter
# C = np.random.normal() # à compléter
R = A # à changer

moy = moyenne(R) # np.mean(R) fonctionne aussi
sd = std_dev(R) # np.std(R, ddof=1) fonctionne aussi
print("Valeur moyenne : %2.4f"  %moy)
print("Ecart type : %2.7f"  %sd)

# Tracés
xmin = moy-5*sd
xmax = moy+5*sd
x = np.linspace(xmin,xmax,500)
plt.hist(R, bins=500, density=True) #density pour la "normalisation"
plt.plot(x,gaussienne(x,moy,sd), 'r')
plt.xlim(xmin,xmax)
plt.ylabel("Probabilité d'obtention")
plt.xlabel("")
plt.title("Loi de probabilité normale")

plt.show()
