{"cells":[{"metadata":{},"cell_type":"markdown","source":"![En tête general](https://raw.githubusercontent.com/PythonLycee/PyLyc/master/img/En_tete_general.png)\n\n\n© Copyright Franck CHEVRIER 2019-2022 https://www.python-lycee.com.
\nLes activités partagées sur Capytale sont sous licence Creative Commons.\n\n Pour exécuter une saisie Python, sélectionner la cellule et valider avec SHIFT+Entrée.\n"},{"metadata":{},"cell_type":"markdown","source":"# Méthode de Monte Carlo (corrigé) "},{"metadata":{},"cell_type":"markdown","source":"Dans un repère orthonormé, on considère les surfaces $C$ et $P$ définies respectivement par :\n\n$ C=\\left\\{ \\;M(x;y) \\; / \\; 0 \\leqslant x \\leqslant 1 \\;; \\; 0 \\leqslant y \\leqslant 1 \\; \\right\\} $\n\n$ P=\\left\\{ \\;M(x;y) \\; / \\; 0 \\leqslant x \\leqslant 1 \\;; \\; 0 \\leqslant y \\leqslant x^2 \\; \\right\\} $\n"},{"metadata":{},"cell_type":"markdown","source":"__1. Identifier ces deux surfaces et les représenter dans le repère fourni.__\n\n![Repère à compléter](https://raw.githubusercontent.com/PythonLycee/PyLyc/master/img/Monte_Carlo_repere.png)\n\n__Déterminer l’aire de $C$.__"},{"metadata":{},"cell_type":"markdown","source":"*Le but de l’activité est de déterminer des valeurs approchées de l’aire de la surface $P$ à l’aide d’une méthode probabiliste.*\n\n*On admet que lorsqu’on tire aléatoirement un point dans $C$, la probabilité qu’il soit dans $P$ vaut $\\displaystyle \\frac{Aire(P)}{Aire(C)} $.* \n\n*Ainsi, lorsqu’on tire aléatoirement plusieurs points dans $C$, la fréquence de ces points qui sont dans $P$ fournit une valeur approchée de $\\displaystyle \\frac{Aire(P)}{Aire(C)} $, d’autant plus précise que le nombre de points est grand.*\n\n Pour une présentation de la méthode, voir la vidéo suivante.\n\n"},{"metadata":{},"cell_type":"markdown","source":"__2. Tester puis modifier la fonction MonteCarlo donnée ci-dessous pour qu’elle reçoive un entier $n$ en argument et place $n$ points aléatoires de $C$ sur le graphique.__\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Modifier la fonction\n\nfrom random import random # import de la fonction pour gérer l'aléatoire\nimport matplotlib.pyplot as plt # import des fonctionnalités graphiques\n\ndef MonteCarlo(n):\n \n # initialisation du graphique\n plt.figure()\n \n # répétition n fois\n for k in range(n):\n # generation de coordonnees aleatoires entre 0 et 1 pour un point M dans C\n x,y=random(),random() \n # placement du point M dans le repere (en bleu)\n plt.scatter(x,y,color='blue') \n \n # reglage des bornes des axes du repere\n plt.axis([0,1,0,1]) \n # ouverture de la fenetre graphique et affichage\n plt.show() \n \n return None","execution_count":1,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Tester la fonction\nMonteCarlo(250)","execution_count":2,"outputs":[{"output_type":"display_data","data":{"application/javascript":"element.append(window._basthonDomNodeBus.pop(0));"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"__3. Créer une fonction dans_P qui reçoit en argument les coordonnées $(x;y)$ d’un point de $C$ et renvoie True si ce point appartient à $P$ et False sinon.__\n\t"},{"metadata":{"trusted":true},"cell_type":"code","source":"def dans_P(x,y):\n return y<=x**2","execution_count":3,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"__4. Modifier la fonction MonteCarlo pour qu’elle place les points appartenant à $P$ en rouge et les autres en bleu.__
\n$\\;\\;\\;$__On utilisera la fonction dans_P pour le test.__\n\n
\n Remarque :"},{"metadata":{"trusted":true},"cell_type":"code","source":"def MonteCarlo_2(n):\n\n # initialisation du graphique\n plt.figure()\n \n for k in range(n):\n # generation de coordonnees aleatoires entre 0 et 1 pour un point M dans C\n x,y=random(),random() \n \n if dans_P(x,y):\n # placement du point M dans le repere (en rouge)\n plt.scatter(x,y,color='red') \n \n else:\n # placement du point M dans le repere (en bleu)\n plt.scatter(x,y,color='blue') \n\n # reglage des bornes des axes du repere\n plt.axis([0,1,0,1]) \n # ouverture de la fenetre graphique et affichage\n plt.show() \n \n return None\n\nMonteCarlo_2(250)","execution_count":4,"outputs":[{"output_type":"display_data","data":{"application/javascript":"element.append(window._basthonDomNodeBus.pop(0));"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"__5. Modifier la fonction MonteCarlo pour :__\n* __qu’elle compte le nombre de points placés qui sont dans $P$ ;__\n* __qu’elle calcule la fréquence $f$ de ces points ;__\n* __qu’elle renvoie cette fréquence $f$.__\n\n\n*On pourra également faire apparaître cette fréquence dans la fenêtre à l’aide de l’instruction suivante :* plt.text(0,-0.1,\"Fréquence des points dans P: \"+str(f))*.*\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"def MonteCarlo_3(n):\n \n # initialisation du graphique\n plt.figure()\n \n # initialisation du compteur de points dans P\n compteur=0\n \n for k in range(n):\n # generation de coordonnees aleatoires entre 0 et 1 pour un point M dans C\n x,y=random(),random() \n \n if dans_P(x,y):\n # placement du point M dans le repere (en rouge)\n plt.scatter(x,y,color='red') \n # incrementation du compteur\n compteur = compteur+1\n else:\n # placement du point M dans le repere (en bleu)\n plt.scatter(x,y,color='blue') \n \n # calcul de la fréquence de points dans P\n f=compteur/n\n # affichage de la frequence dans la fenetre \n plt.text(0,-0.2,\"Fréquence des points dans C: \"+str(f))\n \n # reglage des bornes des axes du repere\n #\n plt.axis('equal')\n plt.axis([0,1,0,1]) \n # ouverture de la fenetre graphique et affichage\n plt.show() \n \n return f","execution_count":5,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"__6. En appelant la fonction MonteCarlo avec $n=50$ ; $n=100$ ; … donner des approximations de l’aire de la surface $P$.__"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Effectuer un appel à la fonction précédente ici\nMonteCarlo_3(1000)\n","execution_count":6,"outputs":[{"output_type":"display_data","data":{"application/javascript":"element.append(window._basthonDomNodeBus.pop(0));"},"metadata":{}},{"output_type":"execute_result","execution_count":6,"data":{"text/plain":"0.339"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"__7. On considère la surface $ D=\\left\\{ \\;M(x;y) \\; / \\; 0 \\leqslant x \\leqslant 1 \\;; \\; 0 \\leqslant y \\leqslant 1 \\;; \\; x²+y² \\leqslant 1 \\; \\right\\} $.__\n\n__Identifier cette surface $D$, et représenter $C$ et $D$ dans le repère fourni.__\n\n![Repère à compléter](https://raw.githubusercontent.com/PythonLycee/PyLyc/master/img/Monte_Carlo_repere.png)\n\n__Déterminer la valeur exacte de l’aire de $D$.__\n\n"},{"metadata":{},"cell_type":"markdown","source":"__Adapter la méthode vue précédemment pour obtenir des approximations de $\\pi$ par la méthode de Monte-Carlo.__ "},{"metadata":{"trusted":true},"cell_type":"code","source":"#redéfinition de P\ndef dans_P(x,y):\n return x**2+y**2<=1\n\n\napprox_pi=4*MonteCarlo_3(1000)\n\napprox_pi","execution_count":7,"outputs":[{"output_type":"display_data","data":{"application/javascript":"element.append(window._basthonDomNodeBus.pop(0));"},"metadata":{}},{"output_type":"execute_result","execution_count":7,"data":{"text/plain":"3.188"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"© Copyright Franck CHEVRIER 2019-2022 https://www.python-lycee.com.
En cas de problème de perception des couleurs, on pourra remplacer la désignation des couleurs 'blue' et 'red' (rouge et bleu) par 'silver' et 'black' (gris argenté et noir).\n