{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Chapitre 17\n",
    "## Exercice 38 p 361 : Simulation de la propagation d’une onde sinusoïdale\n",
    "Enoncé"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy  as np\n",
    "from matplotlib import pyplot as plt\n",
    "from matplotlib import animation as anim"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "<font color= 'red'>   **Préliminaire à lire absolument**   </font>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pour accèder aux outils de figure interactive et aux animations dans un calepin **JupyterLab**, il est nécessaire d'introduire en début de programme la commande 'magique':    \n",
    "\n",
    "```python\n",
    "%matplotlib widget  \n",
    "```\n",
    "\n",
    "après avoir installé l'extension disponible __[ici](https://github.com/matplotlib/jupyter-matplotlib)__ lorsque cette extension n'est pas automatiquement accessible sous la version JupyterLab installée.\n",
    "\n",
    "**Remarque importante :**\n",
    "Cette commande magique **ne fonctionne pas** dans l'environnement **Colaboratory**."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Une alternative à l'outil précédent pour visualiser une animation dans un calepin **JupyterLab** consiste à introduire en début de programme les 2 lignes d'instructions suivantes :\n",
    "\n",
    "```python\n",
    "from matplotlib import rc\n",
    "rc('animation', html='jshtml')\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Il faudra dans ce cas :     \n",
    "$\\quad$ - retirer les `#` devant ces 2 lignes et mettre un `#` devant la commande magique `%matplotlib widget` ;      \n",
    "$\\quad$ - appeler l'animation par son nom en toute fin de programme (en retirant le `#` devant le nom `animation` de la dernière ligne de la dernière cellule) ;         \n",
    "$\\quad$ - faire preuve de patience (le temps pour la machine de faire tous les calculs) après l'éxécution de la dernière cellule pour visualiser l'animation.\n",
    "\n",
    "**Remarque importante :**\n",
    "Cette méthode est celle à utiliser dans l'environnement **Colaboratory**.   "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib widget\n",
    "\n",
    "#from matplotlib import rc\n",
    "#rc('animation', html='jshtml')\n",
    "\n",
    "x = np.linspace(0,4,256) # Domaine des abcisses (en m)\n",
    "delta_t = 0.01           # Intervalle de temps (en s)\n",
    "\n",
    "# Initialisation de la figure\n",
    "figure = plt.figure('Propagation d\\'une onde sinsusoïdale')\n",
    "plt.axis([0,4,-3,3])\n",
    "plt.xlabel('$x$ (en m)')\n",
    "plt.ylabel('$y$ (en m)')\n",
    "\n",
    "# Initialisation du graphe tracé mis à jour au fur et à mesure\n",
    "courbe, = plt.plot([],[],'g-',lw=1.5) # Graphe sans point\n",
    "\n",
    "# Création de la fonction 'onde' appelée à chaque nouvelle image i\n",
    "def onde(i): \n",
    "    t = i*delta_t\n",
    "    y = 2*np.cos((2*np.pi/0.85)*(x-2.3*t))\n",
    "    courbe.set_data(x,y)       # Mise à jour du graphe\n",
    "    return courbe,\n",
    "\n",
    "# Animation de la figure affichant onde(i), à chaque image i, pour i\n",
    "# entier de 0 à 255 avec un délai entre 2 images égal à interval en ms\n",
    "animation = anim.FuncAnimation(figure, onde,frames=256,\n",
    "                               interval=delta_t*1000, repeat=False)\n",
    "\n",
    "#animation"
   ]
  }
 ],
 "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.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
