import numpy as np
import matplotlib.pyplot as plt

""" Données expérimentales (avec incertitudes-types) """
a=1.6655e-6 # Pas du réseau en m

az0=4.05     # Azimut de l'ordre 0 en degrés
uaz0=0.03    # Incertitude-type sur l'azimut d'ordre 0 en degrés

az=36.75    # Azimut de l'ordre 2 au min de déviation en degrés
uaz=0.03    # Incertitude-type sur l'azimut au min de déviation en degrés

""" Algorithme de Monte-Carlo pour la propagation des incertitudes """

N=10000                    #Nombre de tirages simulés

lambd =np.zeros(N)              #Liste à remplir des valeurs calculées de la longueur d'onde lambd

for k in range(N) : #Procédure de tirage
    # on choisit une distribution uniforme (rectangulaire) donc la fonction de 
    # tirage aléatoire à choisir est np.random.uniform
    # Rq : le np.sqrt(3) permet de passer de l'incertitude-type à la loi de probabilité
    # Si on avait choisi une distribution normale, 
    # il aurait fallu choisir np.random.normal
    az0k = np.random.uniform(az0-uaz0*np.sqrt(3), az0+uaz0*np.sqrt(3))
    azk=np.random.uniform(az-uaz*np.sqrt(3), az+uaz*np.sqrt(3))   
    lambd[k]=a*np.sin((azk-az0k)*np.pi/(2*180))        #Calcul de lambd en m


lambd_moy = np.mean(lambd)          #Calcul de la valeur moyenne
ulambd = np.std(lambd,ddof=1)       #Calcul de l'écart-type (ddof=1 pour correspondre à la définition de physique)

print('Longueur d\'onde : ',lambd_moy, ' m')                  #Affichage des résultats
print('Incertitude-type u(lambd) : ',ulambd,' m')

plt.hist(lambd,range=(min(lambd),max(lambd)),bins = 'rice')  # rice permet d'optimiser la taille des bins
plt.title('Histogramme des tirages aléatoires des longueurs d\'onde')
plt.xlabel("lambda (m)")
plt.ylabel('Occurences')
plt.show()