## I Estimation de la fréquence en connaissant la période T=24.4 µs.
'''La précision de la mesure est estimée à Delta T = 0.1 µs'''

import numpy as np
import matplotlib.pyplot as plt
import numpy.random as rd

# Entrez la période
T = 24.4e-6 # s
# Entrez la précision sur la période
DeltaT = 0.1e-6 # s

# Entrez le nombre de simulations que vous voulez effectuer
N = 100000

# Simulation
T_MC = T + rd.uniform(-DeltaT, DeltaT, N)
f_MC = 1/T_MC


# Représentation de l'histogramme de f
plt.hist(f_MC, bins='rice')
plt.show()

# Calculs de la fréquence et de son incertitude
f = 1/T
f_moy = np.average(f_MC)
uf_MC = np.std(f_MC, ddof=1)


# Affichage des résultats
print("f =", f)
print('f_moy =', f_moy)     #choix alternatif
print('u(f) MC =', uf_MC)

## II Simulation d'une incertitude de type somme
''' calcul de la distance entre deux points mesurés (11.1 cm et 24.8 cm)
avec une précision de 0.5 cm.'''

import numpy as np
import matplotlib.pyplot as plt
import numpy.random as rd

# Positions de des points
A = 11.1 # cm
B = 19.5 # cm

# Entrez les précisions
DeltaA = 0.5 # cm
DeltaB = 0.5 # cm

# Entrez le nombre de simulation que vous voulez effectuer
N = 100000
A_MC = A + rd.uniform(-DeltaA, DeltaA, N)
B_MC = B + rd.uniform(-DeltaB, DeltaB, N)
Difference_MC = B_MC - A_MC

# Représentation de l'histogramme de la  différence
plt.hist(Difference_MC, bins='rice')
plt.show()

# Calculs de la différence et de son incertitude
Difference = B-A
Difference_moy = np.average(Difference_MC)
uDifference_MC = np.std(Difference_MC, ddof=1)


# Affichage des résultats
print("Difference =", Difference)
print('Difference_moy =', Difference_moy)     #choix alternatif
print('u(Difference) MC =', uDifference_MC)

## III Simulation d'une incertitude de type produit
'''' calcul de la célérité du son avec une fréquence f=40983 Hz
(u(f)= 94 Hz, estimée à partir de la mesure de période) et une
longueur d'onde λ = 0.840 cm (u(λ) = 0.041 cm).
Attention, cette fois c'est directement l'incertitude-type qui est donnée (car elle est déduite des calculs précédents). Si on suppose que la distribution de probabilité est uniforme, il faut remonter à la précision à l'aide du facteur $\sqrt{3}$. Pour ne pas avoir à faire cette hypothèse, cf l'exemple 4.
'''
import numpy as np
import matplotlib.pyplot as plt
import numpy.random as rd

# Mesure
f = 40983 # Hz
lambd = 0.00840 # m

# Entrez les incertitudes types et précisions
uf = 94 # Hz
ulambd = 0.00041 # m
Deltaf=uf*np.sqrt(3)
Deltalambd=ulambd*np.sqrt(3)


# Entrez le nombre de simulation que vous voulez effectuer
N = 100000
lambd_MC = lambd + rd.uniform(-Deltalambd, Deltalambd, N)
f_MC = f + rd.uniform(-Deltaf, Deltaf, N)
celerite_MC = lambd_MC*f_MC


# Représentation de l'histogramme de la  différence
plt.hist(celerite_MC, bins='rice')
plt.show()


# Calculs de la celerite et de son incertitude
celerite = lambd*f
celerite_moy = np.average(celerite_MC)
u_celerite = np.std(celerite_MC, ddof=1)


# Affichage des résultats
print("celerite =", celerite)
print('celerite_moy =', celerite_moy)     #choix alternatif
print('u(celerite) MC =', u_celerite)


## IV Estimation d'une distance focale image
''' en connaissant la position de l'objet OA = - 15 cm (précision de la mesure
Delta(OA)=0.5 cm et celle de l'image (OA') = 30 cm (précision de la
mesure (OA')=3 cm).'''

import numpy as np
import matplotlib.pyplot as plt
import numpy.random as rd

# Positions de l'objet et de l'image
OA = - 15 # cm objet
OAp = 30 # cm image

# Entrez les précisions
DeltaOA = 1 # cm objet
DeltaOAp = 3 # cm image


# Entrez le nombre de simulation que vous voulez effectuer
N = 100000
OA_MC = OA + rd.uniform(-DeltaOA, DeltaOA, N)
OAp_MC = OAp + rd.uniform(-DeltaOAp, DeltaOAp, N)
focale_MC = OA_MC*OAp_MC/(OA_MC-OAp_MC)


# Représentation de l'histogramme de la  différence
plt.hist(focale_MC, bins='rice')
plt.show()


# Calculs de la celerite et de son incertitude
focale = OA*OAp/(OA-OAp)
focale_moy = np.average(focale_MC)
u_focale = np.std(focale_MC, ddof=1)


# Affichage des résultats
print("focale =", focale)
print('focale_moy =', focale_moy)     #choix alternatif
print('u(focale) MC =', u_focale)
