Adloun

Simuler une loi de Poisson

Exercice · niveau 2 · mathématiques approfondies (ECG 1re année), chapitre 11 — Informatique et algorithmique · Simuler une loi, estimer une probabilité

É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.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.