mathématiques approfondies (ECG 1re année) · Chapitre 11 · Exercice
Simuler une loi de Poisson
Informatique et algorithmique · Simuler une loi, estimer une probabilité · niveau 2
Énoncé
Simuler réalisations de et superposer l'histogramme des fréquences aux probabilités théoriques.
Corrigé
import numpy.random as rd
import matplotlib.pyplot as plt
from math import exp, factorial
def poisson(lam):
# methode de Knuth : on multiplie des uniformes jusqu'a passer sous e^-lam
seuil, produit, k = exp(-lam), rd.random(), 0
while produit > seuil:
produit = produit * rd.random()
k = k + 1
return k
N, lam = 100000, 4
effectifs = [0] * 20
for _ in range(N):
k = poisson(lam)
if k < 20:
effectifs[k] += 1
freq = [e / N for e in effectifs]
theo = [exp(-lam) * lam**k / factorial(k) for k in range(20)]
plt.bar([k - 0.2 for k in range(20)], freq, width=0.4, label="simulees")
plt.bar([k + 0.2 for k in range(20)], theo, width=0.4, label="theoriques")
plt.xlabel("k"); plt.legend(); plt.show()
Ce qu'on voit : deux profils qui se superposent, avec deux barres maximales à égalité en et (toutes deux à ) — car pour entier, exactement.
L'écart attendu : pour . Les différences constatées sont de cet ordre.
Pourquoi la méthode de Knuth fonctionne : le produit de variables uniformes descend sous après un nombre d'étapes qui suit précisément une loi de Poisson. On ne demande jamais à l'élève de la démontrer, mais il faut savoir qu'aucune simulation « naïve » n'est possible : le support est infini.