import numpy as np
import matplotlib.pyplot as plt

""" Données expérimentales (avec incertitudes-types) """
f=500   # Fréquence en Hz
omega=2*np.pi*f    # Pulsation en rad/s 

R=81.5   # Résistance R étalon en Ohm
uR=(0.008*R+0.3)/np.sqrt(3)  # Incertitude R en Ohm

r=20.9   # Résistance r de la bobine en Ohm
ur=(0.008*r+0.3)/np.sqrt(3)   # Incertitude r en Ohm

phi=-20.5   # Déphasage en degré
uphi=0.5/np.sqrt(3)   # Incertitude phi en degré

""" Algorithme de Monte-Carlo pour la propagation des incertitudes """

N=10000                    #Nombre de tirages simulés

L =np.zeros(N)              #Liste à remplir des valeurs calculées de l'inductance L

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
    Rk = np.random.uniform(R-uR*np.sqrt(3), R+uR*np.sqrt(3))
    rk=np.random.uniform(r-ur*np.sqrt(3), r+ur*np.sqrt(3))
    phik = np.random.uniform(phi-uphi*np.sqrt(3), phi+uphi*np.sqrt(3))    
    L[k]=-np.tan(phik*np.pi/180)*(Rk+rk)/omega        #Calcul de L en H


L_moy = np.mean(L)          #Calcul de la valeur moyenne
uL = np.std(L,ddof=1)       #Calcul de l'écart-type (ddof=1 pour correspondre à la définition de physique)

print('Inductance modélisée : ',L_moy, ' H')                  #Affichage des résultats
print('Incertitude-type u(L) : ',uL,' H')

plt.hist(L,range=(min(L),max(L)),bins = 'rice')  # rice permet d'optimiser la taille des bins
plt.title('Histogramme des tirages aléatoires de L')
plt.xlabel("L (H)")
plt.ylabel('Occurences')
plt.show()