TD H2 : Matplotlib, calculs d'aire sous une courbe par la méthode de Monte-Carlo¶
Pour calculer l'aire sous une courbe, une technique statistique consiste à encadrer cette courbe dans un rectangle et tirer aléatoirement des points dans ce rectangle. Le rapport du nombre de points tombés sous la courbe par rapport aux nombres de points tirés au total et le même que le rapport de l'aire sous la courbe par rapport à l'aire du rectangle... Voir l'image suivante:
Q1. Compléter le script ci-dessous en suivant les étapes suivantes:
- Écrire une fonction python
f1(x : float)-> float
qui reçoit un nombre et renvoie son carré. - Écrire une fonction python
dessine_f(f,xmin,xmax)
qui trace la représentation graphique de la fonction f pour x entre xmin et xmax à l'aide du module matplotlib. - Écrire une fonction python
dessine_zone(xmin,ymin,xmax,ymax)
qui trace un rectangle dont les coins on pour coordonnées (xmin,ymin) et (xmax,ymax) représentant la zone de tirage des points (on utilisera également la fonction plot du module matplotlib). - Écrire une fonction
dessine_monte_carlo(xmin,ymin,xmax,ymax,f)
qui dessine le tirage des points aléatoirement (en rouge au dessus de la courbe et en bleu en dessous) et qui renvoie une estimation de l'aire sous la courbe (n'hésitez pas à chercher de l'aide sur l'utilisation de la fonctionuniform
du modulerandom
):
import matplotlib.pyplot as plt
import math
from random import uniform
# à compléter...
xmin, ymin = 0,0
xmax, ymax = 1,1
plt.figure(1)
plt.clf()
dessine_f(f1,xmin,xmax)
dessine_zone(xmin,ymin,xmax,ymax)
aire = dessine_monte_carlo(xmin,ymin,xmax,ymax,f1)
print(f"Estiamtion de l'aire : {aire}")
plt.show()
Estiamtion de l'aire : 0.36
Q2. Savez-vous déterminer l'aire exacte sous cette courbe? Combien vaut-elle ?
Réponse : ...
Q3. On considère maintenant la fonction $f(x)=\sqrt{4-x^2}$ pour $x\in[0,2]$.
Q3a. Compléter le script ci-dessous pour qu'il trace cette courbe et calcule l'aire en dessous.
def f2(x):
return math.sqrt(4-x*x)
xmin, ymin = 0,0
xmax, ymax = 2,2
plt.figure(2)
plt.clf()
# à compléter
dessine_f(f2,xmin,xmax)
dessine_zone(xmin,ymin,xmax,ymax)
aire = dessine_monte_carlo(xmin,ymin,xmax,ymax,f2)
print(f"Estimation de l'aire : {aire}")
plt.axis('equal') # pour rendre le repère orthonormé
plt.show()
Estimation de l'aire : 3.0
Q3b. Montrer que cette courbe est un quart de cercle de rayon 2 et donner la valeur exacte de l'aire estimée à la question précédente.
Réponse : La distance du point (0,0) au point (x,f(x)) vaut toujours 2 (car $x^2+\sqrt(4-x^2)^2=4$), donc cette courbe est bien une partie su cercle de centre O et de rayon 2. Son aire vaut un quart de l'aire du disque, d'où aire = $\pi*4/4=\pi$.
Q4. Pour ceux qui sont plus à l'aise, écrire une fonction python zone(f,xmin,xmax)
qui renvoie ymin et ymax (min et max de la fonction pour x entre xmin et xmax).
def zone(f,xmin,xmax):
dx = 0.01
x = xmin
ymin = f(x)
ymax = f(x)
while x <= xmax-dx :
x += dx
y = f(x)
if y>ymax : ymax = y
if y<ymin : ymin = y
return ymin,ymax
# On teste avec f1 par exemple
print(zone(f2,0,2))
(0.1997498435543669, 2.0)