{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# L3 Analyse Numérique – TP6\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, nous étudierons des propriétés qualitatives d'équations différentielles. \n",
    "\n",
    "- Exercice 1 : *Modèle de population*\n",
    "- Exercice 2 : *Pendules*\n",
    "- Exercice 3 : *Centre et linéarisation, cycles limites*\n",
    "- Exercice 4 : *Quelle aventure !*\n",
    "\n",
    "Dans tout ce TP, on ne programmera pas soi-même de méthode de résolution approchée d'EDO, on utilisera plutôt la fonction ```odeint``` du module ```integrate``` de la librairie ```scipy```, dont on adaptera l'utilisation à partir de l'exemple typique suivant :\n",
    "\n",
    "```python\n",
    "from scipy.integrate import odeint\n",
    "def f(y,t):\n",
    "    return y\n",
    "y0 = 1.\n",
    "t = np.linspace(0,10,101)\n",
    "y = odeint(f,y0,t)\n",
    "\n",
    "plt.plot(t,y)\n",
    "plt.title(\"La solution y(t) de dy/dt=y,y(0)=1)\")\n",
    "plt.show()\n",
    "```\n",
    "\n",
    "Ici, ```f(y,t)``` est le champs de vecteur définissant l'EDO, ```y0``` est la condition initiale, et ```t``` est un vecteur contenant les temps auxquels on souhaite calculer une solution approchée $Y$ de $\\frac{d}{dt} y = f(y,t), ~y(t[0])=y0$. La fonction ```odeint``` retourne alors le vecteur ```Y[j]```, ```j=0,...,len(t)``` contenant les valeurs approchées de la solution ```Y[j]``` $\\approx$ ```y(t[j])```."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exercice 1 : Modèle de population\n",
    "\n",
    "Un modèle naïf décrivant l'évolution d'une population $N(t)$ en fonction du temps $t$ est donné par l'équation logistique :\n",
    "$$N' = N (1 - N).$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 1\n",
    "Résoudre sur l'intervalle de temps $[0,10]$, cette équation différentielle ordinaire du premier ordre avec successivement les données initiales $N(0)=0,0.1,\\ldots,2$ et tracer toutes ces solutions sur une même figure."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 2\n",
    "Par l'expérience numérique, déterminer $\\lim_{t\\to+\\infty} N(t)$ selon la donnée de Cauchy $N(0)$, puis prouver cette propriété par des arguments mathématiques."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 3\n",
    "Observer numériquement la convergence vers une même trajectoire asymptotique de solutions pour diverses données de Cauchy, pour la variante non-autonome:\n",
    "$$N' = N (c(t)-N), \\textrm{ avec } c(t) = 1+\\cos 2t.$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exercice 2 : Pendules\n",
    "\n",
    "Le mouvement du pendule simple idéal est régi par l'équation différentielle autonome\n",
    "$\n",
    "\\theta''+\\sin(\\theta)=0.\n",
    "$\n",
    "Son approximation linéaire pour le cas de petites oscillations au voisinage de $\\theta=0$ est: \n",
    "$\n",
    "\\theta''+\\theta=0.\n",
    "$\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 1\n",
    "\n",
    "Après avoir reformulé cette équation d'ordre deux comme un système différentiel du premier ordre, tracer dans le portrait de phase $(\\theta,\\theta')$ quelques trajectoires solutions du pendule linéarisé. Tracer également sur la même figure le champ de vecteurs décrivant la dynamique. On pourra pour cela utiliser la fonction ```streamplot``` du module ```pyplot``` de la librairie ```matplotlib``` comme dans l'exemple ci-dessous :\n",
    "```python\n",
    "x, y = np.linspace(0, 6, 500), np.linspace(0, 6, 500)\n",
    "X, Y = np.meshgrid(x, y)\n",
    "U = 2*X-X*Y\n",
    "V = 2*X*Y-3*Y\n",
    "plt.streamplot(X, Y, U, V)\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 2\n",
    "Tracer quelques trajectoires de solutions du pendule non-linéaire. Quelle est la nature du point d'équilibre $(0,0)$ pour ce système ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 3\n",
    "Obtenir par le calcul une expression de l'énergie mécanique conservée au cours du mouvement. Vérifier cette propriété numériquement par un tracé en fonction du temps. Que se passe-t-il en présence d'un terme d'amortissement en $\\alpha \\theta'$ dans l'équation ($\\alpha>0$) ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exercice 3 : Centre et linéarisation, cycles limites\n",
    "\n",
    "On considère le système suivant :\n",
    "$$\n",
    "\\left\\{\n",
    "\\begin{aligned}\n",
    "x' &= -y - (x^2+y^2)x\\\\\n",
    "y' &= x - (x^2+y^2)y.\n",
    "\\end{aligned}\n",
    "\\right.\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 1\n",
    "\n",
    "Quelle est la nature du point singulier que constitue l'origine $(0,0)$ pour le système linéarisé ?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 2\n",
    "Tracer le portrait de phase au voisinage de $(0,0)$ pour le système complet (ainsi qu'une trajectoire)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 3\n",
    "\n",
    "Montrer que $u(t)=x(t)^2+y(t)^2$ vérifie une équation différentielle simple que l'on résoudra de manière exacte et en déduire la nature du point d'équilibre $(0,0)$ pour le système complet. Conclure."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 4\n",
    "\n",
    "On considère le système suivant :\n",
    "$$\n",
    "\\left\\{\n",
    "\\begin{aligned}\n",
    "x' &= -y + (1-x^2-y^2)x\\\\\n",
    "y' &= x + (1-x^2-y^2)y.\n",
    "\\end{aligned}\n",
    "\\right.\n",
    "$$\n",
    "Tracer le portrait de phase et observer numériquement le comportement asymptotique des trajectoires en temps grand. Prouver ensuite votre conjecture en réécrivant puis en résolvant le système différentiel écrit en coordonnées polaires."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Exercice 4 : Quelle aventure !\n",
    "\n",
    "Dans une prairie carrée de 100m de côté, quatre escargots Alex, Bertrude, Camille et Dominique se poursuivent. À l'instant initial, ils sont chacun dans un coin de la prairie dont l'un est noté le point $O$. Leur mouvement est décrit par la dynamique suivante : Alex poursuit Bertrude, Bertrude poursuit Camille, Camille poursuit Dominique et Dominique poursuit Alex. Plus précisément, la loi de déplacement est pour chaque couple poursuivant $A$/poursuivi $B$ donnée par l'équation différentielle :\n",
    "\n",
    "$$\n",
    "\\frac{d}{dt}\\overrightarrow{OA(t)} = \\alpha_A \\overrightarrow{A(t)B(t)},\n",
    "$$\n",
    "\n",
    "où $\\alpha_A$ est un coefficient réel positif caractérisant la vivacité du poursuivant.\\\\\n",
    "On donne : $(\\alpha_A,\\alpha_B,\\alpha_C,\\alpha_D)=(1,1.5,1.2,0.8)$.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 1\n",
    "\n",
    "Écrire le système différentiel (linéaire) correspondant à ce problème. Quels en sont les points critiques ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 2\n",
    "Résoudre numériquement sur l'intervalle de temps $[0,20]$ la trajectoire des quatres poursuivants et les tracer. Par l'\"évidence\" numérique, déterminer le point limite de rencontre des quatres poursuivants."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Question 3\n",
    "Trouver deux quantités invariantes au cours du mouvement et en déduire formellement le point asymptotique de rencontre."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a"
  },
  "kernelspec": {
   "display_name": "Python 3.10.2 64-bit",
   "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"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
