

"""
Ce programme permet  d'illustrer la composition des incertitudes et  ainsi d'estimer la valeurs moyenne  de la célérité du son et son  incertitudes-type
à partir de la mesure de  la  fréquence  fe  , de  deltaf et de la vitese v et de leurs incertitudes : u_fe , u_deltaf , u_v
(NB  : la lecture  de la vitesse v du moteur pas à pas  est extrêmement précise : on l'évalue l'écart relatif  à 10-3  soit 0.1 % soit 0.1  mm/s pour une vitesse de quelques 10 mmm/s )
Les mesures des fréquences fe et deltaf  sont faites en utilisant un multimètre ou oscilloscope .
"""
"""
Estimation d'une incertitude-type par la méthode de Monte-Carlo
Capacité numérique disciplinaire : simuler, à l’aide d’un langage de programmation ou d’un tableur, un processus aléatoire – simulation de Monte-Carlo –
permettant de caractériser la variabilité de la valeur d’une grandeur composée.
1- Principe de la méthode Monte-Carlo
Le résultat d'une mesure correspond à l'ensemble des valeurs raisonnablement attribuables à la grandeur mesurée.

....Evaluation de type A : Lorsque la mesure est répétée plusieurs fois , l'expérimentateur obtient plusieurs valeurs  statistiques de la grandeur mesurée. L'incertitude-type est
l'écart-type de cet ensemble de valeurs divisé par racinne de N : nombre de mesures .

....Evaluation de type B : Lorsque l'expérience n'est pas répétée plusieurs fois ou la répétition conduit à la même valeur, il faut mettre en oeuvre une autre méthode pour évaluer l'incertitude-type. Dans
ce contexte, la méthode de Monte-Carlo consiste à simuler numériquement la répétition de l'expérience. L'écart-type de l'ensemble des valeurs obtenues lors de ces répétitions in silico fournit l'incertitude-type recherchée.
Fonctions pour réaliser le tirage au sort
2.La bibliothèque  numpy  est ici utilisée pour simuler un processus aléatoire ( numpy.random ).
Pour réaliser le tirage au sort :
Si l'on suppose que la valeur centrale de l'intervalle n'est pas plus probable que les valeurs latérales de l'intervalle, on peut utiliser la commande
numpy.random.uniform(borne_inf , borne_sup) .
Si l'on suppose que la valeur centrale de l'intervalle est plus probable que les valeurs latérales de l'intervalle, on peut utiliser la commande
numpy.random.triangular(borne_inf , centre ,  borne_sup) .
Si l'incertitude-type sur la grandeur est fournie/connue (rare), on peut utiliser la commande  numpy.random.normal(valeur centrale ,
incertitude-type) .
"""

import numpy as np         #bibliothèque numpy renommée np
import numpy.random as rd  #module numpy.random renommé rd

#mesures expérimentales
fe =40000      # frequence en Hz
v = ***  # !!! vitesse en mm/s  à compléter
deltaf = ***  # !!!!! deltaf en Hz à compléter

# incertitude type
u_fe = ***   # !!!!! incertitude de fe en hz à completer
u_v = ***    # !!! incertitude de v en mm/s à completer
u_deltaf = ***   # !!!! incertitude de deltaf en hz à compléter




N= 5000  #nombre de tirages aléatoires Monte-carlo
fe_MC = rd.triangular(fe -u_fe,fe,fe +u_fe,N)
v_MC  = rd.normal (v,u_v,N)
deltaf_MC = rd.normal (deltaf,u_deltaf,N)

# On calcule les N célérités c associés:
c_MC = 2*fe_MC*v_MC/deltaf_MC/1000 # on divise par 1000 car v en mm/s et pas en m/s

# on calcule la moyenne et l'écart type de c
c_moy = np.average(c_MC)

u_c = np.std(c_MC, ddof=1)

print("c=" ,c_moy, "+/-", u_c )  # Affichage des résultats: c et ecart type




