Principes de simulation

Introduction
Tirage de nombres aléatoires
Confection d'échantillons
Simulation suivant une loi de probabilité

Tests

 

Introduction

Imaginons de calculer le nombre p en choisissant des points au hasard dans un carré de côté 2a. Dans ce carré est inscrit le cercle de rayon a. On compte le nombre total N de points et le nombre n de points situés dans le disque. Si l'on admet que tous les points du carré ont la même probabilité d'être choisis, la probabilité de choisir un point dans le cercle sera approchée par le rapport n/N.

Par ailleurs, la répartition des points étant supposée homogène, le nombre de points situés dans le carré est proportionnel à l'aire du carré 4a2. De la même façon, le nombre de points situés dans le disque est proportionnel à l'aire du disque pa2. On en déduit

Il suffit donc de faire un grand nombre d'expériences en utilisant, pour la commodité, un ordinateur qui tirera au hasard les coordonnées (x,y) d'un point ( l'origine des coordonnées étant prise au centre du cercle) en suivant la loi uniforme et en vérifiant si x2 + y2 <= a2.

Entrer un nombre de tirages et lancer la simulation
 

Ce petit exemple illustre le principe d'une simulation :

1) On ne fait pas une expérience réelle (cela prendrait beaucoup de temps), mais on utilise l'ordinateur pour effectuer les tirages (constitution d'échantillons aléatoires ) et comptabiliser les cas favorables et les cas possibles. Il s'agit donc d'une expérience "virtuelle".

2) On se rend vite compte que si on veut un résultat significatif, il faut un nombre de tirages assez élevé. C'est d'ailleurs une bonne raison d'utiliser un ordinateur.

Normalement, on s'attend à ce que le résultat converge vers la "bonne valeur". On peut alors se fixer un seuil de précision si l'on admet que le résultat converge ;  par exemple on peut arrêter le tirage lorsque la différence entre deux valeurs successives est inférieure à 0,001. Voici une nouvelle version de l'application précédente :

  Entrer la valeur de la différence entre deux résultats successifs (avec un point décimal) et lancer la simulation.(pour arrêter utiliser la barre d'espace)

NB : la simulation utilise des tirages de points sur une surface donnée ; ce type de simulation est appelé "Monte-Carlo".

Autre simulation possible : toujours le calcul de p, mais avec la méthode de Buffon (1717). Il s'agit de jeter une aiguille de longueur L sur un parquet composé de lattes parallèles de même largeur d. On compte le nombre de fois N où l'on lance l'aiguille et le nombre de fois n où elle coupe une séparation de deux lattes. Buffon a montré que la probabilité de couper une séparation de lattes est (dans le cas où d > L) :

2L/pd

Autrement dit, pour N grand , le rapport n/N doit tendre vers cette valeur ce qui permet d'en déduire une valeur approchée de p :

Tirage de nombres aléatoires

Comme on le voit dans les exemples précédents, la simulation est basée sur l'utilisation de nombres aléatoires pour la fabrication d'échantillons artificiels.

Lorsque les ordinateurs n'existaient pas encore (ou étaient rares), il était possible (il est d'ailleurs toujours possible) d'utiliser des tables de nombres aléatoires obtenus par l'observation de phénomènes physiques obéissant au hasard. Une table bien connue de cette époque reculée était celle de la RAND Corporation qui avait été établie par observation du débit des tubes électroniques. L'utilisation de telles tables consistait à extraire une suite de nombres aléatoires, par exemple

58360937587312385305968851265431298745609854325789043268721095010285730265742892

On peut ensuite effectuer des groupements de deux chiffres par exemple pour obtenir des nombres au hasard entre 00 et 99 :

58 36 09 37 58 73 12 38 53 05 96 88 51 26 54 31 29 87 45 60 98 54 32 57 89 04 32 68 72 10 95 01 02 85 73 02 65 74 28 92

Évidemment, de nos jours, c'est l'ordinateur qui fournit directement ces nombres au hasard. Mais comme ils sont calculés, on ne peut pas dire qu'ils sont aléatoires, mais pseudo-aléatoires. Examinons quelques procédés de génération de nombres pseudo-aléatoires.

procédé du mid-square

On choisit un nombre initial u0 de 2m chiffres. On l'élève au carré ce qui donne un nombre à 4m chiffres et on prend comme résultat le nombre u1 formé des 2m chiffres centraux. On recommence le procédé sur u1 ce qui conduit à u2, etc...

exemple :   

u0 = 7367  u02 = 54272689
u1 = 2726  u12 = 07431076
u2 = 4310  u22 = 18576100
u3 = 5761  u32 = 33189121
u4 = 1891  u42 = 03575881
u5 = 5758 etc...

ce qui donne la suite 73672726431057611891.....

procédé de Lehmer

On part de deux nombres au hasard u0  de m chiffres et k de n chiffres. On les multiplie ce qui donne un nombre à m + n chiffres. On sépare les n chiffres de gauche ce qui constitue un nombre d0 que l'on retranche nombre f0 constitué des m chiffres de droite ; on obtient ainsi u1. On réitère le processus avec u1, etc...

exemple :    u0 = 483215    k = 678

i ui ui x k  di fi
0 483215 327619770 327 619770
1 619443 419982354 419 982354
2 981935 665751930 665 751930
3 751265 509357670 509 357670
4 357161 etc...

on obtient ainsi une suite 483215619443981935751265357161...

procédé de Fibonacci

On part avec trois nombres u0, u1 et k, ce dernier étant plus grand que les deux premiers. On génère une suite de nombres aléatoires avec l'algorithme suivant :

un+2 = un+1 + un + ak             avec a = 0 si un+1 + un <= k     et     a = -1 si un+1 + un > k

exemple :    u0 = 05673      u1 = 09251       k = 12654.     On obtient successivement

u2 = 9251 + 5673 - 12654 = 02270
u3 = 2270 + 9251  = 11521
u4 = 11521 + 2270 - 12654 = 01137
u5 = 1137 + 11521 - 12654 = 00004
u6 = 4 + 1137 = 01141
u7 = 1141 +4 = 01145
u8 = 1145 + 1141 = 02286
etc...

Ensuite, on élimine le premier et le dernier chiffre de chaque nombre obtenu, d'où la suite :

567925227152113000114114228......

Validité des procédés

Il existe bien d'autres procédés, mais il faut qu'ils soient acceptables, c'est à dire fournir des nombres équiprobables, ce que l'on peut vérifier en faisant, par exemple le test du Chi2.

Confection d'échantillons

Prenons un exemple pour être très concret. Imaginons un guichet devant lequel arrive des clients. On mesure tous les 15 minutes le nombre de clients qui arrivent et on obtient après 100 mesures les résultats statistiques suivants :

nombre d'arrivées 0 1 2 3 4 5 6 7 8 9 10 11 12 13
fréquence 0,00 0,01 0,12 0,23 0,22 0,11 0,08 0,08 0,07 0,03 0,03 0,01 0,01 0,00

On peut considérer que cette statistique approche la loi de probabilité des arrivées supposée inconnue. La moyenne est l = 4,77 (en prenant comme unité le quart d'heure).

On mesure aussi, de la même manière le nombre de clients servis par quart d'heure. 100 mesures fournissent le tableau statistique suivant :

nombre de clients servis 0 1 2 3 4 5 6 7 8 9
fréquence 0,00 0,04 0,08 0,10 0,15 0,20 0,24 0,15 0,04 0,00

Comme précédemment, cette statistique approche la loi de probabilité des départs. On constate que la moyenne est m = 4,91

On souhaite étudier ce système d'attente et obtenir par simulation la longueur moyenne de la file d'attente des clients attendant d'être servis.

On commencera par compléter les deux tableaux ci-dessus en faisant correspondre à chaque fréquence une plage de nombres de 2 chiffres :

nombre d'arrivées 0 1 2 3 4 5 6 7 8 9 10 11 12 13
fréquence 0,00 0,01 0,12 0,23 0,22 0,11 0,08 0,08 0,07 0,03 0,03 0,01 0,01 0,00
nombres - 00 01-12 13-35 36-57 58-68 69-76 77-84 85-91 92-94 95-97 98 99 -

 

nombre de clients servis 0 1 2 3 4 5 6 7 8 9
fréquence 0,00 0,04 0,08 0,10 0,15 0,20 0,24 0,15 0,04 0,00
nombres - 00-03 04-11 12-21 22-36 37-56 57-80 81-95 96-99 -

La signification de ces nombres est la suivante. Imaginons que l'on possède deux suites de nombres aléatoires (ou pseudo aléatoires fournis par un ordinateur) :

S1 : 90 27 14 39 52 29 24 79 .....

S2 : 72 71 67 53 43 97 30 98 60 ....

Pour le 1er quart d'heure, on tire 90 pour les arrivées et 72 pour les départs ; avec les tableaux cela signifie que 8 clients arrivent et que 6 clients partent pendant ce quart d'heure.
Pour le second quart d'heure, on tire 27 pour les arrivées et 71 pour les départs ; ces nombres correspondant à 4 arrivées et 6 départs.
On continue ainsi pour une journée entière supposée de 6 heures (24 périodes d'un quart d'heure) et on obtient le tableau suivant dans lequel figurent le nombre d'arrivées et le nombre théorique de services qui pourraient être rendus s'il y avait suffisamment de clients :

période S1 S2 nombre d'arrivées nombre de services longueur de la file
1 90 72 8 6 2
2 27 71 4 6 0
3 14 67 3 6 0
4 39 53 4 5 0
5 52 43 5 5 0
6 29 97 4 8 0
7 24 30 4 4 0
8 79 98 7 8 0
9 90 60 8 6 2
10 23 27 4 4 2
11 13 17 3 3 2
12 17 73 3 6 0
13 43 97 5 8 0
14 62 81 6 7 0
15 02 13 1 3 0
16 73 10 6 2 4
17 70 03 6 1 9
18 58 92 5 7 7
19 14 54 3 5 5
20 06 57 2 6 1
21 18 28 3 4 0
22 16 81 3 7 0
23 63 60 6 6 0
24 15 39 3 5 0

On constate que la file est en moyenne de 1,33 individus ce qui peut sembler assez satisfaisant. Un autre résultat qui peut être intéressant est le taux "d'oisiveté" du guichetier ; en effet, comme on le constate, à certaine période, il pourrait rendre plus de services qu'il n'y a de clients et on peut donc considérer qu'il est inactif une partie du temps. On constate que le guichetier a effectué 99 services et il aurait pu en effectuer 128, d'où un taux d'oisiveté de 33 % environ.

Une simulation de ce genre est à interpréter avec précaution

1) le nombre d'événements n'est pas très important et on a intérêt à effectuer plusieurs simulations (qui donneront des résultats différents) et à faire des moyenne sur l'ensemble des simulations.

Une moyenne sur 100 simulations a donné la valeur 7,74 comme moyenne de la longueur de la file d'attente (donc bien différente de la valeur trouvée à partir du tableau ci-dessus).

2) le système est fermé puisque le service ne s'effectue que sur une durée de 6 heures (supposées ici continues) ; il est bien évident qu'il existe des phénomènes de "bord" : il faut attendre le premier client pour le servir et la fermeture du service peut limiter le nombre des dernières entrées. Par suite, il est quelquefois convenable d'effectuer les calculs seulement en période de "croisière".

Simulation suivant une loi de probabilité

Il arrive que l'on connaisse les lois de probabilité régissant les phénomènes. Dans ce cas, il est possible, en utilisant l'ordinateur, de générer des nombres dont la distribution suit une loi de probabilité. Par exemple, supposons dans l'exemple ci-dessus que la loi des arrivées et celle des services soient des lois de Poisson :

la probabilité d'avoir n arrivées de clients est : avec l= 4,77

la probabilité d'avoir n services effectués est : avec m  = 4,91

Il faudra donc utiliser un programme générateur de nombres aléatoires suivant la distribution de Poisson. Rappelons que pour trouver un nombre aléatoire suivant la loi de Poisson, on détermine un nombre entier a tel que

où z est un nombre aléatoire compris entre 0 et 1 suivant la loi uniforme. On génère les nombres suivant la loi de Poisson de la manière suivante (en langage algorithmique). La fonction gpoiss() utilise les fonctions gunif0() et fac().

fonction int gpoiss(float m)
{
    int
a = -1 ;
    float s = -1 ;
   
float v = 0 ;
    float q = exp(-m) ;  -- m est la moyenne de la loi de Poisson
    float u = gunif0() ;  
-- tirage d'un nombre compris entre 0 et 1 suivant la loi uniforme
    Tant que s <= u Faire
       
a = a + 1 ;
        v = v + m^
a/fac(a) ;  -- m^a signifie m à la puissance a et fac(a) est la factorielle de a 
        s = v*q ;
    FinTantque
   
return a ;
}

fonction float  gunif0()
{
--tirage d'un nombre aléatoire compris entre 0 et 1 suivant une distribution uniforme
-- utilisation de la fonction random() de l'ordinateur qui retourne un nombre a compris entre 0 et 1
return a ;
}

fonction int fac(int x)
{

--calcul d'une factorielle
    int f = 0 ;
    int res = 1 ;
    int z ;

    Si x>0 alors
        Pour z=1 à x Faire
            res=res*z ;
        FinPour
    FinSi
    return res ;
}
ou bien si votre langage de programmation accepte la récursivité :

fonction int fac(int x)
{
-- calcul d'une factorielle
    int res ;
    Si (x>1) alors
          res = (fac(x-1)*x) ;
    sinon
        res = 1 ;
    FinSi
    return res ;
}

En voici une réalisation qui restitue l'équivalent du tableau du paragraphe précédent.

En effectuant une centaine de simulations, on obtient la valeur 6,99 comme longueur moyenne de la file d'attente (vous pouvez trouver une autre valeur évidemment !)..

Tests

Exercice 1

Réaliser un programme permettant de calculer p suivant la méthode de Buffon (une visualisation graphique serait appréciée).


Exercice 2

Réaliser le programme qui permet de trouver la longueur d'une file d'attente dans les conditions du paragraphe sur la simulation d'une loi de probabilité.


Exercice 3

On considère la courbe y = sin x pour x variant de 0 à p. Par simulation Monte-Carlo, déterminer l'aire comprise entre la courbe et l'axe des abscisses.