{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# TP 0 : Prise en main de Python (Jupyter Notebook) et $\\LaTeX$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Petite introduction pour commencer \n",
    "\n",
    "L'outil principal de ces TPs est **Jupyter Notebook**. **Jupyter Notebook** est un produit open source proposé par le projet Jupyter qui permet la création et le partage de documents constitués d’une liste ordonnée de cellules d’entrées et de sorties. Les cellules peuvent contenir du code, du texte au format Markdown, des formules mathématiques ou des contenus médias. \n",
    "\n",
    "**Jupyter Notebook** est développé à l’origine pour les applications de data science écrites en Python (la distribution Anaconda de Python est par exemple livrée avec), mais aussi utilisé pour les applications en R et en Julia. Ce produit propose une facilité pour\n",
    "\n",
    "- **la visualisation de données.** Jupyter permet de créer ces visualisations, de les partager et d’autoriser les changements interactifs.  \n",
    "\n",
    "- **le partage et les interactions en direct avec le code.** Les services cloud tels que GitHub ou GitLab permettent de partager du code, mais ils ne sont pas interactifs. Avec un cahier Jupyter, on peut voir le code, l’exécuter, le corriger et afficher les résultats en directe. Le code n’est pas statique dans Jupyter.\n",
    "\n",
    "\n",
    "Pour utiliser Jupyter Notebook il faut d’abord installer, dans son système ou dans le Cloud, l’application client et serveur de l’environnement du code. La seule condition est qu’il soit également installé une version valide de Python. La distribution Anaconda (conseillée pour l'installation) contient aussi bien Jupyter Notebook et Python. Une fois l’installation réalisée, on peut lancer le serveur locale Notebook par la ligne de commande: **jupyter notebook** (en terminal) ou depuis Anaconda-Navigator.\n",
    "\n",
    "**À noter qu'en salle machine l'installation est deja realisée et vous pouvez ouvrir Jupyter Notebook à partir du menu principal.**\n",
    "\n",
    "Les fichiers jupyter notebook sont sauvegardées automatiquement localement sur votre machine, mais il ne serait pas de trop des les sauvegarder de temps en temps (Cntl+S). Ils sont stockées sur la machine localement, vous pouvez ensuite les copier ou vous les envoyer par email si besoin, ainsi que les telecharger sur moodle pour le **rendu de chaque TP**."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Objectifs de TP 0\n",
    "\n",
    "1. Se familiariser avec l'utilisation de Jupyter Notebook. Comprendre la différence entre les différents types de cellules : Markdown, Code, etc.\n",
    "\n",
    "1. Connaître les commandes et les bibliotheques de base de Python\n",
    "\n",
    "1. Se familiariser avec la syntaxe du langage Python\n",
    "\n",
    "1. Savoir utiliser la condition if\n",
    "\n",
    "1. Apprendre à utiliser la boucle for\n",
    "\n",
    "1. Savoir definir les fonctions en Python\n",
    "\n",
    "1. Apprendre à tracer les courbes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pour vraiment commencer : Importation des bibliotheques de Python\n",
    "\n",
    "\n",
    "Les bibliothèques **Numpy** et **Matplotlib** sont les plus souvent utilisées en Python. La bibliothèque **Numpy**\n",
    "utilise un large éventail de fonctions mathématiques qui le rendent particulièrement utile pour des calculs scientifiques et problèmes de mathématiques appliquées. Le module **Matplotlib** permet de tracer des fonctions et d'afficher leurs courbes dans des graphiques.\n",
    "\n",
    "Le programme ci-dessous permet à importer ces bibliothèques en fin de pouvoir les utiliser"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# importation des fonctions mathématiques, on peut maintenant utiliser les fonction sin, exp, la valeur de pi, etc.\n",
    "from math import *               \n",
    "\n",
    "# on importe la bibliothèque numpy qui permet de travailler avec des tableaux\n",
    "import numpy as np \n",
    "\n",
    "# on importe la module matplotlib.pyplot qui permet tracer des fonctions\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Donc pour chaque TP on commencera toujours par:**\n",
    "\n",
    "```python\n",
    "import numpy as np\n",
    "from math import *\n",
    "import matplotlib.pyplot as plt\n",
    "```\n",
    "et vous rajouterez d'autres bibliothèques si besoin."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Boucles <font color='green'>**for**</font> et Condition <font color='green'>**if**</font>.  Definition d'une fonction.\n",
    "\n",
    "L'exemple ci-dessous permet de calculer la sommes $1+ 2 + \\cdots + 10$ en utilisant la boucle <font color='green'>**for**</font>. \n",
    "\n",
    "On definit ensuite une fonction **y=somme(n)** qui calcule la sommes $1+ 2 + \\cdots + n$ et on compare avec le resultat de la question 1 pour $n = 10$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# on commence par donner les instructions permettant d'imprimer les commentaires\n",
    "print(\"somme en utilisant boucle for\\n\") \n",
    "\n",
    "s = 0\n",
    "for i in range(1,11):\n",
    "    s = s+i\n",
    "print(s)\n",
    "\n",
    "\n",
    "print(\"somme avec création de fonction Python\\n\")\n",
    "def somme(n):\n",
    "    s = 0\n",
    "    for i in range(1,n+1):\n",
    "        s = s+i\n",
    "    return s\n",
    "\n",
    "print(\"1+...+10 = \", somme(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "On peut imprimer le résultat de comparison en utilisant la condition **if**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "if s == somme(10):\n",
    "    print('Nous avons obtenu les mêmes résultats!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "En utilisant l'exemple,\n",
    "\n",
    "1. Calculer le produit $1\\times 2 \\times \\cdots \\times 10$ en utilisant la boucle <font color='green'>**for**</font>. \n",
    "\n",
    "2. Écrire une fonction function simple **factorielle(n)** qui calcule $n!$. Comparer avec le resultat de la question 1 pour $n = 10$.\n",
    "La syntaxe Python pour la définition d'une fonction est la suivante\n",
    "```python\n",
    "    def factorielle(n):\n",
    "        return\n",
    "```\n",
    "On rappel que par convention on a $0! = 1$, en utilisant la condition **if** rajouter cette definition à votre fonction **factorielle(n)**.\n",
    "\n",
    "\n",
    "**Remarque.** Vous pouvez utiliser la command <font color='green'>**print**</font> pour separer vos reponses aux questions, comme il est proposé ci-dessus."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Tableau dans la bibliothèque **Numpy** np.arange, np.linspace, np.array\n",
    "\n",
    "Les commandes np.array, np.arange, np.linspace de la bibliothèque **Numpy** permettent à créer des tableaux. Voici des exemples de leur utilisation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "T = np.array([-7,1,2,5]) # permet de créer un tableau numpy à partir d'une liste Python\n",
    "print(T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "A = np.arange(1,11,1) # tableau de chiffres de 1 à 10 (11 est non inclus) par incréments de 1\n",
    "print(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "L = np.linspace(-pi,pi,9) # tableau des nombres équidistants de -pi à pi (compris) avec 9 éléments\n",
    "print(L)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Les fonctions de la bibliothèque **numpy** permettent de travailler directement avec les tableaux, par exemple, on peut directement calculer la somme de tableau A sans utiliser la boucle **for** (et on obtient le même résultat qu'avant)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.sum(A)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Si vous souhaitez appliquer une fonction, par exemple **sin**, à chaque élément d'un tableau, vous pouvez bien sûr utiliser une boucle **for**, mais vous pouvez également utiliser **np.sin()**\n",
    "\n",
    "Si vous essayez d'exécuter "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "sin(L)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Vous aller obtenir un message d'erreur! \n",
    "```pyhton \n",
    "TypeError: only size-1 arrays can be converted to Python scalars\n",
    "```\n",
    "La fonction **sin()** est définie dans la bibliothèque **math** et ne peut être utilisée qu'avec des scalaires. En revanche, la fonction **np.sin()** peut être utilisée pour calculer les sinus de chaque élément du tableau :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.sin(L)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Vecteurs et Matrices: range(), np.arange, np.linspace, np.array\n",
    "\n",
    "Exemple: Voici une boucle qui imprime les entiers de 0 à 13\n",
    "\n",
    "```python\n",
    "for i in range(14):\n",
    "    print(i)\n",
    "```\n",
    "\n",
    "Notons que le compteur i va de $0$ à $13$ par pas de $1$ : il y a donc bien $14$ répétitions. \n",
    "\n",
    "Selon les besoins, on peut aussi d'abord declarer un tableau des entiers de 0 à 13 et ensuite imprimer ces elements:\n",
    "\n",
    "```python\n",
    "A = np.arange(0,14,1)\n",
    "for Ai in A:\n",
    "    print(Ai, end =\" \")\n",
    "```\n",
    "\n",
    "Voici une boucle qui imprime les entiers de -7 à 3 de deux façon"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# sans la construction d'un tableau\n",
    "for i in range(-7,4):\n",
    "    print(i, end =\" \") # Utilisation de end =\" \" permet d'imprimer en ligne\n",
    "print(\"\\n\")\n",
    "\n",
    "\n",
    "# avec la construction d'un tableau\n",
    "A = np.arange(-7,4,1)\n",
    "for Ai in A:\n",
    "    print(Ai, end =\" \") "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Maintenant on va s'intéresser aux opérations sur les matrices et vecteurs. Soit $u=\\left(\\begin{array}{c}\n",
    "    2\\\\\n",
    "    5 \\\\\n",
    "    8 \\\\\n",
    "  \\end{array}\\right)$, $v=\\left(\\begin{array}{c}\n",
    "    6 \\\\\n",
    "    1 \\\\\n",
    "    2 \\\\\n",
    "  \\end{array}\\right)$, $M=\\left(\\begin{array}{cccc}\n",
    "    6 & 3 & 3 & 5 \\\\\n",
    "    1 & 2 & 1 & 7\\\\\n",
    "    2 & 0 & 4 & 5 \\\\\n",
    "  \\end{array}\\right)$\n",
    "  \n",
    "  À l'aide de commandes Python (afficher le résultat à l'aide de commande **print**)\n",
    "\n",
    " A. Calculer et afficher $3u-6v$.<br>\n",
    " \n",
    " B. Calculer et afficher la somme des éléments de $u$. **np.sum(u)**<br>\n",
    " \n",
    " C. Calculer et afficher le produit scalaire des vecteurs $u$ et $v$ definit par $$ <u,v> = \\sum\\limits_{i=1}^n u_iv_i, \\text{ ici } n = 3$$\n",
    " On utilisera la commande **np.dot()**\n",
    " \n",
    " D. Construire un vecteur $u_1$ partant de $-8$ et allant jusque $-5$ par pas de $0.25$ (**np.arange()** ou **np.linspace()**). Quelle est sa longueur? (**len()**) <br> \n",
    " \n",
    " E. Construire un vecteur $v_1$ décroissant d'entiers allant de $5$ à $-7$ (**np.arange()** ou **np.linspace()**). Quelle est la longueur de ce vecteur? Peut-on calculer $u_1+v_1$?<br>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# On definit les variables en utilisant np.array()\n",
    "u = np.array([2,5,8])\n",
    "v = np.array([6,1,2])\n",
    "M = np.array([[6, 3, 3, 5], [1, 2, 1, 7], [2, 0, 4, 5]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Fonctions et Graphiques, bibliotéque matplotlib: plt.plot(), plt.title(), plt.show()\n",
    "\n",
    "Les instruction suivants permettant à definir une fonction $f$, calculer ses valeurs et tracer son graphe."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def f(x):\n",
    "    return np.exp(2*x)\n",
    "\n",
    "print('f(2) =', f(2))\n",
    "print('f([1,3,4]) =', f(np.array([1, 3, 4])))\n",
    "\n",
    "x = np.linspace(0,1,50)\n",
    "plt.plot(x, f(x),'r')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Tracer les graphes des focntions $g$ et $h$ definies par \n",
    "\n",
    "1. Soit $g:x\\longmapsto \\sqrt{3x^2+1}-\\ln(x)$. \n",
    "\n",
    "2. Soit $h:x\\longmapsto x^2+1$ et $h:x\\longmapsto 3\\sin(x)$.\n",
    "\n",
    "sur le même plot et sur deux plots differentes (differentes utilisation de la commande **plt.show()**)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ecrire des formules mathématiques en $\\LaTeX$ \n",
    "\n",
    "Pour écrire des formules mathématiques en mode en $\\LaTeX$ dans un cellule Markdown, il nous suffit de les ecrire entre les symboles $\\$$ ou $\\$\\$$.\n",
    "\n",
    "Comparer les deux possibilités:"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "$\n",
    "N^{\\prime}=(2-\\alpha\\cos(t)) N - F(N)\n",
    "$\n",
    "\n",
    "\n",
    "$$\n",
    "N^{\\prime}=(2-\\alpha\\cos(t)) N - F(N)\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Recopier les instructions ci-dessus dans le cellule ci-dessous:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Reprendre tous les exemples de votre fichier intitulé *Écrire des formules mathématiques en $\\LaTeX$* accessible sur Moodle et les modifier selon votre choix."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Reprendre toutes les formules du CM 1, de la page 13 à la page 21, et les écrire en $\\LaTeX$ ci-dessous.\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "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": 1
}
