{ "cells": [ { "cell_type": "markdown", "metadata": { "tags": [ "pi", "Approximation", "première", "générale", "Monte-Carlo" ] }, "source": [ "# Approximation du nombre $\\pi$ par la méthode de Monte-Carlo" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "première-générale", "spécialité" ] }, "source": [ "## Présentation de l'activité\n", "- **Niveau de classe :** \n", " - Classe de première de la voie générale (spécialité mathématiques)\n", " - Classe de première de la voie technologique (tronc commun).\n", "- **Référence au programme :** \n", " - Spécialité mathématiques de première générale: *Méthode de Monte Carlo : estimation du nombre $\\pi$*.\n", "- **Description :** Activité de découverte d'un méthode probabiliste d'estimation : la méthode de Monte-Carlo. Le but ici est d'estimer l'aire du quart de disque de rayon $1$ afin d'obtenir une approximation du nombre $\\pi$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Objectifs\n", "Il est courant d'utiliser des nombres aléatoires pour estimer des quantités numériques. Nous allons ici utiliser des variables aléatoires de loi uniforme afin d'estimer le nombre $\\pi$. \n", "Pour cela nous allons:\n", "- générer des points aléatoirement et uniformément dans un carré de coté 1;\n", "- calculer la proportion de points situés en dessous du quart de cercle de rayon 1. Cela nous permettra de donner une estimation de son aire;\n", "- approcher le nombre $\\pi$ sachant que l'aire d'un quart de disque de rayon 1 est $\\frac{\\pi}{4}$. \n", "\n", "![Monte Carlo](img/monteCarlo.png \"Méthode de Monte Carlo\")" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "estimation", "simulation", "random" ] }, "source": [ "## Estimation\n", "La fonction `random` de la librairie `random` permet de générer un nombre aléatoirement et uniformément entre 0 et 1." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.108\n" ] } ], "source": [ "from random import random as rd\n", "\n", "nbPoints = 1000\n", "\n", "s = 0\n", "for i in range(nbPoints):\n", " x,y = rd(),rd()\n", " if x**2+y**2<1:\n", " s=s+1\n", "estimPi = 4*s/nbPoints\n", "\n", "print(estimPi)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "Suggestions pédagogiques\n", "\n", "
\n", "\n", "* **Expliquer un programme** \n", " - Que représente la variable `s` ? \n", " - Expliquer la ligne 8.\n", " \n", "* **Compléter un programme** \n", "\n", " - Le programme précédent étant fourni en remplaçant la ligne 8 par `if ...`, demander aux élèves de compléter la ligne 8. \n", " - Le programme précédent étant fourni en remplaçant la ligne 10 par `estimPi = ...`, demander aux élèves de compléter la ligne 10. \n", "* **Écrire un programme**\n", "\n", " Écrire un programme générant des points de coordonnées aléatoires entre 0 et 1 et comptant la proportion de points situés dans le disque de centre $(0,0)$ et de rayon $0,5$\n", "* **Tester** l'estimation du nombre $\\pi$ pour différents nombres de points générés." ] }, { "cell_type": "markdown", "metadata": { "tags": [ "convergence" ] }, "source": [ "## Convergence\n", "Nous allons maintenant utiliser les listes afin de stocker au fur et à mesure des estimations de $\\pi$ obtenues en faisant varier le nombre de points générés.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "### cte ###\n", "N=500\n", " \n", "estimation = []\n", "somme = 0\n", "for i in range(N):\n", " (x,y) = (rd(),rd())\n", " if x**2+y**2<1:\n", " somme = somme + 1\n", " estimation.append(4*somme/(i+1))\n", "\n", "plt.plot([0,N],[3.14,3.14],color='m')\n", "plt.text(N+2,3.13,\"$\\pi$\",color='m',fontsize=14)\n", "plt.title(\"Estimation de $\\pi$ avec {} points: $\\pi\\simeq${}\".format(N,estimation[-1]),color=\"#1e7fcb\",fontsize=14)\n", "plt.plot(estimation)\n", "plt.show()\n", "\n", " \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "Suggestions pédagogiques\n", "\n", "
\n", "\n", "* **Expliquer un programme**\n", "\n", " Que contient la liste `estimation` ?\n", " \n", "* **Compléter un programme**\n", "\n", " Le programme précédent étant fourni en remplaçant la ligne 13 par `estimation.append(...)`, demander aux élèves de compléter la ligne 13." ] }, { "cell_type": "markdown", "metadata": { "tags": [ "Animation" ] }, "source": [ "## Animation susceptible d'être présentée aux élèves\n", "L'animation suivante permet d'illustrer la méthode de Monte Carlo. Des points sont choisis aléatoirement, s'ils sont dans le quart de cercle, ils prennent la couleur verte, sinon ils prennent la couleur rouge. La figure de droite illustre comment la fréquence de points verts approche $\\pi$." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "Animation" ] }, "outputs": [], "source": [ "import matplotlib.animation\n", "from IPython.display import HTML\n", "\n", "#cte\n", "N = 200\n", "\n", "#paramètres figure\n", "fig, (ax1, ax2) = plt.subplots(1, 2,figsize=(10, 6))\n", "ax1.set_xlim(( 0, 1))\n", "ax1.set_ylim((0, 1))\n", "ax2.set_xlim(( 0, N))\n", "ax2.set_ylim((1.9, 4.1))\n", "ax1.set_aspect('equal')\n", "ax2.set_aspect(N//4)\n", "\n", "Xin,Yin,Xout,Yout = [],[],[],[]\n", "somme = 0\n", "pis = []\n", "pointsIn, = ax1.plot([],[],'go')\n", "pointsOut, = ax1.plot([],[],'ro')\n", "estimation = ax2.text(N//2-N//4,1.2,'Estimation',color=\"#1e7fcb\",fontsize=14)\n", "courbe, = ax2.plot([],[])\n", "\n", "def init():\n", " pointsIn.set_data([], [])\n", " pointsOut.set_data([], [])\n", " estimation.set_text(\"0\")\n", " courbe.set_data([], [])\n", " circle1 = plt.Circle((0, 0), 1, color='gray', alpha=0.1)\n", " ax1.add_artist(circle1)\n", " ax2.plot([0,N],[3.14,3.14],'m-')\n", " ax2.text(N+0.5,3.1,'$\\pi$',color=\"m\",fontsize=14) \n", " ax2.set_title('4 x Proportion de points dans le quart de disque')\n", " return (pointsIn,) \n", "\n", "def animate(i):\n", " global somme\n", " x,y = rd(),rd()\n", " if x**2+y**2<1:\n", " somme +=1\n", " Xin.append(x)\n", " Yin.append(y)\n", " pointsIn.set_data([Xin,Yin])\n", " else:\n", " Xout.append(x)\n", " Yout.append(y)\n", " pointsOut.set_data([Xout,Yout])\n", " pis.append(4*somme/(i+1)) \n", " estimation.set_text(\"$\\pi\\simeq${} avec {} points\".format(int(1000*pis[i])/1000,i+1))\n", " courbe.set_data(range(i+1),pis)\n", " return (pointsIn,)\n", "plt.close ()\n", "ani = matplotlib.animation.FuncAnimation(fig, animate, frames=N,init_func=init,blit=True)\n", "# l'un ou l'autre\n", "HTML(ani.to_jshtml())\n", "#HTML(ani.to_html5_video())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "Remarque\n", "\n", "
\n", "\n", "Il peut être intéressant d'utiliser la courbe en mode 'pas à pas' pour montrer aux élèves que lorsqu'un point vert apparaît la courbe monte et que lorsqu'un point rouge apparaît, elle descend." ] } ], "metadata": { "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.5" } }, "nbformat": 4, "nbformat_minor": 2 }