VISUAL BASIC & EXCEL

TP 10

Planche de Galton


1. Solutions des exercices du TP 9

Voici une solution possible :

'Chasse au trésor
'TP 10 ICES Année 2000

Dim N

Sub Initialisation()
    Range("A1:P20").ClearContents
    Range("A1:J10").Clear
    Randomize
    For i = 1 To 6
        Do
            L = Int(Rnd * 10) + 1
            C = Int(Rnd * 10) + 1
        Loop While Cells(L, C) = " "
        Cells(L, C) = " "
    Next
    Cells(1, 11) = "Ligne"
    Cells(1, 12) = "Colonne"
    Cells(1, 13) = "Nord"
    Cells(1, 14) = "Sud"
    Cells(1, 15) = "Est"
    Cells(1, 16) = "Ouest"
    N = 1
End Sub

Sub Jeu()
    N = N + 1
    L = ActiveCell.Row
    C = ActiveCell.Column
    Cells(N, 11) = L
    Cells(N, 12) = C
    Cells(N, 13) = Nord(L)
    Cells(N, 14) = Sud(L)
    Cells(N, 15) = Est(C)
    Cells(N, 16) = Ouest(C)
    If Cells(L, C) = " " Then
        Cells(L, C).Interior.ColorIndex = 3
    Else
        Cells(L, C).Interior.ColorIndex = 4
    End If
    'on peut, pour simplifier la tâche du joueur, colorier en vert
    '   : toute la ligne si Nord(L)+Sud(L)=6
    '   : ou toute la colonne si Ouest(C)+Est(C)=6
    'If Nord(L) + Sud(L) = 6 Then Range(Cells(L, 1), Cells(L, 10)).Interior.ColorIndex = 4
    'If Est(C) + Ouest(C) = 6 Then Range(Cells(1, C), Cells(10, C)).Interior.ColorIndex = 4
End Sub

Function Nord(L)
    r = 0
    For y = 1 To L - 1      'y désigne ici le n° de ligne
        For x = 1 To 10     'x désigne ici le n° de colonne
            If Cells(y, x) = " " Then r = r + 1
        Next x
    Next y
    Nord = r
End Function

Function Sud(L)
    r = 0
    For y = L + 1 To 10
        For x = 1 To 10
            If Cells(y, x) = " " Then r = r + 1
        Next x
    Next y
    Sud = r
End Function

Function Est(C)
    r = 0
    For x = C + 1 To 10
        For y = 1 To 10
           If Cells(y, x) = " " Then r = r + 1
        Next y
    Next x
    Est = r
End Function

Function Ouest(C)
    r = 0
    For x = 1 To C - 1
        For y = 1 To 10
            If Cells(y, x) = " " Then r = r + 1
        Next y
    Next x
    Ouest = r
End Function

Sub Abandon()
    For L = 1 To 10
        For C = 1 To 10
            If Cells(L, C) = " " Then Cells(L, C) = "x"
        Next C
    Next L
End Sub
2. Planche de Galton

2.1. Principe de la planche de Galton

Galton (1822-1911) était le cousin de Darwin et voulait justifier la transmission des capacités intellectuelles par l'hérédité pour permettre l'amélioration de l'espèce humaine. Son point de départ était le paradoxe suivant : comment expliquer qu'on observe à chaque génération une dispersion des tailles, qu'à celle des parents devra s'ajouter celle des enfants et, qu'en même temps la taille des individus d'une population et la dispersion par rapport à chaque moyenne reste constante quand les générations se succèdent ? .
Pour comprendre le phénomène, Galton réalisa une expérience à l'aide d'un plan incliné sur lequel il planta des clous disposés en quinconce. En faisant tomber un grand nombre de billes, en haut du plan incliné, on observe une répartition à l'arrivée qui suit une loi binomiale. Cette loi peut être approchée (théorème de la limite centrale) par la loi normale ou loi de Gauss.

Voici 2 adresses internet (parmi d'autres) qui donnent des complément d'information. La première de ces adresses contient en particulier une simulation de l'expérience écrite en java :

http://www-sop.inria.fr/mefisto/java/tutorial1/node11.html
http://www.seti-quebec.org/chronique/simon/sem4/rouge.htm

On peut également voir cette expérience à la Cité des sciences de la Vilette à Paris. Le stand montrant la planche de Galton est celui qui attire le plus de visiteurs :


2.2. Simulation de la planche de Galton sur Excel

La planche de Galton sera la feuille de calcul. Les clous seront remplacés par des cellules noires disposées en quinconce comme ci-contre.

Le nombre de rangées de cellules noires sera choisi par l'utilisateur, ainsi que le nombre de billes à lancer.

Un histogramme permettra de montrer les fréquences obtenues pour chacune des colonnes réceptrices ainsi que les probabilités théoriques.

Voici comment peut se précenter la feuille de calcul une fois terminée :

2.3. Initialisation

Il faut d'abord régler manuellement les largeurs et hauteurs des cellules comme ci-dessus et regrouper par 2 les cellules des lignes 22, 23 et 24.

De même, il faut remplir manuellement les cellules V1 et V2 ainsi que les cellules X1 et X2.

La procédure Initialisation va permettre de mettre en place les " clous " (cellules noires) et d'effacer les données des lancers précédents.

Voici l'algorithme qui permet de faire cette initialisation :

Début Initialisation
	Effacer la plage de cellules A1 à U21
	NombreRangées <— Cellule X1		'NombreRangées doit être une variable globale
	NombreBilles <— cellule X2			'NombreBilles doit être aussi une var. globale
	Pour L <— 1 à NombreRangées
		Pour C <— NombreRangées+2-L à NombreRangées+1+L par pas de 2
			Colorier l'intérieur de la cellule(2L, C) en noir
		FinPour
	FinPour
	Effacer le contenu (pas le format) de la plage de cellules A22 à V25
	Initialiser le générateurs de nombres aléatoires
Fin Initialisation

2.4. Procédure Lancer

Il s'agit de la procédure principale qui est associée au bouton " lancer les billes ". Les billes seront lâchées une à une et seront visualisées par une brève coloration en rouge de chacune des cellules traversées.

L'algorithme de cette procédure est le suivant :

Début LancerLesBilles
	Initialisation
	Pour bille <— 1 à NombreBilles
		C <— NombreRangées+1		'correspond à la colonne du milieu de la planche
		Pour L <— 1 à NombreRangées
			Mettre brièvement la cellule (2L-1,C) en rouge
			X <— Nombre aléatoire compris entre 0 et 1
			Si X<0.5 alors
					C <— C-1			'déplacement de la bille vers la gauche
					Sinon
					C <— C+1			'déplacement de la bille vers la droite
			FinSi
			Mettre brièvement la cellule (2L-1,C) en rouge			
			Mettre brièvement la cellule (2L,C) en rouge
			Mettre brièvement la cellule (2L+1,C) en rouge
		FinPour
		Cellule(22,C) <— cellule(22,C)+1			'nombre de billes tombées dans C
		Cellule(23,C) <— Cellule(23,C)/bille	'fréquence des billes tombées en C
	FinPour
	Pour C <— 0 à NombreRangées
		Cellule(24,2C+1)( probabilité que la boule tombre dans la colonne C
		Si Cellule(23,2C+1) est vide alors Cellule(23,2C+1) <— 0
		Cellule(25,2C+1) <— C
	FinPour
Fin LancerLesBilles

Cette procédure fait appel plusieurs fois à la même action appliquée sur des cellulles différentes Mettre brièvement la cellule (L,C) en rouge. Voici comment on peut réaliser cette procédure :

Sub Allume(Ligne, Colonne)
    Cells(Ligne, Colonne).Interior.ColorIndex = 3
    'j = 0                      pour ralentir la trajectoire de la bille
    'Do While j < 100000
    '    j = j + 1
    'Loop
    Cells(Ligne, Colonne).Interior.ColorIndex = 0
End Sub

Enfin, la probabilité que la boule tombe dans la colonne C suit la loi binomiale B(NombreRangées, 0.5). On peut l'obtenir facilement :

Function Prob(C)
    r = 1
    n = C
    Do While n > 0
        r = r * (NombreRangées + 1 - n) / n
        n = n - 1
    Loop
    r = r * 0.5 ^ C * 0.5 ^ (NombreRangées - C)
    Prob = r
End Function

2.5. Graphique

Il suffit de sélectionner la zone de données A23 à V25 et de bien construire le graphique en fonction des indications fournies par l'assistant graphique.


3. Solution du TP 10

Comme il s'agit du dernier TP de l'année, on trouvera ci-dessous la solution complète du problème de la planche de Galton :

'Planche de Galton
'TP 10 ICES 2002


Dim NombreBilles, NombreRangées As Integer

Sub Initialisation()
    Range(Cells(1, 1), Cells(21, 21)).Clear  '10 rangées maximum
    NombreRangées = Cells(1, 24)
    If (NombreRangées < 1) Or (NombresRangées > 10) Then
        NombreRangées = 10
        Cells(1, 23) = 10
    End If
    NombreBilles = Cells(2, 24)
    For L = 1 To NombreRangées
        For C = NombreRangées + 2 - L To NombreRangées + 1 + L Step 2
            Cells(2 * L, C).Interior.ColorIndex = 1
        Next C
    Next L
    Range(Cells(22, 1), Cells(25, 22)).ClearContents
    Randomize
End Sub

Sub Allume(Ligne, Colonne)
    Cells(Ligne, Colonne).Interior.ColorIndex = 3
    'j = 0                      pour ralentir la trajectoire de la bille
    'Do While j < 100000
    '    j = j + 1
    'Loop
    Cells(Ligne, Colonne).Interior.ColorIndex = 0
End Sub

Function Prob(C)
    r = 1
    n = C
    Do While n > 0
        r = r * (NombreRangées + 1 - n) / n
        n = n - 1
    Loop
    r = r * 0.5 ^ C * 0.5 ^ (NombreRangées - C)
    Prob = r
End Function

Sub Lancer()
    Initialisation
    For bille = 1 To NombreBilles
        C = NombreRangées + 1
        For L = 1 To NombreRangées
            Allume 2 * L - 1, C
            If Rnd > 0.5 Then C = C + 1 Else C = C - 1
            Allume 2 * L - 1, C
            Allume 2 * L, C
            Allume 2 * L + 1, C
        Next L
        Cells(22, C) = Cells(22, C) + 1     'nombre de billes tombées dans la colonne C
        Cells(23, C) = Cells(22, C) / bille 'fréquence des billes de la colonne C
    Next bille
    For C = 0 To NombreRangées
        Cells(24, 2 * C + 1) = Prob(C)
        Cells(25, 2 * C + 1) = C
        If Cells(23, 2 * C + 1) = "" Then Cells(23, 2 * C + 1) = 0
    Next
End Sub

<< TP précédent

Retour à la liste des TP