# # Un petit peu de trucs rigolos sur les erreurs de mesures # # Vincent Legat - 2018 # Ecole Polytechnique de Louvain # from numpy import * from numpy.random import randn import matplotlib from matplotlib import pyplot as plt matplotlib.rcParams['toolbar'] = 'None' # ============================= clone of histc MATLAB function ============ def histc(r,bin): map = digitize(r,bin) n = zeros(len(bin)) for i in map: n[i-1] += 1 return n # ============================= mainProgram =============================== # # -1- Observer qu'en répétant une expérience indépendante et # et en effectuant la moyenne, on obtient une estimation plus précise :-) # # Créer un ensemble de 800 mesures de moyenne 500 # et dont l'écart type est 15 # r = 500 + 15*randn(800) # plt.figure() # plt.hist(r,100,facecolor='r') plt.figure() n = histc(r,arange(450,550)) plt.bar(arange(len(n)),n,color='g') plt.bar(arange(0,34),n[0:34],color='r') plt.bar(arange(66,100),n[66:100],color='r') plt.axis('off') print('-1- Effectuons 800 mesures virtuelles avec un écart de 15 :-)') print(' Moyenne : %14.7f ' % mean(r)) print(' Ecart type de la moyenne : %14.7f ' % (15/sqrt(800)) ) # # -2- Observer qu'en prenant un ensemble de 800 moyennes de 10 mesures, # on obtient encore un résultat encore plus précis... # # C'est logique, on fait 8000 mesures ! # r = zeros(800); for i in range(10): r = r + 500 + 15*randn(800) r = r/10 plt.figure() n = histc(r,arange(450,550)) plt.bar(arange(len(n)),n,color='g') plt.bar(arange(0,44),n[0:44],color='r') plt.bar(arange(56,100),n[56:100],color='r') plt.axis('off') print('-2- Effectuons 800 moyennes de 10 mesures virtuelles avec un écart de 15 :-)') print(' Moyenne des moyennes : %14.7f ' % mean(r)) print(' Ecart type de la moyenne : %14.7f ' % (15/sqrt(10)/sqrt(800)) ) # # -3- En déduire une technique pour obtenir la meilleure estimation # de la densité sur base d'une série de données expérimentales # # Comment calculer la meilleure estimation de n mesures # dont la précision est differente.... # s achant que variance(aX) = a^2 * variance(X) ? # # Vol = array([ 10, 8, 8, 10, 99]) ErrVol = array([ 5, 2, 5, 1, 2]) Mass = array([ 29.1,25.7,22.2,27.5,266.0]) ErrMass = array([ 0.1, 0.1, 0.1, 0.1, 0.1]) Rho = Mass / Vol ErrRho = (ErrMass * Vol + ErrVol * Mass)/ (Vol*Vol) VarRho = ErrRho*ErrRho plt.figure(); plt.errorbar(arange(len(Rho)),Rho,ErrRho, linestyle='',marker='o', markerfacecolor='blue',markeredgecolor='blue', color='red',capsize=5) plt.axis('off') coeff = 1 / (VarRho) coeff = coeff / sum(coeff) BestEstimate = coeff @ Rho VarBestEstimate = (coeff*coeff) @ VarRho EcartBestEstimate = sqrt(VarBestEstimate) print('-3- Effectuons la meilleure combili de mesures de précisions différentes :-)'); for i in range(len(Rho)): print(' Mesure %d et écart type : %14.7f (%9.7f)' % (i,Rho[i],sqrt(VarRho[i]))) print(' Meilleure estimation et écart type : %14.7f (%9.7f)' % (BestEstimate,EcartBestEstimate)) plt.show() # =========================================================================