#détermination de la distance focale d'une lentille par la méthode d'autocollimation et bessel


#Importation des bibliothèques------------------------------------------------
import numpy as np
import matplotlib.pyplot as plt


#méthode d'autocollimation
# A MODIFIER
x0=10 #mm position de l'ojet
xl=215 #↓mm position dela lentille

# Demi-largeur des intervalles des positions----------------------------------
# A MODIFIER
Deltax0=0.5 #mm
Deltaxl1=0.5#mm position de la lentile
Deltaxl2=1#mm mise au point
Deltaxl=np.sqrt(Deltaxl1**2+Deltaxl2**2)#demi intervalle équivalent pour la position de la lentielle

# Fonction permettant de calculer la distance focale image connaissant les positions de l'objet et de la lentille
def focalea(objet,lentille):
    return lentille-objet


# Nombre de simulations à effectuer
# A MODIFIER
N = 100000

# Simulation MC avec une distribution de probabilité uniforme------------------

# Tirage aléatoire d'une valeur de xo etxl
# dans les intervalles définis précédemment.
objet = np.random.uniform(x0-Deltax0,x0+Deltax0,N)
lentille = np.random.uniform(xl-Deltaxl,xl+Deltaxl,N)
# Création de la liste de valeurs de f' résultant
fpa=lentille-objet

# Tracé de l'histogramme permettant de visualiser
figure1=plt.figure()
# la distribution des valeurs de f'
plt.hist(fpa,bins = 'rice')
# Python utilise la règle de Rice pour trouver le nombre d'intervalles
# de l'histogramme, on peut modifier cette valeur, par exemple bins=15.
plt.title('Résultat du tirage aléatoire des focales après simulation autocollimation')
plt.xlabel("f' (cm)")
plt.show()

# Calcul et affichage de la valeur moyenne et de l'incertitude-type de f'------
fmoya = np.mean(fpa) # valeur moyenne des valeurs de f'
ufa = np.std(fpa,ddof=1) # écart-type de la distribution des valeurs de f'
# ddof = 1 permet de calculer l'écart-type de f' avec le facteur N - 1.

print("Valeur moyenne de f autocol' = {:.2f} mm".format(fmoya))
print("Incertitude-type de f autocol' = {:.2f} mm".format(ufa))
# L'instruction .2f indique un format avec deux décimales.
# L'instruction {}...".format(stdf) indique de remplacer la variable stdf
# dans l'accolade.


#méthode de Besssel
# A MODIFIER
x0=10 #mm position de l'ojet
xe=1210 #↓mm position del'écran
D=xe-x0#distance objet écran

x1=259#mm première position de la lentille
x2=961#mm deuxième position de la lentille
d=x2-x1#mm distance entre les deux position de la lentille

# Demi-largeur des intervalles des positions----------------------------------
# A MODIFIER
Deltax0=0.5 #mm objet
Deltaxe=0.5#mm écran
DeltaD=np.sqrt(Deltax0**2+Deltaxe**2)#demi intervalle équivalent pour D
Deltax1m=1 #mm demi intervalle mise au point pour x1
Deltax2m=1#mm demi intervalle mise au point pour x2
Deltax1=np.sqrt(Deltax0**2+Deltax1m**2)#demi intervalle équivalent pour x1
Deltax2=np.sqrt(Deltax0**2+Deltax2m**2)#demi intervalle équivalent pour x2
Deltad=np.sqrt(Deltax1**2+Deltax2**2)#demi intervalle équivalent pour d


# Nombre de simulations à effectuer
# A MODIFIER
N = 100000

# Simulation MC avec une distribution de probabilité uniforme------------------


# Tirage aléatoire d'une valeur de D et d
# dans les intervalles définis précédemment.
distoe = np.random.uniform(D-DeltaD,D+DeltaD,N)
distl = np.random.uniform(d-Deltad,d+Deltad,N)
# Création de la liste de valeurs de f' résultant
fpb=(distoe**2-distl**2)/(4*distoe)

# Tracé de l'histogramme permettant de visualiser
figure2=plt.figure()
# la distribution des valeurs de f'
plt.hist(fpb,bins = 'rice')
# Python utilise la règle de Rice pour trouver le nombre d'intervalles
# de l'histogramme, on peut modifier cette valeur, par exemple bins=15.
plt.title('Résultat du tirage aléatoire des focales après simulation, Bessel')
plt.xlabel("f' (cm)")
plt.show()

# Calcul et affichage de la valeur moyenne et de l'incertitude-type de f'------
fmoyb = np.mean(fpb) # valeur moyenne des valeurs de f'
ufb = np.std(fpb,ddof=1) # écart-type de la distribution des valeurs de f'
# ddof = 1 permet de calculer l'écart-type de f' avec le facteur N - 1.

print("Valeur moyenne de f bessel' = {:.2f} mm".format(fmoyb))
print("Incertitude-type de f bessel' = {:.2f} mm".format(ufb))
# L'instruction .2f indique un format avec deux décimales.
# L'instruction {}...".format(stdf) indique de remplacer la variable stdf
# dans l'accolade.


