Introduction :
Dans cette fiche, nous allons voir comment donner la valeur approchée d’une aire avec… des probabilités ! Ces méthodes, qui permettent d’approcher des valeurs par des probabilités, sont dites de Monte-Carlo.
Nous verrons donc, dans un premier temps, le principe de cette méthode. Puis nous programmerons une fonction Python qui permettra de donner une approximation de l’aire sous la courbe d’une fonction, soit l’intégrale de la fonction sur l’intervalle considéré
Principe de la méthode de Monte-Carlo
Principe de la méthode de Monte-Carlo
Considérons pour commencer un cas évident : soit un rectangle , que nous divisons en deux parties égales :
Nous comprenons très facilement que, si nous prenons un point de manière aléatoire dans le rectangle , la probabilité pour qu’il appartienne à est égale à :
Il en va de même pour une figure quelconque inscrite dans le rectangle :
La probabilité qu’un point pris au hasard dans appartienne à est égale à :
- On en déduit :
Voilà en quoi consiste la méthode de Monte-Carlo :
- la figure dont on cherche l’aire est incluse dans un rectangle dont on peut calculer facilement l’aire ;
- on prend au hasard un grand nombre de points appartenant au rectangle, et on compte ceux qui appartiennent à la figure, pour obtenir leur nombre ;
- on en déduit la fréquence d’appartenance à la figure ;
- plus on prend de points, plus la fréquence d’appartenance à la figure approche de la probabilité théorique (loi des grands nombres) ;
- nous obtenons ainsi l’approximation :
Programme Python
Programme Python
Prérequis
Prérequis
Soit la fonction définie et continue sur par :
Nous nous intéressons à l’aire du domaine sous la courbe représentative de , sur l’intervalle .
- Nous avons, dans un repère , avec :
Légende
est strictement croissante et positive sur (vous pouvez le montrer).
Et nous avons et .
- Cela signifie donc que la partie d’aire est incluse dans le carré .
Remarquons que cette aire est égale à :
Dans toute cette fiche, nous travaillerons avec des fonctions positives sur l’intervalle considéré. Ainsi, le programme que nous écrirons ne permettra de travailler qu’avec de telles fonctions (mais vous pourrez aussi adapter pour que cela marche également avec des fonctions négatives sur l’intervalle).
Comme nous l’avons vu dans la première partie, nous prendrons de manière aléatoire un grand nombre de points appartenant au carré , d’aire égale à
Pour chaque point, nous regarderons s’il appartient à .
Pour savoir si un point appartient à , il suffit de calculer et de comparer le résultat à .
- En effet, logiquement :
- si , alors est sous la courbe et appartient à ;
- si , alors est au-dessus de la courbe et n’appartient pas à .
Nous compterons ceux qui appartiennent à et en déduirons la fréquence de tels points.
- Cela nous permettra de donner une approximation de :
Programme Python
Programme Python
Pour choisir au hasard un point, nous utiliserons la fonction du module , pour générer de manière aléatoire son abscisse et son ordonnée, comprise entre et .
- Nous commençons donc par importer le module :
- Définissons aussi notre fonction , qui prend en paramètre :
- : nous demandons à la fonction de faire le calcul et de retourner le résultat.
- Notre fonction Python prend en paramètres :
- la fonction à laquelle on s’intéresse (dans notre cas, il s’agira donc de ) ;
- le nombre de points que nous voulons générer aléatoirement.
- Nous initialisons le compteur , qui comptabilisera le nombre de points qui sont sous la courbe :
- Nous utilisons une boucle pour générer les points :
Pour générer un point, nous utilisons la fonction pour choisir aléatoirement deux nombres et compris entre et , qui représenteront respectivement :
- son abscisse,
- et son ordonnée.
- Comme nous l’avons dit, nous regardons alors si est inférieur ou égal à l’image de par la fonction :
- Dans ce cas, nous comptabilisons le point comme étant sous la courbe :
- Nous allons maintenant pouvoir donner l’approximation de l’aire.
- Comme nous l’avons dit en prérequis, elle vaut environ la fréquence, que l’on calcule en divisant le nombre de points sous la courbe par le nombre total de points :
\begin{aligned} &\text{print($^{\backprime\backprime}$L'aire sous la courbe vaut environ : $^{\prime\prime}$)} \\ &\text{print(c / n, $^{\backprime\backprime}$u.a.$^{\prime\prime}$)} \end{aligned} |
Le programme est terminé :
\begin{aligned} \textcolor{#A9A9A9}{\text{1}}&\quad\text{from random import $\ast$} \ \textcolor{#A9A9A9}{\text{2}}& \ \textcolor{#A9A9A9}{\text{3}}&\quad\text{def g(x):} \ \textcolor{#A9A9A9}{\text{4}}&\quad\qquad\text{return x $\ast$ (x$\ast\ast\,$2 - 3 $\ast$ x + 3)} \ \textcolor{#A9A9A9}{\text{5}}& \ \textcolor{#A9A9A9}{\text{6}}&\quad\text{def aire(f, n):} \ \textcolor{#A9A9A9}{\text{7}}&\quad\qquad\text{c = 0} \ \textcolor{#A9A9A9}{\text{8}}&\quad\qquad\text{for i in range(n):} \ \textcolor{#A9A9A9}{\text{9}}&\quad\qquad\qquad\text{x = random()} \ \textcolor{#A9A9A9}{\text{10}}&\quad\qquad\qquad\text{y = random()} \ \textcolor{#A9A9A9}{\text{11}}&\quad\qquad\qquad\text{if y <= f(x):} \ \textcolor{#A9A9A9}{\text{12}}&\quad\qquad\qquad\qquad\text{c = c + 1} \ \textcolor{#A9A9A9}{\text{13}}&\quad\qquad\text{print($^{\backprime\backprime}$L'aire sous la courbe vaut environ : $^{\prime\prime}$)} \ \textcolor{#A9A9A9}{\text{14}}&\quad\qquad\text{print(c / n, $^{\backprime\backprime}$u.a.$^{\prime\prime}$)} \end{aligned} |
Exécutez ce programme pour la fonction , avec points à choisir aléatoirement :
- Faites-le plusieurs fois et donnez une approximation de .
Maintenant, calculez, comme vous l’avez appris en cours :
- Confrontez les résultats.
reste valable pour toute fonction continue et positive sur , si son maximum sur cet intervalle est inférieur ou égal à . (Sinon, le carré ne contiendrait pas tout le domaine dont on cherche l’aire…)
- Vous pouvez essayer avec la fonction carrée, dont, pour confrontation, on calcule facilement l’intégrale sur :
Une fonction Python améliorée
Une fonction Python améliorée
Nous l’avons dit, la fonction que nous avons programmée ne fonctionne que si on travaille sur l’intervalle avec une fonction positive dont le maximum est inférieur ou égal à .
Nous allons donner ci-dessous une fonction , qui sera plus générale.
Cette fonction prendra pour arguments :
- une fonction , comme dans le précédent programme ;
- les bornes et de l’intervalle sur lequel on souhaite travailler () ;
- la « hauteur » du rectangle, qui doit donc inclure l’ensemble du domaine dont on cherche l’aire :
- on pourra déterminer graphiquement, si on a une représentation graphique de , on choisira alors supérieur ou égal au maximum de la fonction sur (choisir le plus proche possible du maximum) ;
- si on connaît le maximum, on pourra l’entrer directement ;
- si on sait juste que admet un maximum sur en , on peut mettre directement en argument, pour : ;
- si admet un maximum en ou (pour une fonction monotone sur , par exemple), on peut tout simplement mettre , le programme prendra la plus grande valeur entre et ;
- le nombre de points que nous souhaitons.
Pour générer un nombre aléatoire non plus compris entre et , mais compris entre et , on utilise la fonction présente dans le module :
\begin{aligned} \textcolor{#A9A9A9}{\text{1}}&\quad\text{from random import $\ast$} \\ \textcolor{#A9A9A9}{\text{2}}& \\ \textcolor{#A9A9A9}{\text{3}}&\quad\text{def aire2(f, a, b, h, n):} \\ \textcolor{#A9A9A9}{\text{4}}&\quad\qquad\text{l = b - a} \\ \textcolor{#A9A9A9}{\text{5}}&\quad\qquad\text{if h == 0:} \\ \textcolor{#A9A9A9}{\text{6}}&\quad\qquad\qquad\text{h = max(f(a), f(b))} \\ \textcolor{#A9A9A9}{\text{7}}&\quad\qquad\text{r = l $\ast$ h} \\ \textcolor{#A9A9A9}{\text{8}}&\quad\qquad\text{c = 0} \\ \textcolor{#A9A9A9}{\text{9}}&\quad\qquad\text{for i in range(n):} \\ \textcolor{#A9A9A9}{\text{10}}&\quad\qquad\qquad\text{x = uniform(a, b)} \\ \textcolor{#A9A9A9}{\text{11}}&\quad\qquad\qquad\text{y = uniform(0, h)} \\ \textcolor{#A9A9A9}{\text{12}}&\quad\qquad\qquad\text{if y <= f(x):} \\ \textcolor{#A9A9A9}{\text{13}}&\quad\qquad\qquad\qquad\text{c = c + 1} \\ \textcolor{#A9A9A9}{\text{14}}&\quad\qquad\text{print($^{\backprime\backprime}$L'aire sous la courbe vaut environ :$^{\prime\prime}$)} \\ \textcolor{#A9A9A9}{\text{15}}&\quad\qquad\text{print(r $\ast$ c / n, $^{\backprime\backprime}$u.a.$^{\prime\prime}$)} \end{aligned} |
Ce programme Python ne fonctionne toujours que pour les fonctions positives sur .
La fonction est continue, positive et strictement croissante sur .
- En vous servant du dernier programme, donnez une valeur approchée de :
- Calculez maintenant la valeur exacte de .