Séance 13: Méthode d’Euler et Simulation de variables aléatoires
Cours d’informatique de BCPST Première année.
1 Méthode d’Euler 2 1.1 Principe . . . 2 1.2 Expression mathématique . . . 3 1.3 Un exemple dans un cas simple . . . 4
2 Simulation de variables aléatoires 4
2.1 Généralités . . . 4 2.2 Lancers de dés . . . 5 2.3 Lancer d’une pièce . . . 7
3 Anticipations possibles avant le TP 7
Séance 13: Méthode d’Euler et Simulation de variables aléatoires
1. Méthode d’Euler
En théorie, on sait résoudre les équations différentielles linéaire du première ordre. Néanmoins, cette résolution fait souvent appel à deux reprises (solution générale, puis variation de la constante) à un calcul de primitive et il y a des fonctions, commet7→exp(−t2), qu’on ne sait pas primitiver. En outre, si l’équation différentielle proposée n’est pas linéaire, il n’y a pas de méthode générale de résolution théorique. Tout cela nous amène à réfléchir à une méthode de résolution approchée, les deux grandes méthodes classiques sont les suivantes :
• La méthode analytique : L’approximation de la solution prend généralement la forme d’une série tronquée (la notion de série sera vue en deuxième année). Cette méthode repose sur le développement en série entière, outil qui n’est pas au programme des bcpst.
• La méthode de discrétisation : Elle consiste à approcher la solution en un nombre fini de points d’un intervalle fixé.
Nous allons voir dans ce cours la méthode d’Euler qui est une des méthodes de discrétisation les plus simples.
1.1 Principe
La méthode d’Euler est une méthode de résolution numérique de certaines équations différentielles.
Une équation différentielle linéaire du premier ordrey0(t) =g1(t)y(t) +g2(t) d’inconnueyfonction dérivable sur I, un intervalle de réels connu, avecg1etg2 deux fonctions connus et fixés peut s’écrire aussi, pour touttde I, on veut :y0(t) =f(t, y(t)) avec :
f :
I×R - R
(α,β) - g1(α)β+g2(α)
Plus généralement, si I est un intervalle deR,une équation différentielle du premier ordre est une équation de la formey0(t) =f(t, y(t)) oùf : I×R→Rest une une fonction de deux variables. Si f possède des propriétés favorables, des théorèmes assurent que, la condition initiale étant donnée, il existe une unique solutiony à cette équation différentielle (pas toujours définie sur I tout entier), mais en pratique, on est rarement capable de déterminer explicitement cette solution. L’objectif de la méthode d’Euler est d’en avoir une approximation. On verra que cette méthode fonctionne plutôt bien pour les équations différentielles linéaires et pour les équationsy0(t) =f(t, y(t)) avecf de classe C1 suffisamment régulière.
On considère donc une équation différentielle (E) :y0(t) =f(t, y(t)) du premier ordre avecaetbdeux réels tels quea < betf : [a, b]×R→Rune fonction de deux variables. Supposons qu’il existe une solutionϕ de (E).On suppose connueϕ(a) (et doncϕ0(a) carϕest une solution de (E)) et on cherche une approximation deϕsur [a, b] (car on suppose queϕn’est pas connu, on a juste à notre disposition l’équation (doncf),ϕ(a) etϕ0(a)).
On pose u0 =ϕ(a). Comme ϕ0(a) = lim
h→0
ϕ(a+h)−ϕ(a) h
!
, on a, si hest un réel non nul proche de 0, l’approximation suivante :
ϕ(a+h)−ϕ(a)
h 'ϕ0(a).
Or on sait queϕ0(a) =f(a,ϕ(a)), on en déduit :
ϕ(a+h)'ϕ(a) +h×f(a,ϕ(a)).
Pour obtenir une valeur approchée u1 deϕ(a+h), on remplace ϕ(a) par u0 dans l’approximation précédente, on définit ainsiu1 par u1=u0+hf(a, u0).
Institut d’Alzon 2020/2021 page 2
De même, on a : ϕ(a+ 2h)−ϕ(a+h)
h 'ϕ0(a+h) sihest un réel non nul proche de 0, ce qui donne : ϕ(a+ 2h)'ϕ(a+h) +h×f(a+h,ϕ(a+h)).
Cette fois, on remplaceϕ(a+h) paru1 et on pose u2=u1+h×f(a+h, u1).On remarque queu2est une approximation deϕ(a+ 2h) calculée à partir d’une approximation deϕ(a+h) (à savoiru1).
Plus généralement, on définit par récurrence (uk)k∈Npar :
u0 =ϕ(a) et, pour tout entier naturelk, on pose :uk+1=uk+h×f(a+h×k, uk)
de sorte que, pour tout entier naturel k, uk soit une valeur approchée de ϕ(a+h×k). Les valeurs approchéesu0, u1, u2, . . .sont de plus en plus mauvaises car elles s’appuient sur les approximations déjà effectuées précédemment, d’où l’intérêt de choisirhtrès petit.
1.2 Expression mathématique
On choisit un grand entier naturel non nul N et on poseh=b−a
N . Pour avoir une valeur approchée de ϕ(a+hk) pour toutkdeJ0,NK, on calcule le terme généraluk de la suite finie (uk)k∈
J0,NKdéfinie par : u0=ϕ(a) et, pour toutkdeJ0,N−1K, on pose :uk+1=uk+b−a
N ×f a+b−a
N ×k, uk
!
Pour toutkdeJ0,NK, on a :uk 'ϕ(α+hk). On a en particulieruN'ϕ(b). Cette approximation est a priori bonne si on choisit N grand.
En utilisant ces approximations, on a obtenu :
Séance 13: Méthode d’Euler et Simulation de variables aléatoires
1.3 Un exemple dans un cas simple
On va appliquer la méthode d’Euler pour trouver une approximation de la solution u du système différentielle suivant :
∀t∈[0,T], y0(t) =c×y(t) et y(0) =a
d’inconnueyfonction dérivable sur [0,T] avec T un réel strictement positif, etaetc deux réels fixés.
Si on posef : (α,β)7→cβ alors on cherche trouver une approximation de la solutionu du système différentielle suivant :
∀t∈[0,T], y0(t) =f (t, y(t)) et y(0) =a
Pour appliquer la méthode d’Euler, on va donc poserz0 =aet, pour tout entierkdeJ0,N−1K, on pose :
zk+1=zk+czk× T N
=zk×
1 +c× T N
.
On remarque qu’on sait résoudre le problème posé et que la solution g du système différentielle proposé est :
g:
[0; T] −→R t 7→exp (ct).
On note que l’approximation proposée par la méthode d’Euler est correcte car, pour toutkdeJ1,N−1K, on a donc :
zk =
1 +c× T N
k
. On sait que lim
N→+∞
1 +c× T N
N
= exp (cT), on obtient donc que : lim
N→+∞(zN) = exp (cT) (ce qui est la valeur attendue).
2. Simulation de variables aléatoires
Nous allons voir dans cette partie quelques exemples de simulation de variables aléatoires en Python.
On rappelle qu’une variable aléatoire est une fonction renvoyant une quantité numérique à partir d’une expérience aléatoire, c’est par exemple le cas du résultat X obtenu en lançant un dé à 6 faces.
2.1 Généralités
Les fonctions que nous allons utiliser le plus souvent se trouvent dans le module random de la bibliothèquenumpy:
• rand(), qui renvoie un flottant aléatoire dans ]0,1[ ;
• la fonction randint(a,b), qui renvoie un entier aléatoire dans compris entrea inclus et b exclu.
On peut tester en tapant les instructions suivantes dans la console : import numpy . random as nr
nr . rand () nr . rand ()
Institut d’Alzon 2020/2021 page 4
nr . randint (1 ,100) nr . randint (1 ,100)
Pour en savoir plus sur une variable aléatoire discrète à l’aide d’un ordinateur, on suivra souvent ces différentes étapes :
• Première étape : Simulation
On commence par simuler une fois cette variable. Cette étape nécessite fréquemment l’utili- sation du modulerandom. Simuler, cela signifie que l’on ne fait pas l’expérience mais que le programme nous renvoie un résultat qui est cohérent avec l’expérience. Par exemple, si on veut simuler une variable aléatoire qui renvoie 1 quand on obtient pile avec le lancer d’une pièce équilibrée, 0 sinon alors on va implémenter un programme renvoyant 1 avec une probabilité de 1
2, 0 sinon.
• Seconde étape : Répétition
On crée ensuite un programme simulant un grand nombre de fois cette opération et on renvoie une liste des résultats.
• Troisième étape : Visualisation
On va visualiser la loi de cette variable aléatoire à l’aide d’un histogramme. La fonction histdu modulematplotlibpermet de tracer l’histogramme d’une liste. Sixest un vecteur contenant des nombres compris dans un intervalle I (l’univers image de la variable aléatoire), alors l’instruction hist(x,n) divise l’intervalle I en n tranches égales et indique, sur un histogramme, combien d’éléments du vecteurxtombent dans chaque tranche.Si le vecteur est la liste des valeurs prises par une variable aléatoire lors d’une même expérience répétée un très grand nombre de fois (mettonsN), l’histogramme sera essentiellement celui de la loi de la variable aléatoire, où toutes les valeurs ont été multipliées parN(les valeurs ne sont pas ici des probabilités mais des nombres d’occurrences).
• Dernière étape : Moyenne
Pour avoir une idée de la moyenne de notre variable aléatoire, on sait (d’après la loi des grands nombres qui sera vue à la fin de la deuxième année) que, si le nombre de lancers est assez grand, la moyenne des résultats obtenus sur la suite de lancers (la moyenne empirique) fournit une bonne approximation de l’espérance de la variable aléatoire.
On va appliquer ce principe dans deux cas simples : le lancer de dé et le jet d’une pièce.
2.2 Lancers de dés
La variable qui nous intéresse dans cette partie donne le résultat d’un dé équilibré à 6 faces (qu’on pourrait facilement généralisé en le jet d’un d’un dé équilibré à nfaces, nentier naturel non nul, cas particlier d’une loi uniforme). On va suivre les différentes étapes données dans le paragraphe
"Généralités" :
• Première étape : Simulation
On effectue l’expérience aléatoire une fois, notre fonction nous renvoie donc le résultat du dé, on propose le programme suivant :
import numpy as np def de ():
return np . random . randint (1 ,7)
• Seconde étape : Répétition
On répète un grand nombre de fois l’expérience (on a mis 1000 par défaut) et on renvoie une liste des résultats :
def Simul (n =1000):
Séance 13: Méthode d’Euler et Simulation de variables aléatoires
return [ de ( ) for i in range(n )]
On a obtenu :
>>> Simul (20)
[2 , 6, 2, 5, 5, 3, 1, 3, 4, 1, 2, 3, 3, 1, 3, 4, 3, 2, 6, 6]
• Troisième étape : Visualisation
On trace ensuite un histogramme à l’aide des programmes précédents, on peut taper ainsi les instructions suivantes dans l’éditeur de commandes :
import matplotlib . pyplot as plt x = Simul ()
plt . hist (x ,6) pour obtenir :
• Dernière étape : Moyenne
On calcule maintenant la moyenne empirique (sur un grand nombre de réalisations) pour avoir une idée de l’espérance de notre variable aléatoire :
def Moyenne (n =1000):
a= Simul (n) s =0
for k in a:
s += k return (s/n)
On obtient une moyenne de 3,5.
Institut d’Alzon 2020/2021 page 6
2.3 Lancer d’une pièce
On souhaite dans cette partie simuler le lancer d’une pièce, équilibrée ou non (Loi de Bernoulli). Cette pièce donne pile avec une probabilitép(pétant un réel de ]0,1[ connu), notre variable aléatoire prend la valeur 1quand la pièce a donné pile, 0 sinon. On suit de nouveau les différentes étapes données du paragraphe "Généralités" :
• Première étape : Simulation def Piece (p ):
t = nr . rand () if t < p:
return 1 else:
return 0
que l’on peut réécrire plus simplement en : def Piece (p ):
return( nr . rand () < p)
• Seconde étape : Répétition
On répète un grand nombre de fois l’expérience (on a mis 1000 par défaut) et on renvoie une liste des résultats :
def Simul (n =1000 , p ):
return [ Piece (p) for i in range(n )]
• Troisième étape : Visualisation
On trace ensuite un histogramme à l’aide des programmes précédents, on peut taper ainsi les instructions suivantes dans l’éditeur de commandes :
import matplotlib . pyplot as plt x = Simul ()
plt . hist (x ,2)
• Dernière étape : Moyenne
On calcule maintenant la moyenne empirique : def Moyenne (n =1000):
a= Simul (n) s =0
for k in a:
s += k return (s/n)
On obtient une moyenne de 0,5.
3. Anticipations possibles avant le TP
Avant le prochain TP, je peux faire les choses suivantes :
• Bien comprendre la méthode d’Euler et reprendre les exemples traités.
• Bien comprendre la notion de simulation de variable aléatoire, en particulier les deux exemples vus.
• S’assurer d’avoir les bibliothèques Numpy et Matplotlib.