Vous êtes sur la page 1sur 5

CPGE BCPST 2

Année Académique: 2023 - 2024

Travaux Pratiques N°1


Méthodes numériques et statistiques: Simulation de variables aléatoires
Anicet E. T. Ebou

I. Simulation d’une v.a.r. suivant une loi quelconque


I.1. Méthode d’inversion de la fonction de répartition
La méthode d’inversion de la fonction de répartition a été proposée par Von Neumann en 1947. On
rappelle un résultat du cours de probabilité:

Proposition 1: Si F est la fonction de répartition d’une v.a.r. X, c’est-à-dire F (t) = P (X ≤ t) pour


t ∈ R, alors en définissant son inverse généralisée F −1 (u) = inf {t|F (t) ≥ u}, si U suit la loi uniforme
sur [0,1], F −1 (U ) a même loi que X.

Si on peut calculer F −1 , on peut donc simuler X à partir de U .

I.2. Loi géométrique


I.2.1. Simulation à l’aide de la fonction random

Exercice 1: Simulation de la loi géométrique avec random

A partir de la simulation de la loi de Bernoulli, écire une fonction geom(p) qui simule une variable
aléatoire G(p).

Note: Si X ,→ G(p), on sait que X représente le rang du premier succès dans un schéma de Bernoulli,
donc on peut modéliser un résultat aléatoire suivant une loi géométrique en répétant une évaluation selon
une loi de Bernoulli de paramètre p jusqu’à obtenir un premier succès : c’est à dire la valeur 1 avec
probabilité p.
Remarque: La fonction np.random.geometric(p) fournit le même résultat.

I.2.2. Simulation à partir de l’inverse de la fonction de répartition


Pour la loi géométrique, pour une v.a.r. X, q = 1 − p et on a F (x) = 1 − q x pour x > 0, d’où
ln(1 − u)
F − 1(u) = .
ln(1 − p)
Exercice 2: Simulation de la loi géométrique

Ecrire une fonction geoinv(p) qui permet de simuler la loi géométrique.

I.2.3. Diagrammes en bâtons

Exercice 3: Diagrammes en bâtons - loi géométrique

Ecrire un programme permettant de visualiser les données obtenues des deux fonctions de simula-
tions de la loi géométrique et comparer à chaque fois avec l’allure de la fonction de masse de la loi
géométrique.

1
I.3 Loi de Poisson
I.3.1. Simulation à l’aide de la fonction random
La loi de Poisson P(λ) est plus difficile à modéliser à partir de sa situation d’application. Par contre
on peut la modéliser grâce à sa fonction de répartition F (x).
En effet ∀n ∈ X(Ω) = N , on a P (X = n) = P (X ∈]n − 1, n]) = P (X ≤ n) − P (x ≤ n − 1) =
FX (n) − FX (n − 1), c’est donc la probabilité qu’une évaluation de la fonction ‘random‘ tombe dans
l’intervalle [FX (n − 1), FX (n)[⊂ [0, 1[.
Donc pour modéliser un résultat qui suit une loi de Poisson, il suffit de choisir un nombre p aléatoirement
avec la fonction random(), puis il reste à déterminer pour quelle valeur de n, p est dans l’intervalle
[FX (n − 1), FX (n)[.
Xn
Pour cela, il suffit de calculer successivement pour n = 0, n = 1, n = 2, ...FX (n) = P (X = k) =
k=0
n
X λk
e−λ jusqu’à ce que l’ont ait FX (n) ≥ p.
k!
k=0
Le premier entier n tel que FX (n) ≥ p sera bel et bien un résultat d’une évaluation suivant une loi de
Poisson.

Exercice 4: Simulation de la loi de Poisson


Ecrire une fonction poisson(mu) qui simule une variable aléatoire de loi P(µ).

Remarque: la fonction ‘numpy.random.poisson‘ conduit au même résultat.

I.3.2. Diagrammes en bâtons

Exercice 5: Diagrammes en bâtons - loi de Poisson

Ecrire un programme permettant de visualiser les données obtenues des simulations et comparer
avec avec l’allure de la fonction de masse de la loi de Poisson.

I.3.3 Approximation de la loi de Poisson


On peut aussi approximer la loi de Poisson en utilisant la loi binomiale. En effet on sait que si
X ,→ B(n, np ) alors sa loi se rapproche d’une variable Y ,→ P(p).

Exercice 6: Approximation de la loi de Poisson

Ecrire un code Python permettant de visualiser les données obtenues des simulations et comparer
avec l’allure de la densité de probabilité de la loi normale.

I.4. Loi exponentielle


I.4.1. Simulation à partir de l’inverse de la fonction de répartition
1
Pour la loi Exp(λ), on a F (x) = 1 − e−λx pour x > 0, d’où F −1 (u) = − ln(1 − u).
λ
Exercice 7: Simulation de la loi de exponentielle

Ecrire une fonction expo(lambda) qui simule une v.a.r. suivant la loi exponentielle de paramètre
lambda.

Remarque: la fonction numpy.random.exponential conduit au même résultat.

2
I.4.2 Histogramme et densité de probabilité

Exercice 8: Diagrammes en bâtons - loi exponentielle

Ecrire un programme permettant de visualiser les données obtenues des simulations et comparer
avec l’allure de la densité de probabilité de la loi exponentielle.

I.5 Loi normale


I.5.1 Simulation à partir de la fonction random
Il est possible de générer une variable aléatoire gausienne directement à l’aide de la transformation de
Box-Muller. Elle s’appuie sur le résultat suivant.
Proposition 2: Soient X et Y deux variables aléatoires gausiennes centrées réduites indépendantes.
Définissons (R, θ) les coordonnées polaires de (X, Y ): X = Rcos(θ), Y = Rsin(θ) avec R ≥ 0 et θ ∈
[0, 2π]. Alors R2 et θ sont deux variables aléatoires indépendantes, la première est de loi Exp( 12 ), la
seconde de loi uniforme sur [0, 2π].
Pour simuler une p variable X aléatoire de N(0, 1), il suffit donc de prendre U, V ∼ U([0, ]) indépendantes
et poser X = −2ln(U )cos(2πV ). Pour simuler une variable X de loi N(µ, σ ), il suffit de prendre
2

X = µ + σY avec Y ∼ N(0, 1).

Exercice 9: Simulation de la loi normale


Ecrire une fonction normale(mu, sigma) qui simule une v.a.r. suivant la loi normale de paramètre
mu et sigma.

Remarque: la fonction numpy.random.normal conduit au même résultat.

I.5.2 Histogramme et densité de probabilité

Exercice 10: Diagrammes en bâtons - loi normale

Ecrire un code Python permettant de visualiser les données obtenues des simulations et comparer
avec l’allure de la densité de probabilité de la loi normale.

II. Illustration numérique de convergence en lois


II.1. Loi faible des grands nombres
Pour illustrer la loi des grands nombres, on peut créer un très grand échantillon de N réalisation d’une
variable aléatoire comme précédemment et afficher la variation de l’espérance estimée sur les k premières
valeurs de l’échantillon quand k augmente.
On peut ainsi à partir des fonctions de simulation de v.a.r réalisées dans les paragraphes précédents,
visualiser l’évolution de la moyenne empirique des réalisations des lois précédentes.

Exercice 11: Visualisation de loi


Complétez le code suivant en utilisant une simulation de la loi géométrique et ensuite une de la loi
normale:

3
from matplotlib import pyplot as plt

def s i m u l a t i o n _ g r a n d _ n o m b r e _ Y (n , N ):
L = ...
# Cette variable servira à calculer la somme
# cumul é e des valeurs de l ’é chantillon
val = 0
xbar = []
f o r i i n range ( N ):
val += L [ i ]
# On enregistre dans xbar la moyenne des i premieres
# valeurs de l ’ echantillon
xbar . append ( val /( i + 1))
return xbar

n = 10
N = 100000
T = [ i + 1 f o r i i n range ( N )]
x = s i m u l a t i o n _ g r a n d _ n o m b r e _ Y (n , N )
plt . plot (T , X )
plt . show ()

On peut aussi mettre sur la même figure la simulation et l’espérance de la loi.

Exercice 12: Visualisation de loi


Afin d’illustrer la Loi des Grands Nombres, visualisons la suite Sn = X1 + X2 + X3 + ... + Xn pour
Xi une suite de variables aléatoires indépendantes de loi uniforme sur [-1, 1].

from matplotlib import pyplot as plt


import numpy as np

n = 1000
x = 2 * np . random . rand ( n ) - 1
s = ...
plt . plot ( range (1 , n +1) , s , ’r ’ , label = ’ simulation ’)
plt . plot ((1 , n ) , (0 , 0) , ’b - - ’ , label = ’ espereance ’)
plt . xlabel ( ’n ’)
plt . legend ( loc = ’ best ’)
plt . title ( ’ loi ␣ faible ␣ des ␣ grands ␣ nombres ’)
plt . show ()

II.2. Théorème centrale limite


Le théorème central limite établit la convergence en loi de la somme d’une suite de variables aléatoires
(indépendantes, et identiquements distribuées) vers la loi normale.
Nous pouvons visualiser cela en utilisant une suite de v.a.r suivant une loi de Poisson et vérifier sa
convergence en loi vers la loi normale.

4
Exercice 13: Visualisation de loi
Complétez le code suivant:

import numpy as np
import matplotlib . pyplot as plt

# Param è tres pour la distribution


poisson_lambda = 5
normal_mean = 0
normal_std = 1
num_samples = 1000

# G é n é rer les donn é es


poisson_data = ...
normal_data = ...

# Cr é ation des sous figures


fig , axes = plt . subplots ( nrows =1 , ncols =2 , figsize =(10 , 5))

# Plot Poisson histogram


axes [0]. hist (... , bins =20 , color = ’ blue ’ , alpha =0.7)
axes [0]. set_title ( ’ Distribution ␣ de ␣ Poisson ’)
axes [0]. set_xlabel ( ’ Valeur ’)
axes [0]. set_ylabel ( ’ Fr é quence ’)

# Plot Normal histogram


axes [1]. hist (... , bins =20 , color = ’ orange ’ , alpha =0.7)
axes [1]. set_title ( ’ Distribution ␣ normale ’)
axes [1]. set_xlabel ( ’ Valeur ’)
axes [1]. set_ylabel ( ’ Fr é quence ’)

# Ajuster le layout
plt . tight_layout ()

# Affichage de la figure
plt . show ()

Vous aimerez peut-être aussi