{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# L3 Analyse Numérique – TP7\n",
    "\n",
    "[Dequay A](mailto:antoine.dequay@ens-rennes.fr) &\n",
    "[Le Barbenchon P](mailto:pierre.le-barbenchon@ens-rennes.fr). TP ENS Rennes\n",
    "\n",
    "[Boutin B](mailto:benjamin.boutin@univ-rennes1.fr). Cours et TP Université de Rennes 1 - UFR Mathématiques\n",
    "\n",
    "Dans ce TP, on étudiera des méthodes numériques de calcul de solutions d'équations différentielles.\n",
    "\n",
    "- Exercice 1 : *Schéma d'Euler explicite*\n",
    "- Exercice 2 : *Méthodes symplectiques*\n",
    "\n",
    "Contrairement au TP précédent, **on n'utilisera pas la bibliothèque `scipy.integrate` et sa fonction `odeint`**. Le but est de programmer des méthodes qui la remplacent à la main.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "#%pip install ffmpeg # --> optionnel"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exercice 1 : Schéma d'Euler explicite\n",
    "\n",
    "On considère un problème de Cauchy :\n",
    "\n",
    "$$ \\left \\{\n",
    "\\begin{aligned}\n",
    "\ty' &= f(t,y)\\\\\n",
    "\ty(t_0) &= y^0.\n",
    "\\end{aligned}\n",
    "\\right . $$\n",
    "\n",
    "où $f$ est une fonction définie sur un ouvert $U$ de $\\mathbb{R} \\times \\mathbb{R}^{d}$, à valeurs dans $\\mathbb{R}^d$, $(t_0,y^0) \\in U$ est la condition initiale.\n",
    "\n",
    "Sous l'hypothèse que $f$ est continue sur $U$ et *localement lipschitzienne* par rapport à sa seconde variable $y$, le **théorème de Cauchy-Lipschitz** garantit l'existence d'une unique solution maximale $y$, définie et continûment différentiable sur un intervalle $I$ ouvert contenant $t_0$.\n",
    "\n",
    "Pour simplifier, on se limitera au cas des équations autonomes (la fonction $f$ ne dépendant alors pas de $t$) vérifiant de plus que $f\\in\\mathcal{C}^1(\\mathbb{R}^d;\\mathbb{R}^d)$ est de différentielle bornée, si bien que toutes les solutions sont globales et définies de manière unique par leur valeur en $t_0=0$.\n",
    "\n",
    "En intégrant le problème de Cauchy entre deux instants $t$ et $t+h$ où $h>0$, on obtient la formulation:\n",
    "\n",
    "$$\n",
    "y(t+h)=y(t)+\\int_t^{t+h} f(s,y(s))\\mathrm{d} s.\n",
    "$$\n",
    "\n",
    "Les méthodes numériques permettant de résoudre le problème de Cauchy sont obtenues sur la base d'une formule d'approximation de cette intégrale par une méthode de quadrature.\n",
    "\n",
    "La méthode d'**Euler explicite** définit une suite d'instants $(t_i)$ et des approximations $y_i\\in\\mathbb{R}^d$ de la solution exacte $y(t_i)$. Elle se base sur une approximation de l'intégrale précédente par l'approximation des rectangles à gauche. La relation de récurrence prend alors la forme:\n",
    "$$\n",
    "\\begin{aligned}\n",
    "&y_{0} = y^0,\\\\\n",
    "&\\forall i\\in\\mathbb{N},\\quad y_{i+1} = y_{i}+h_{i}f(t_i,y_{i}),\\\\\n",
    "&\\forall i\\in\\mathbb{N},\\quad t_{i+1} = t_{i}+h_{i}.\n",
    "\\end{aligned}\n",
    "$$\n",
    "\n",
    "Typiquement, considérant un intervalle $[0,t_f]$, on fixe un entier $N$. Le pas $h_i$ est alors choisi égal à $h=t_f/N$ pour tout $i$, $0\\leq i\\leq N$, de sorte que l'approximation se fait aux points de la subdivision uniforme $0=t_0<t_1<\\dots<t_{N-1}<t_{N}=t_f$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 1\n",
    "\n",
    "Programmer cette méthode sur l'exemple élémentaire : $y'=-10y$ avec la donnée de Cauchy $(t_0,y^0)=(0,1)$ sur l'intervalle de temps $[0,5]$. Comparer graphiquement la solution approchée avec la solution exacte $y$, ceci pour différentes valeurs de l'entier $N$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 2\n",
    "\n",
    "Vérifier expérimentalement que la convergence est au moins d'ordre $1$ au sens où il existe une constante $C$, dépendant de $y^0$, $f$ et $t_f$ seulement, telle que si on note $h=\\sup_{i}(t_{i+1}-t_{i})$, on a:\n",
    "$$\\sup_{0\\leq i\\leq N}\\vert y(t_i)-y_i\\vert \\leq Ch.$$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### **Application : équation de la chaleur instationnaire**\n",
    "\n",
    "On cherche à approcher la solution instationnaire de l'EDP:\n",
    "$$\n",
    "\\frac{\\partial u(t,x)}{\\partial t}=\\frac{\\partial ^2u(t,x)}{\\partial x^2}+s(x),\n",
    "$$\n",
    "avec les conditions au bord $u(t,0)=u(t,1)=0$ pour tout $t\\geq 0$. En guise de discrétisation en espace du problème, on procède par différences finies avec un pas $\\Delta x=1/(N_x+1)$. Le problème semi-discret consiste alors en un système d'EDO posé dans $\\mathbb{R}^{N_x}$:\n",
    "$$\n",
    "U'(t)=-AU(t)+S,\n",
    "$$\n",
    "où l'on note $U(t)=(u_i(t))_{1\\leq i\\leq N_x}$ tel que $u_i(t)$ approche $u(t,i\\Delta x)$, et $u_0(t)=u_{N_x+1}(t)=0$. Le second membre $S$ vérifie $S_i=s(i\\,\\Delta x)$. La matrice $A$ symétrique définie et positive déjà rencontrée maintes fois est\n",
    "$$\n",
    "A=\\frac1{\\Delta x^2}\\left(\\begin{array}{cccccc}2& -1 & 0 & \\cdots & \\cdots & 0 \\\\-1 & 2& -1 & 0 &  & \\vdots \\\\0 & \\ddots & \\ddots & \\ddots & \\ddots & \\vdots \\\\\\vdots & \\ddots & -1 & 2& -1 & 0 \\\\\\vdots &  & \\ddots & \\ddots & \\ddots & -1 \\\\0 & \\cdots & \\cdots & 0 & -1 & 2\\end{array}\\right).\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 3\n",
    "\n",
    "Pour la donnée initiale $u(0,x)=\\sin(\\pi x)+\\tfrac{1}{2}\\sin(5\\pi x)$ et le terme source $s(x)=100\\sin(5\\pi x)$, résoudre le problème sur l'intervalle de temps $[0,1]$ par la méthode d'Euler explicite.\n",
    "\n",
    "On utilisera $N_x = 10$ et successivement $h=0.01$ puis $h=0.001$. Tester ensuite des valeurs plus grandes de $N_x$. Pour tracer la solution au cours du temps, on exécutera le bloc suivant et on utilisera la fonction `creer_animation`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from Animation import creer_animation\n",
    "\n",
    "def exemple():\n",
    "    def f_exemple(t):#renvoie le graphe (X,Y) à tracer à la frame numéro t\n",
    "        X = np.linspace(0, 2*np.pi, 100)\n",
    "        Y = np.sin(X + t * 2 * np.pi / 100)\n",
    "        return (X, Y)\n",
    "\n",
    "    nb_frames = 100 #le nombre de frames à afficher\n",
    "\n",
    "    creer_animation(f_exemple,\n",
    "                    nb_frames,\n",
    "                    \"exemple.gif\",#nom du fichier dans lequel on enregistre l'animation\n",
    "                    frame_time=20,#temps entre l'affichage de deux frames\n",
    "                    xmin = 0, xmax = 2*np.pi, ymin = -1, ymax = 1 #cadre dans lequel est dessiné l'animation\n",
    "                    )\n",
    "\n",
    "exemple()\n",
    "# dans le même dossier que votre fichier .ipynb, vous trouverez un gif de votre animation !"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 4\n",
    "\n",
    "Résoudre ce même problème avec la méthode d'Euler implicite :\n",
    "\n",
    "$$\\forall i \\in \\mathbb{N},\\quad y_{i+1} = y_{i}+h_{i}f(t_{i+1},y_{i+1}).$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exercice 2 : Méthodes symplectiques\n",
    "\n",
    "Étant donné une fonction $H\\in\\mathcal{C}^1(\\mathbb{R}^d\\times \\mathbb{R}^d;\\mathbb{R})$, on définit le système hamiltonien :\n",
    "$$ \\left\\{\n",
    "\\begin{aligned}\n",
    "&p'(t)=-\\nabla_q H(p,q),\\\\\n",
    "&q'(t)=\\nabla_p H(p,q).\n",
    "\\end{aligned}\n",
    "\\right. $$\n",
    "De nombreux systèmes de la physique prenne la forme précédente (cf. cours de Philippe Chartier).\n",
    "À titre d'exemple, citons le cas du mouvement d'une particule ponctuelle de masse $m$, de position $q\\in\\mathbb{R}^d$ et de moment $p\\in\\mathbb{R}^d$, soumise à une force $F$ dérivant d'un potentiel $V:\\mathbb{R}^d\\longrightarrow \\mathbb{R}$, avec donc $F=-\\nabla V(q)$. Le principe fondamental de la dynamique s'écrit alors $mq'' = -\\nabla V$, soit encore $mq'=p$ et $p'=-\\nabla V(q)$. Le Hamiltonien concerné est alors l'énergie totale du système physique : $H(p,q)=\\frac{1}{2m}\\vert p\\vert^2+V(q)$ et le système différentiel prend la forme ci-dessus.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 1\n",
    "\n",
    "Vérifier brièvement que pour toute solution maximale $(p,q)\\in\\mathcal{C}^1(\\mathbb{R},\\mathbb{R}^d\\times\\mathbb{R}^d)$, le hamiltonien $H(p,q)$ est constant au cours du temps. En déduire que si les ensembles de niveaux de $H$ sont compacts, alors les trajectoires sont toutes globales."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 2\n",
    "\n",
    "On se place dans le cas de l'oscillateur harmonique : $H(p,q)=p^2+q^2$ (avec $d=1$).\n",
    "Comment l'énergie du système évolue-t-elle numériquement avec les méthodes d'Euler explicite et d'Euler implicite ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 3\n",
    "\n",
    "Que se passe-t-il avec la méthode d'\\textbf{Euler symplectique} suivante ?\n",
    "$$\n",
    "\\left\\{\n",
    "\\begin{aligned} \n",
    "\tp_{i+1}=p_i-h_i \\nabla_q H(p_{i},q_{i+1})\\\\\n",
    "\tq_{i+1}=q_i+h_i \\nabla_p H(p_{i},q_{i+1})\n",
    "\\end{aligned}\n",
    "\\right.\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### **Application : le problème des ressorts**\n",
    "\n",
    "Un système de cinq masses assimilées à des points matériels $P\\in\\{A,B,C,D,E\\}$ tous de même masse $m=1$ sont reliés par sept ressorts comme l'indique le schéma suivant. Les points sont soumis aux seules forces issues de l'effet de ces ressorts, en particulier la gravité et les frottements éventuels ne sont pas considérés.\n",
    "\n",
    "![](TP07_schema.svg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "Chaque ressort $r$ est caractérisé par une constante de raideur $k_r$ et une longueur d'équilibre $L^0_r$ ; sa longueur effective dans la configuration courant est notée $L_r$. Les valeurs indiquées sur le schéma correspondent aux données $(k_r,L_r^0)$. Les points de base $A=(0,0)$ et $B=(3,0)$ sont fixés dans le plan $\\mathbb{R}^2$. L'énergie potentielle et l'énergie cinétique du système sont respectivement :\n",
    "$$\n",
    "E_{\\mathrm{pot}} = \\sum_{r} \\dfrac{1}{2} k_r (L^0_r-L_r)^2,\\qquad\n",
    "E_{\\mathrm{kin}} = \\sum_{P} \\dfrac{1}{2} m \\left\\vert \\dfrac{dP}{dt}\\right\\vert^2.\n",
    "$$\n",
    "Le système est hamiltonien avec :\n",
    "$$\n",
    "\\begin{aligned}\n",
    "&q={}^t(x_C,y_C,x_D,y_D,x_E,y_E),\\\\\n",
    "&p={}^t(\\dot x_C,\\dot y_C,\\dot x_D,\\dot y_D,\\dot x_E,\\dot y_E),\\\\\n",
    "&H(p,q) = E_{\\mathrm{pot}}+E_{\\mathrm{kin}}.\n",
    "\\end{aligned}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Nous vous fournissons des fonctions pré-programmées qui pourront être librement utilisées dans `RessortLibrary.py`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 3\n",
    "\n",
    "Déterminer par une méthode d'Euler explicite, la configuration du système à l'instant $t_f=20$ avec un pas $h=0.1$, pour la donnée de Cauchy $p^0=0_{\\mathbb{R}^6}$ et $q^0={}^t(0.5,1.5,3.5,1.5,1,-0.5)$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from RessortLibrary import *\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 4\n",
    "Tracer l'évolution de l'énergie potentielle, de l'énergie cinétique et de l'énergie totale du système au cours du temps, pour la solution numérique précédemment obtenue."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 5\n",
    "\n",
    "Reprendre ces deux questions en utilisant cette fois-ci une méthode d'Euler symplectique."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 6\n",
    "\n",
    "On ajoute une force de frottement de la forme $-\\alpha p$ dans la seconde équation, avec $\\alpha>0$. Que donnent les deux méthodes précédentes (configuration géométrique et énergie totale) ? On pourra résoudre sur $[0,100]$ avec un pas $h=0.1$ et pour un coefficient de frottement $\\alpha=0.1$.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a"
  },
  "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.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
