{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Chapitre 17\n",
    "## Activité 4 p 351 : Parc à vagues\n",
    "\n",
    "### Réaliser : Simulation de la propagation d'une onde sinusoïdale\n",
    "**Initiation**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy  as np\n",
    "from matplotlib import pyplot as plt\n",
    "from matplotlib import animation as anim\n",
    "from math import pi"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "<font color= 'red'>   **Préliminaire à lire absolument**   </font>\n",
    "  \n",
    "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",
    ">`%matplotlib widget`   \n",
    "\n",
    "après avoir installé l'extension disponible __[ici](https://github.com/matplotlib/jupyter-matplotlib)__ lorsque cette extension n'est pas automatiquement disponible 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 les 2 lignes d'instructions de la cellule suivante.   \n",
    "Il faudra dans ce cas :     \n",
    "$\\quad$ - retirer les `#` des 2 lignes suivantes 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": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#from matplotlib import rc\n",
    "#rc('animation', html='jshtml')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Question 2 c**   \n",
    "Compléter les lignes de la cellule suivant les consignes puis exécuter le programme pour simuler la propagation des vagues destinées aux surfeurs expérimentés du parc à vagues à la fréquence maximale."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib widget\n",
    "\n",
    "x = np.linspace(0,100,256) # Domaine des abcisses (en m)\n",
    "v = 4.7                    # Célérité (en m/s)\n",
    "delta_t = (x[1]-x[0])/v    # Intervalle de temps (en s)\n",
    "\n",
    "A = ...A compléter...      # Amplitude (en m)\n",
    "T = ...A compléter...      # Période (en s)\n",
    "\n",
    "# Initialisation de la figure\n",
    "figure = plt.figure('Propagation d\\'une onde sinsusoïdale')\n",
    "plt.axis([0,100,-10,10])\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",
    "# Fonction fixant l'arrière de l'animation présent à chaque image\n",
    "def init():\n",
    "    courbe.set_data([],[])\n",
    "    return courbe,\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 = A*np.cos((2*pi/T)*t-(2*pi/(v*T))*x)\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",
    "# blit=True indique que seuls les éléments modifiés sont redessinés\n",
    "animation = anim.FuncAnimation(figure,onde,init_func=init,frames=256,\n",
    "                               blit=True,interval=delta_t*1000, repeat=False)\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
}
