Revenir
Revenir

Simulation de la planche de Galton

La planche de Galton est un dispositif inventé par Sir Francis Galton : des clous sont plantés sur la...

Sommaire

Présentation et activité complètePrésentation de l'activitéIllustration de la planche de GaltonSimulation de la planche de GaltonActivité CAPYTALE : simulation de la planche de Galton
Rappels nécessaires pour l'activitéQuelques rappels : librairie randomQuelques rappels sur les listesExercice d'application
Simulation de la planche de GaltonSimulation d'une variable aléatoire suivant une loi de Bernoulli de paramètre pTrajectoire d'une billeSimulation du lancer de n billes
Comparaison avec la théorie

Présentation et activité complète

Présentation de l'activité

La planche de Galton est un dispositif inventé par Sir Francis Galton : des clous sont plantés sur la partie supérieure d'une planche, de telle sorte qu'une bille lâchée sur cette planche passe soit à droite, soit à gauche pour chaque rangée de clous. Dans la partie inférieure, les billes sont rassemblées en fonction du nombre de passages à gauche et de passages à droite qu'elles onteffectués.
Dans cette activité, on se propose de simuler cette expérience.

Illustration de la planche de Galton

Simulation de la planche de Galton

Activité CAPYTALE : simulation de la planche de Galton


Rappels nécessaires pour l'activité

Quelques rappels : librairie random

Pour générer des nombres au hasard en Python, on utilise la librairierandom. Parmi les fonctions intégrées à cette librairie, on utilisera notamment :
  • random() qui permet de générer un nombre uniformément au hasard entre 0 et 1;
  • randint(a,b)qui permet de générer un nombre entier compris entre a et b inclus.
On pourra utiliser le programme suivant pour étudier le comportement de ces deux fonctions.
# On importe les fonctions randint et random de la librairie random.
from random import randint, random
# On génère et affiche un nombre au hasard entre 1 et 100.
a = randint(1,100)
print("a vaut : ", a)
# On peut réitérer le procédé
b = randint(1,100)
print("b vaut : ", b)
# La fonction random() permet quant à elle de générer un nombre entre 0 et 1.
c = random()
print("c vaut : ", c)

Quelques rappels sur les listes

Génération d'une liste
EnPython, une liste est une collection d'objets séparés par des virgules.
Une liste est délimitée par des crochets.
L = [1, 3, 5, 8]
Pour ajouter un élémenta dans une listeLen Python, onutiliseral'instruction L.append(a).
L = [2, 7, 10]
L.append(14)
print(L)
>>> [2, 7, 10, 14]
Il est possible d'ajouter plusieurs éléments à une liste en utilisant une boucle `for`.
# On initialise une liste vide L
L = []
# Pour i allant de 0 à 5, on ajoute à la liste la valeur de i^2
for i in range(5):
    L.append(i**2)
print(L)
>>> [0, 1, 4, 9, 16]
Une liste peut également être générée par compréhension : la boucle for est directement intégrée à la liste.
Il s'agit d'une syntaxe proche du langage mathématique : la liste L est la liste des i^2 pour i allant de 0 à 5.
L = [i**2 for i in range(5)]
print(L)
>>> [0, 1, 4, 9, 16]
Modification des éléments d'une liste
Il est possible de modifier les éléments d'une liste à l'aide de la position de l'élément à modifier.Attention, on commence à compter les positions dans une liste à partir de 0 !
Par exemple, on considère la liste suivante :
L = [13, 21, 34, 55, 89]
On exécute alors la commande :
L[2] = 42
Cette instruction modifiera l'élément d'indice 2 (qui a la valeur 34) et lui assignera la valeur 42.
print(L)
>>> [13, 21, 42, 55, 89]
Plutôt que d'assigner une nouvelle valeur directement, il est également possible d'appliquer une opération. On peut par exemple ajouter 7 à l'élément d'indice 3 de la liste L comme suit.
L[3] = L[3] + 7
print(L)
>>> [13, 21, 42, 62, 89]

Exercice d'application

En utilisant les notions revues précédemment, générer une liste de taille 10, chaque élément de la liste étant unnombre entier choisi au hasard entre 1 et 6.

Simulation de la planche de Galton

Simulation d'une variable aléatoire suivant une loi de Bernoulli de paramètre p

Lorsqu'une bille lancée sur une planche de Galton rencontre un clou, celle-ci a une probabilité 
ppp
 de passer à droite de ce clou et une probabilité 
1−p1 - p1−p
 de passer à gauche.
Cette expérience à deux issues est donc une expérience de Bernoulli. Pour la modéliser, on  utilise une fonctionbernoulliqui prendra en argument un réel
ppp
 entre 0 et 1 et qui renverra 0 si la bille passe à gauche et 1 si la bille passe à droite.
Compléter la fonction suivante qui permet de simuler une variable aléatoire suivant une loi de Bernoulli de paramètre p.
from random import random
def bernoulli(p) :
    # On génère un nombre au hasard entre 0 et 1. On le stocke dans une variable a.
    a = random()
    # Si ce nombre est inférieur ou égal à p, on renvoie 1. Sinon, on renvoie 0.
    if ... :
        return ...
    else :
        return ...

Trajectoire d'une bille

On note
hhh
 la hauteur de la planche de Galton, c'est-à-dire le nombre de rangées de clous que les billes rencontreront avant d'atteindre les compartiments en bas de la planche.
Pour simuler la trajectoire de la bille, on construit alors une liste de
hhh
 nombres générés aléatoirement selon une loi de Bernoulli de paramètre 
ppp
.
Exercice 1
Compléter la fonction suivante qui permet de simuler la trajectoire d'une bille lancée sur la planche de Galton. La liste renvoyée pourra avoir été générée par ajouts successifs avec la méthode append ou par compréhension.
def trajectoire(h, p):
    """
    Renvoie une liste de 0 et de 1 correspondant à la trajectoire d'une bille lancée sur la planche de Galton de hauteur h.
    Les 0 et 1 sont générés en utilisant une loi de Bernoulli de paramètre 
ppp
."""
    # A compléter
trajectoire(10, 0.5)
On suppose par la suite que les compartiments d'arrivée en bas de la planche de Galton sont numérotés de 0 à
hhh
 (il y en a donc 
h+1h+1h+1
 au total !).
Exercice 2
On suppose que la trajectoire d'une bille est donnée par [0, 1, 0, 1, 0, 0, 1].
  • Quelle est la hauteur de la planche de Galton ?
  • Quel est le numéro du compartiment dans lequel la bille est arrivée ?
  • Reprendre les questions précédentes si la trajectoire de la bille est donnée par la liste [1, 0, 1, 1, 1, 0].
  • D'une manière générale, si l'on se donne une trajectoire d'une bille, comment peut-on déterminer le compartiment dans lequel elle finit sa course ?

Simulation du lancer de n billes

On note
hhh
 la hauteur de la planche de Galton, 
ppp
la probabilité qu'une bille a de passer à droite d'un clou à chaque rangée et 
nnn
le nombre de billes lancées sur la planche.
Compléter la fonction suivante qui renverra une liste detaille \(h+1\) correspondant aux compartiments situés en bas de la planche de Galton. Le nombre à la position 
iii
de cette liste correspondra alors au nombre de billes qui sont arrivées dans le compartiment numérotée
iii
.
Remarque
Ne pas hésiter à tester le programme en changeant les valeurs de 
hhh
, 
ppp
 et 
nnn
.
def somme(L):
    """renvoie la somme des éléments de la liste L
    Cette fonction pourra être utilisée dans la fonction suivante"""
    total = 0
    for x in L :
        total = total + x
    return total
def galton(h = 10, p = 0.5, n = 1000):
    # A compléter
galton(h = 10, p = 0.5, n = 1000)
On peut alors visualiser le résultat d'une simulation à l'aide du programme suivant (modifier les paramètres pour observer différents cas de figure).
Les ordonnées indiquent les fréquences d'apparition des billes dans les compartiments en abscisse.
from matplotlib.pyplot import *
def visualisation(h, p, n):
    bar(range(h+1),[x/n for x in galton(h, p, n)])
    show()
    close()
visualisation(10, 0.5, 1000)

Comparaison avec la théorie

On considère une planche de Galton de hauteur 
hhh
. On suppose qu'à chaque rangée, la probabilité pour qu'une bille passe à droite du clou vaut
ppp
. On note alors \(X\) la variable aléatoire qui donne le compartiment d'arrivée d'une bille à l'issue d'un lancer sur cette planche.
1.Quelle est la loi de la variable aléatoire 
XXX
? Quelle est alors la probabilité que la billearrive dans le compartiment 
kkk
à l'issue de sa traversée de la planche ?
2.Compléter la fonction suivante qui permet de calculer
P(X=k)P(X=k)P(X=k)
(utiliser la formule du cours).
Pour calculer la factorielle d'un entier, on utilise la fonction factorial du module math de Python.
from math import factorial
def proba(k, h, p):
    # A compléter
Le programme suivant permet alors de comparer visuellement la distribution empirique et la distribution théorique des billes.
from matplotlib.pyplot import *
def visualisation(h, p, n):
    subplot(1,2,1)
    bar(range(h+1),[x/n for x in galton(h, p, n)])
    title('Distribution empirique')
    subplot(1,2,2)
    bar(range(h+1),[proba(k, h, p) for k in range(h+1)])
    title('Distribution théorique')
    show()
    close()
visualisation(20, 0.7, 1000)