{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d54b4116-d2ec-4cbf-b914-68a322028a25",
   "metadata": {},
   "source": [
    "# Intégration numérique et application"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "308b01b9",
   "metadata": {},
   "source": [
    "> <font size='3'>**En fin de séance, rendre le fichier source Jupiter Notebook *(.ipynb)* de votre TP obtenu <span style=\"color:red\">après les 3 heures</span> de travail.**<br><br>\n",
    "**Rendre précisément <span style=\"color:red\">une semaines après</span> la séance de TP le fichier source final comportant les reponses aux questions et les calculs demandés.**<br><br>\n",
    "Le but de cette séance est d'étudier les méthodes permettant d'obtenir la valeur numérique de l'intégrale. <br><br>\n",
    "Vous allez comparer les valeurs théoriques obtenues à l'aide des notions vu en CM avec les valeurs qu'on peut obtenir à l'aide de ces méthodes.<br><br>\n",
    "\n",
    "<font size='3'>**Ces travaux, contenant vos codes, vos réponses aux questions, seront utilisés pour évaluer les compétences suivantes**</font>\n",
    "- Identifier un modèle mathématique lors de la mise en équation d'une expérience scientifique.\n",
    "- Effectuer un calcul élémentaire à l'aide d'un logiciel de calcul symbolique ou numérique.- Interpréter les résultats obtenus afin de répondre à une problématique.\n",
    "- Utiliser les outils de communication courants.\n",
    "- Structurer/rédiger/présenter selon une méthodologie adaptée.\n",
    "    \n",
    "**Cette évaluation comptera pour 20 % de votre note finale dans ce cours.**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1945a7aa",
   "metadata": {},
   "source": [
    "## Le problème physique\n",
    "\n",
    "On lance une balle de tennis de masse $M$ verticalement et vers le haut avec une certaine vitesse initiale $v_0$ et on souhaite calculer le temps mis pour atteindre le sommet de sa trajectoire, autrement dit au bout de combien de temps sa vitesse instantanée s’annulera.\n",
    "\n",
    "La balle est soumise à deux forces : son poids $\\overrightarrow{M}g$, dirigé vers le bas, et la résultante $f$ des\n",
    "forces de frottement qui s’exerce verticalement et en sens inverse du mouvement, c’est-à-dire également vers le bas pendant son ascension. On la représente par un point matériel de masse $M$ dont la position $z(t)$ est repérée sur un axe vertical orienté vers le haut, avec comme origine le point de départ vers les cieux au temps $t=0$. \n",
    "\n",
    "La vitesse algébrique $v(t)=z^{\\prime}(t)$ sur cet axe s'annule au temps $T$ et on restreint l'étude à l'intervalle de temps $[0, T]$.\n",
    "\n",
    "Le principe fondamental de la dynamique s'écrit $M \\vec{\\gamma}=M \\vec{g}+\\vec{f}$ où $\\vec{\\gamma}$ est l'accélération.\n",
    "\n",
    "On considère une loi de frottement $\\vec{f}$ quadratique, c'est-à-dire dont la norme est proportionnelle au carré de la vitesse, $\\|\\vec{f}\\|=K v^2$ avec $K=C_x \\rho S / 2$ où :\n",
    "\n",
    "$C_x$ (adimensionel) est le coefficient aérodynamique,\n",
    "\n",
    "$\\rho\\left(\\mathrm{kg} / \\mathrm{m}^3\\right)$ est la masse volumique de l'air,\n",
    "\n",
    "$S\\left(m^2\\right)$ est l'aire de la surface apparente du mobile perpendiculairement à la direction du mouvement. \n",
    "\n",
    "Ici on aura $S=\\pi \\displaystyle\\frac{D^2}{4}$ où $D$ est le diamètre de la balle.\n",
    "\n",
    "L'équation (scalaire) du mouvement s'écrit donc\n",
    "$$\n",
    "M z^{\\prime \\prime}(t)=-M g-K v(t)^2,\n",
    "$$\n",
    "ou encore (sans faire figurer la variable de temps $t$ ) :\n",
    "$$\n",
    "M v^{\\prime}=-M g-K v^2 .\n",
    "$$\n",
    "\n",
    "### I. Travail théorique sur le problème physique:\n",
    "\n",
    "1. Démontrer que cette équation peut également s'écrire\n",
    "\n",
    "$$\n",
    "v^{\\prime} h(v)=-g, \\hspace{5cm} (1)\n",
    "$$\n",
    "\n",
    "où l'on trouvera après calculs, $h(v)=\\left(1+\\frac{K}{M g} v^2\\right)^{-1}$.\n",
    "\n",
    "1. Soit $H$ la primitive de $h$ qui s'annule en zéro : $H(v)=\\displaystyle\\int_0^v \\frac{d s}{1+\\frac{K}{M g} s^2}$.\n",
    "\n",
    "    1. Montrer, en intégrant les deux membres de (1) entre $t=0$ et $t=T$ et en se souvenant que $v(T)=0$ que l'on obtient $T=\\displaystyle\\frac{1}{g} H\\left(v_0\\right)$.\n",
    "    \n",
    "    1. Calculer $T$ en l'absence de frottements $(K=0)$; cela produit un ordre de grandeur de la valeur recherchée."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9653cdee",
   "metadata": {},
   "source": [
    "> I. **Vos réponses ici. (Rediger les reponses en $\\LaTeX$)**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "995a5887",
   "metadata": {},
   "source": [
    "Le calcul exact de $H\\left(v_0\\right)$ ne présente (comme on le verra dans la partie III)  en réalité pas de difficulté particulière lorsque le frottement est quadratique. Il n'en est pas de même si on remplace, dans la loi de frottement, $v^2$ par $v^\\alpha$ avec $\\alpha$ qui n'est ni entier, ni demi-entier, ni un nombre fractionnaire : par exemple $\\alpha=\\sqrt{2}$. L'objectif du TP est d'utiliser une méthode numérique parmi celles, très simples, présentées sur un exemple dans la section suivante pour calculer ce temps $T$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2c413e84",
   "metadata": {},
   "outputs": [],
   "source": [
    "# En python, on commence toujours par importer les bibliothèques nécessaires\n",
    "\n",
    "import matplotlib.pyplot as plt \n",
    "import numpy as np\n",
    "import math as math"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fafa1ce5",
   "metadata": {},
   "source": [
    "### II. Travail préliminaire sur les méthodes numériques\n",
    "\n",
    "Dans cette partie, nous introduisons une fois pour toutes les données de test suivantes :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "32ee57e4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# f : fonction à integrer\n",
    "def f(x):\n",
    "    return 1/x\n",
    "\n",
    "# g : la primitive qui s annule en x=1\n",
    "def g(x):\n",
    "    return np.log(x)\n",
    "\n",
    "\n",
    "a = 1;      # extremite gauche\n",
    "b = 2;      # extremite droite\n",
    "n = 100;    # nombre de sous-intervalles"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c9e93ad",
   "metadata": {},
   "source": [
    "1. Ci-dessous dans une nouvelle cellule, recopier la fonction **I_rect_gauche** du fichier de présentation des méthodes numériques."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c12ee7b5",
   "metadata": {},
   "outputs": [],
   "source": [
    "def I_rect_gauche(f,a,b,n):\n",
    "    return"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "272ee98b",
   "metadata": {},
   "source": [
    "2. Expliquer très précisément les deux dernières lignes de code en les reliant aux quantités mathématiques."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bcd13ed3",
   "metadata": {},
   "source": [
    "> **Votre réponse ici.**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78c4920a",
   "metadata": {},
   "source": [
    "3. Puis, tester la méthode des rectangles avec point à gauche."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "61431982",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(\"Une approximation de l'intégrale de f sur [\",a,\",\",b,\"] par la méthode des rectangles\")\n",
    "print(\"avec\",n,\"point(s) à gauche est I_rect_gauche =\", I_rect_gauche(f,a,b,n))\n",
    "print(\"La valeur numérique donnée par la primitive g de f est :\", g(b)-g(a))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e6a9786",
   "metadata": {},
   "source": [
    "4. Programmer **I_rect_droite** sur le même modèle que **I_rect_gauche**. Tester la méthode des rectangles avec point à droite."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f59efd98",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "2902ca1f",
   "metadata": {},
   "source": [
    "La fonction à intégrer étant décroissante, nous constatons que les méthodes avec point à gauche et point à droite fournissent des valeurs approchées respectivement par excès et par défaut. Expliquer pourquoi."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "46d3d282",
   "metadata": {},
   "source": [
    "> **Votre réponse ici.**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "811af845",
   "metadata": {},
   "source": [
    "**Remarque (importante pour la partie III).** On a toujours \n",
    "$$\n",
    "I\\_rect\\_gauche - I\\_rect\\_droite =\\sum_{i=0}^{n-1}(f(x_i)-f(x_{i+1}))\\,h=(f(x_0)-f(x_n))\\,h\n",
    "= (f(a)-f(b))\\,\\frac{b-a}{n}.\n",
    "$$ \n",
    "Ceci donne l’amplitude de l’encadrement de I par les méthodes des rectangles avec point à droite et à gauche en fonction du nombre n de sous-intervalles lorsque la fonction f est monotone en prenant la valeur absolue."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9f878209",
   "metadata": {},
   "source": [
    "5. Programmer et tester les méthodes **I_point_milieu** et  **I_trapeze**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "13837305",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "6fc131b9",
   "metadata": {},
   "source": [
    "6. Estimer l'erreur absolue pour chaque méthode. Pour le faire, calculer la valeur absolue de la différence entre chaque valeur calculée numériquement et la valeur théorique. Quelle méthode est la plus précise ? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d3921ea7",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "93ef8003",
   "metadata": {},
   "source": [
    "### III. Application au problème de la balle"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83aa05a4",
   "metadata": {},
   "source": [
    "On revient au problème physique de  la balle. On utilisera les valeurs numériques suivantes :\n",
    "$$\n",
    "M=5,5\\,10^{-2}\\,kg,\\   D=6,7\\;10^{-2}\\,m,\\  C_x=0,44,\\\\\n",
    "v_0=15\\, m\\,s^{-1},\\ \\rho=1,29\\,kg\\,m^{-3},\\ g=9,81\\,m\\,s^{-2}.\n",
    "$$\n",
    "\n",
    "1. Calculer la valeur exacte de $T$ à l'aide du changement de variable $u=s\\,\\sqrt{\\frac{K}{Mg}}$ dans l'intégrale définissant $H(v_0)$, et faire l'application numérique à l'aide des données ci-dessus."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31a7465a",
   "metadata": {},
   "source": [
    "> **Votre réponse ici.**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05dded51",
   "metadata": {},
   "source": [
    "2. Calculer une valeur approchée de $T$ avec $n=150$ à l'aide de chacune des méthodes numériques programmées précédemment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "14d64808",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "6830ca52",
   "metadata": {},
   "source": [
    "3. Comment faire pour obtenir un encadrement $[T^{-},T^{+}]$ de $T$ d'amplitude inférieure à $10^{-5}$? On pourra remarquer que la fonction à intégrer, $h$, est décroissante et utiliser les  méthodes des rectangles à gauche et à droite en adaptant le calcul de la **Remarque**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "964433a3",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "300f1a17",
   "metadata": {},
   "source": [
    "#### Questions bonus\n",
    "\n",
    "4. Écrire une fonction permettant de trouver une valeur de $n$  pour laquelle la méthode du point milieu fournit une valeur approchée $T_{ap}$ avec une erreur relative inférieure à $10^{-3}$ *i.e.*\n",
    "$$\n",
    "\\big(T^{+} - T^{-} \\big)/ |T_{ap}| < 10^{-3}\n",
    "$$\n",
    "où $T^{-}$ et $T^{+}$ sont définis dans la question 3. \n",
    "**Indication :** commencer par $n=1$ puis doubler jusqu'à obtenir le résultat désiré (plus rapide que d'augmenter $n$  d'une unité à chaque itération). On utilisera l'instruction **while** (<< tant que >>) avec une condition logique."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fc028c1a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "bd9d0149",
   "metadata": {},
   "source": [
    "5. Utiliser la méthode du point milieu pour calculer une valeur approchée de $T$, avec la valeur de $n$ obtenue précédemment, lorsque l'on remplace $v^2$ par $v^{\\sqrt{2}}$ dans la loi de frottement. \n",
    "\n",
    "On pourra ensuite verifier la valeur obtenue à l'aide de Python. Pour cela on utilisera la methode **quad** de **scipy.integrate**. La sortie de la méthode contient deux éléments, le premier élément contenant la valeur estimée de l'intégrale et le second élément contenant une estimation de l'erreur d'intégration absolue."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "50d534ef",
   "metadata": {},
   "outputs": [],
   "source": [
    "# on définit une nouvelle loi de frottement\n",
    "def h1_v(v):\n",
    "    return 1/(1+c**2*v**(sqrt(2)))\n",
    "\n",
    "\n",
    "# verification à l'aide de Python\n",
    "\n",
    "# from scipy.integrate import quad\n",
    "# I = quad(h1_v, 0, v0)\n",
    "# print (I) \n",
    "# print(1/g * I[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7992d798",
   "metadata": {},
   "source": [
    "6. On considère une loi de frottement linéaire donnée par \n",
    "    $$\\|{\\vec{f}}\\|= K'|{v}|=K'\\,v$$ \n",
    "    \n",
    "(dans la phase de montée où $v\\geq 0$) avec $K'=3\\pi D\\eta$ où $\\eta$ est le coefficient de viscosité de l'air qu'on prendra égal à $1,8\\,10^{-5}\\, kg\\,m^{-1}\\,s^{-1}$ (à $20^{\\circ}\\,C$). Cette loi de frottement ne s'applique en principe qu'aux faibles vitesses ($<5m/s$). On obtient alors :$$M v' = -Mg - K'v.$$\n",
    "<ol type=\"a\">   \n",
    "    <li> Résoudre l'équation différentielle de manière exacte.</li>\n",
    "    <li>  Déterminer la valeur exacte de $T$, puis faire l'application numérique.</li>\n",
    "    <li>  En déduire la hauteur maximale atteinte.</li>\n",
    "<ol type=\"a\">"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c066cde9",
   "metadata": {},
   "source": [
    "> **Votre réponse ici.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1e819d50",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "2ac0263f",
   "metadata": {},
   "source": [
    "7. Déterminer la hauteur atteinte avec la loi de frottement en $v^2$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b00fe7b0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
