{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Chapitre 11 : \"L'écosystème Python\"\n",
    "\n",
    "### <span class=\"bg-info\">« *Ils ne savaient pas que c'était impossible, alors ils l'on fait* »</span>\n",
    "\n",
    "Mark Twain"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### <span class=\"bg-success\">CE QU'IL FAUT RETENIR</span>\n",
    "\n",
    "- Python est fourni avec une bibliothèque standard de plus de 200 modules ;\n",
    "- le très riche *Python Package Index* ([PyPI](https://pypi.org/)) propose une collection de bibliothèques tierces répondant à une grande variété de besoins ;\n",
    "- le domaine scientifique est un point fort de l'écosystème Python :\n",
    "    + `IPython` est l'interpréteur de référence de la communauté scientifique ,\n",
    "    + Le projet IPython a donné lieu à deux déclinaisons importantes, Jupyter Notebook et son successeur à moyen terme JupyterLab ,\n",
    "    + la bibliothèque scientifique de base, `Numpy` ,\n",
    "    + le traitement des tableaux, `Pandas`,\n",
    "    + la bibliothèque de tracé 2D (essentiellement), `MatplotLib`,\n",
    "- les outils de documentation et de test des sources.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo11_01 ✓\n",
    "\n",
    "*Note :* Exercice adapté du MOOC [Recherche reproductible](https://www.fun-mooc.fr/courses/course-v1:inria+41016+self-paced/about).\n",
    "\n",
    "Utiliser la bibliothèque numpy pour calculer la moyenne et l'écart-type, le min, la médiane et le max des données suivantes :\n",
    "\n",
    "`14.0, 7.6, 11.2, 12.8, 12.5, 9.9, 14.9, 9.4, 16.9, 10.2, 14.9, 18.1, 7.3, 9.8, 10.9,12.2, 9.9, 2.9, 2.8, 15.4, 15.7, 9.7, 13.1, 13.2, 12.3, 11.7, 16.0, 12.4, 17.9, 12.2, 16.2, 18.7, 8.9, 11.9, 12.1, 14.6, 12.1, 4.7, 3.9, 16.9, 16.8, 11.3, 14.4, 15.7, 14.0, 13.6, 18.0, 13.6, 19.9, 13.7, 17.0, 20.5, 9.9, 12.5, 13.2, 16.1, 13.5, 6.3, 6.4, 17.6, 19.1, 12.8, 15.5, 16.3, 15.2, 14.6, 19.1, 14.4, 21.4, 15.1, 19.6, 21.7, 11.3, 15.0, 14.3, 16.8, 14.0, 6.8, 8.2, 19.9, 20.4, 14.6, 16.4, 18.7, 16.8, 15.8, 20.4, 15.8, 22.4, 16.2, 20.3, 23.4, 12.1, 15.5, 15.4, 18.4, 15.7, 10.2, 8.9, 21.0`\n",
    "\n",
    "Afficher les résultats avec 2 chiffres après le point décimal.\n",
    "\n",
    "**Attention :** pour que numpy calcule une estimation « corrigée » de l'écart type empirique, il est nécessaire de passer `ddof=1` en argument supplémentaire à la fonction `np.std`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# exo 11_01"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo11_02 ✓\n",
    "\n",
    "*Note :* Exercice adapté du MOOC [Recherche reproductible](https://www.fun-mooc.fr/courses/course-v1:inria+41016+self-paced/about).\n",
    "\n",
    "Utiliser la bibliothèque matplotlib pout réaliser deux affichages graphiques des données de l'exercice précédent.\n",
    "\n",
    "Le premier de type plot : ![plot](../data/plot.png)\n",
    "\n",
    "et le second de type histogramme : ![histogramme](../data/hist.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# exo 11_02 (plot)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# exo 11_02 (histogramme)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo11_03 ✓✓✓\n",
    "\n",
    "Problème de la chèvre.\n",
    "\n",
    "Un paysant fait brouter sa chèvre dans un champ carré de 10 m de côté. La chèvre est attachée à un piquet au milieu d'un côté.\n",
    "\n",
    "![géométrie du problème](../data/kapro.png)\n",
    "\n",
    "On demande de trouver la *longueur de la corde* pour que la chèvre broute la moitié du champ.\n",
    "\n",
    "**Notations :**\n",
    "    \n",
    "+ carré $ABCD$ de côté 10 m\n",
    "+ piquet de la chèvre en $E$, milieu de $AB$\n",
    "+ la corde de longueur `x` coupe $AD$ en $F$ et $BC$ en $G$\n",
    "+ $\\beta = \\widehat{AEF} = \\arccos{AE/EF} = \\arccos{5/x}$\n",
    "+ $\\alpha = \\widehat{FEG} = \\pi - (2 \\times \\beta)$\n",
    "\n",
    "**Indications :**\n",
    "\n",
    "On cherche par [dichotomie](https://fr.wikipedia.org/wiki/M%C3%A9thode_de_dichotomie) le zéro de la fonction : `f(x) = aire_broutée(x) - moitié de l'aire du champ`\n",
    "        \n",
    "L'aire broutée par la chèvre vaut : `aire_broutée = aire_dd - 2 * (aire_ds)`, où :\n",
    "\n",
    "+ `aire_dd` est l'aire du demi disque de rayon x : \n",
    "    - `aire_dd = pi + x**2 / 2`\n",
    "+ `aire_sc` est l'aire du segment circulaire d'angle beta et de rayon x :\n",
    "    - `aire_sc = beta * x**2 / 2 - (x**2 * sin(beta)) / 2 =  (x**2)/2 + (beta - sin(beta))`\n",
    "    \n",
    "**Algorithme à utiliser :**\n",
    "\n",
    "![bissection](../data/bissection.png)\n",
    "\n",
    "Avec :\n",
    "\n",
    "+ `a` : longueur minimale de la corde. On fixe `a` tel que $BG_a = BC / 5$\n",
    "+ `b` : longueur maximale de la corde. On fixe `b` tel que $BG_b = (4 \\times BC) / 5$\n",
    "+ $\\varepsilon$ : précision du calcul"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# exo11_03"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo11_04 ✓✓\n",
    "\n",
    "Écrire un module contenant une fonction qui reçoit un paramètre réel (l'angle polaire `theta` compris dans l'intervalle $[0, 2 \\pi]$) et qui retourne la valeur de la fonction polaire `rho(theta)`, où `rho` est le rayon polaire.\n",
    "\n",
    "La fonction retournée est : `rho(theta) = cos(3*theta)*cos(3*theta)`\n",
    "\n",
    "![polar](../data/exo11_04.png)\n",
    "\n",
    "Ajouter une fonction booléenne nommée `dedans()` qui reçoit deux paramètres, le nom d'une fonction et un tuple définissant les coordonnées cartésiennes d'un point du plan, et qui retourne **`True`** si le point est dans le domaine limité par la courbe, **`False`** sinon.\n",
    "\n",
    "Écrire un programme principal qui teste si différents points du plan appartiennent au domaine limité par la courbe. On testera en particulier le point origine.\n",
    "\n",
    "**Note :** Il est possible d'utiliser le module numpy pour définir la fonction."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# exo11_04 - module"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# exo11_04 - programme principal"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo11_05 ✓✓\n",
    "\n",
    "Écrire un module contenant une fonction qui reçoit un paramètre réel (l'angle polaire `theta` compris dans l'intervalle $[0, 2 \\pi]$) et qui retourne la valeur de la fonction polaire `rho(theta)`, où `rho` est le rayon polaire.\n",
    "\n",
    "La fonction retournée est : `rho(theta) = sin(2*theta)*sin(2*theta) + 2*cos(3*theta)*cos(3*theta)`\n",
    "\n",
    "![polar](../data/exo11_05.png)\n",
    "\n",
    "En utilisant la fonction booléenne `dedans()` de l'exercice précédent, écrire un programme principal qui teste si différents points du plan appartiennent au domaine limité par la courbe. On testera en particulier le point origine."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# exo11_05 - module"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# exo11_05 - programme principal"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo11_06 ✓\n",
    "\n",
    "La [Loi de Benford](https://fr.wikipedia.org/wiki/Loi_de_Benford) est liée à une observation empirique de la fréquence de distribution statistique de certains nombres issus du monde réel. Franck Bedford s'est aperçu que, pour des séries de nombres comme par exemple les valeurs issues d'une comptabilité, si on ne considère que le premier chifre significatif de ces valeurs, $n$, alors la répartition se fait en suivant une formule de fréquence d'apparition décroissante : \n",
    "\n",
    "$$\\log_{10}{(1 + \\frac{1}{n})}$$\n",
    "\n",
    "Écrire un programme qui calcule et affiche la fréqence des nombres selon la loi de Benford :\n",
    "\n",
    "![benford](../data/benford.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# exo11_06"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### exo11_07 ✓✓\n",
    "\n",
    "Détermination de $\\pi$ par la méthode [Monte Carlo](https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Monte-Carlo)\n",
    "\n",
    "Soit un cercle de rayon `R = 1` inscrit dans un carré de côté 2.\n",
    "\n",
    "![Monte Carlo](../data/Montecarlo_pi.png)\n",
    "\n",
    "L’aire du carré vaut $A = 2 \\times R^2$ soit $4$ et l’aire du cercle vaut $S = \\pi \\times R^2$ soit $\\pi$.\n",
    "\n",
    "En choisissant N points aléatoires uniformément distribués à l'intérieur du carré, la probabilité que ces points\n",
    "se trouvent aussi dans le disque est :\n",
    "$$p = \\frac{S}{A} = \\frac{\\pi}{4}$$\n",
    "Notons $n$, le nombre de points effectivement dans le cercle, il vient :\n",
    "$$p = \\frac{n}{N} = \\frac{\\pi}{4}$$\n",
    "\n",
    "On demande de déterminer une estimation de $\\pi$ pour N = 1000, 10000 et 100000 tirages en utilisant l'algorithme suivant :\n",
    "\n",
    "- utiliser la fonction `random.uniform()` pour tirer aléatoirement les coordonnées x et y d’un point entre -1 et 1 ;\n",
    "- calculez la distance entre le centre du cercle et ce point ;\n",
    "- si le point est effectivement dans le cercle, incrémentez le compteur n.\n",
    "\n",
    "Enfin afficher l'approximation trouvée de $\\pi$ ainsi que son erreur relative par rapport à la valeur de `math.pi`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# exo11_07"
   ]
  }
 ],
 "metadata": {
  "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.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
