Stochastic Modeling and Simulation
3rd Year_2024-2025
TP 1 : Simulation Random Phenomena
Dans ce TP, nous allons revoir dans une première partie comment générer des nombres aléatoires.
Puis nous les utiliserons pour simuler un phénomène aléatoire.
Tirages aléatoires
Tous les langages de programmation possèdent au moins un générateur de nombres pseudo-aléatoires.
En général, ce générateur produit des nombres aléatoires répartis de manière uniforme sur l’intervalle
[0; 1]. Cela signi…e que la probabilité d’obtenir un nombre entre 0 et 1 est la même quel que soit ce
nombre, et qu’elle est nulle en dehors de cet intervalle.
Python possède en réalité de nombreux générateurs permettant de reproduire des lois de proba-
bilités classiques. Ils sont inclus dans le package random. Des générateurs équivalents sont également
inclus dans le sous package [Link], qui gère avantageusement des (grands) tableaux de
valeurs. C’est ce second package que nous utiliserons ici (voir la page d’aide en ligne).
Une autre excellente introduction pédagogique (en anglais) à numpy, matplotlib et scipy,
sous pdf ou comme notebooks IPython, visionnable directement sur le web. Les chapitres 1 à 4 du
pdf ou les cours (lectures) sont largement su¢ sants comme prérequis :
[Link]/jrjohansson/scientific-python-lectures.
Nous recommandons l’utilisation de Jupyter ou de Spyder pour programmer en Python.
Bases de la simulation aléatoire
Toutes les simulations aléatoires reposent sur un élément de base : la simulation par Python de
variables aléatoires uniformes.
Avant toute chose, on inclut les bibliothèques adéquates :
import math
import numpy as np
import [Link] as scs
import [Link] as plt
import [Link] as random
La fonction random() permet de générer un unique nombre aléatoire de distribution uniforme
sur [0; 1[. On peut également lui passer un argument. Elle génère alors directement un tableau
numpy de N nombres aléatoires.
L’algorithme utilisé par Python est appelé « Mersenne Twister » (développé par Makoto Mat-
sumoto et Takuji Nishimura en 1997) et la suite de nombres ainsi engendrée ressemble beaucoup
plus à une suite de variables aléatoires uniformes et indépendantes. Néanmoins elle ne l’est pas
tout à fait puisqu’il s’agit d’une suite périodique. Il ne s’agit pas d’une récurrence à un terme
yi = f (yi 1 ) comme dans l’algorithme présenté au cours, mais il s’agit toujours d’une suite dé…nie
par récurrence. La période
219937 1 est un nombre premier (de Mersenne) tellement gigantesque qu’en pratique on ne
s’en rendra jamais compte. Ceci dit, y1 et y219937 ne sont clairement pas indépendants puisqu’ils
sont égaux.
1
Ainsi, les nombres aléatoires que nous allons utiliser dans ces simulations ne le sont pas vraiment,
ils sont déterministes mais nous n’aurons pas de moyen de les distinguer d’une suite aléatoire. Nous
considérerons la fonction rand comme une boîte noire qui nous renvoie réellement des nombres
indépendants et uniformes sur [0; 1].
il est parfois utile de partir toujours avec la même valeur initiale. On utilise alors une graine
(seed en anglais) que l’on …xe avec la fonction : seed(graine) (toujours de la bibliothèque random).
Cette graine est toujours un nombre entier.
Exercice 1 1. A¤ectez une unique valeur aléatoire à une variable et a¢ chez-la. Exécutez plusieurs
fois la cellule et véri…ez que les valeurs prises couvrent bien la gamme [0; 1[. Dans une autre
cellule produire un tableau de 10 élements aléatoires et l’a¢ cher.
2. Initialisez la graine (seed) avec un entier de votre choix et a¢ chez les valeurs d’un tableau
aléatoire de 10 éléments. Exécutez plusieurs fois la cellule et véri…ez qu’elle produit toujours
la même séquence.
Exercice 2 Ecrire un programme qui retourne les n premiers termes du générateur congruentiels
linéaires de module m = 103 de multiplicateur a = 121, d’incréments b = 567 et de racine y0 = 0:
1. A…cher les 20 premières valeurs des nombres pseudo-aléatoires.
2. Tester la qualité de ce générateur par un test du Khi-deux avec 10 intervalles et = 0; 05:
3. En utilisant la commande appropriée tracer l’histogramme de la variable u pour n = 104 et ou
l’on prendra 10 classes. Comparer l’histogramme à la densité d’une loi uniforme sur [0; 1] :
Exercice 3 A l’aide de la page d’aide en ligne, générez des échantillons de valeurs et tracez
l’histogramme correspondant pour les di¤érentes lois suivantes :
1. uniforme entre 10 et 10 : comparez avec la courbe théorique avec x allant de 10 à 10 par
pas de 0; 1.
2. exponentielle d’echelle 2 : comparez avec la courbe théorique avec x allant de 0 à 10 par pas
de 0; 1.
3. normale de moyenne = 0 et d’écart type = 1: comparez avec la courbe théorique avec x
allant de 5 à 5 par pas de 0; 1.
Méthode de simulation par inversion de la fonction de répartition
Bien que le package random contienne un certain nombre de lois très fréquentes, il arrive bien
souvent que l’on souhaite réaliser des tirages selon des lois de probabilités plus complexes. Lorsque
la densité de probabilité p (x) est su¢ samment simple, et que l’on peut calculer la fonction de
répartition FX et son inverse FX 1 , alors un moyen simple, en reprenant les concepts décrits dans le
cours, est de :
génerer des tirages aléatoires u de loi uniforme sur [0; 1]
1
de calculer à chaque tirage x = F (u) :
2
Exercice 4 On rappelle que la loi exponentielle E ( ) de paramètre est la loi de densité f (x) =
e x I]0;1[ (x).
1. Écrire un programme qui simule une variable aléatoire de loi exponentielle de paramètre , à
l’aide d’une variable aléatoire de loi uniforme sur [0; 1].
2. Trouver m tel que si X a pour loi E ( ), alors P(X > m ) = 0:05.
3. Tracer sur un même graphe et pour plusieurs tailles d’échantillons la fonction de répartition
empirique d’un échantillon de variable aléatoire exponentielle de paramètre 1, et la fonction
de répartition de la loi exponentielle. On prendra garde à représenter seulement la courbe sur
un intervalle où la variable a de bonnes chances d’être présente, par exemple [0; m ].
1
Exercice 5 La loi de Cauchy est la loi de densité f (x) = (1+x2 )
sur R.
1. Quelle est la fonction de répartition FX d’une variable aléatoire X qui a cette loi ?
2. Que vaut alors FX 1 ?
3. Simuler une variable aléatoire de loi de Cauchy, à l’aide d’une variable aléatoire de loi uni-
forme sur [0; 1].
4. Trouver m tel que si X a la loi de Cauchy, alors P(jXj > m) = 0:05.
5. Tracer pour plusieurs tailles d’échantillons la fonction de répartition empirique d’un échan-
tillon de variables de loi de Cauchy, et la fonction de répartition de la loi de Cauchy. On
prendra garde à représenter seulement la courbe sur un intervalle où la variable a de bonnes
chances d’être présente, par exemple [ m; m].