1def moyenne_et_variance(liste):
2’’’Calcul de la moyenne <u> = Sum u / N et de la variance <(u-<u>)^2>
3d’une liste de nombres en une seule passe. Renvoie un doublet
4(moyenne,variance).’’’
5somme,somme_carres = 0.0,0.0 # Initialisation des mémoires
6for uin liste: # Itérer sur tous les éléments
7somme += u# Stocker la somme
8somme_carres += u**2 # et la somme des carrés
9N=len(liste) # Nombre d’éléments de la liste
10 moyenne =somme /N# Calcul de la moyenne: somme/N
11 # Pour le calcul de la variance: On utilise le fait que
12 # <(u-<u>)^2> = <(u^2 - 2*u*<u> + <u>^2)>
13 # = <u^2> - 2*<u>*<u> + <u>^2
14 # = <u^2> - <u>^2
15 variance =somme_carres /N-moyenne**2
16 return moyenne,variance
17
18 # Définition de la Gaussienne et normalisation
19 gauss =lambda x: np.exp(-(x-10)**2/(2*3**2))
20
21 xmin,xmax,nb_points = 0,20,500
22
23 # Attention à bien calculer la normalisation "à part" pour éviter tout
24 # recalcul lors de l’appel à gauss_normalisee(x) !
25 gnormalisation =integration_trapeze(gauss,xmin,xmax,nb_points)
26 gauss_normalisee =lambda x: gauss(x)/gnormalisation
27
28 import scipy.integrate
29
30 def tirage_gauss(n,n2=False):
31 ’’’Tirage d’une distribution de n notes suivant une gaussienne. On va
32 utiliser l’interpolation pour aller plus vite ainsi que cumtrapz pour
33 l’échantillonnage de la primitive. Pour représenter facilement un
34 sous-ensemble des notes tirées, on introduit le valeur n2 qui doit être <n
35 pour que cela fonctionne.’’’
36 # Préparation de la primitive
37 X=np.linspace(xmin,xmax,nb_points)
38 FX=scipy.integrate.cumtrapz([gauss_normalisee(x) for xin X],X,initial=0)
39 # La fonction réciproque est donnée directement par interpolation
40 antecedent =lambda x: float(scipy.interpolate.interp1d(FX,X)(x))
41 # Boucle sur les évènements
42 evenements =[]
43 for iin range(n):
44 nb =random.random() # Tirage aléatoire
45 evenements.append(antecedent(nb)) # Recherche de l’antécédent
46 print("Vérification moyenne et variance pour n={}:".format(n))
47 print(moyenne_et_variance(evenements))