{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <center> R1.04 Méthodes d'optimisation <br> TP1a - Descente de gradient 1D </center>\n",
    "<center> 2025/2026- Thibault Godin & Gauthier Quilan </center>\n",
    "<center> IUT de Vannes, BUT Informatique </center>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Le but de ce TP est d'implémenter quelques méthodes numériques d'optimisation, basées sur la descente de gradient, dont le cœur est résumé par :\n",
    "\n",
    "$$a_{k+1} = a_k -  \\delta f'(a_k)$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import math\n",
    "\n",
    "# Affichage graphique\n",
    "\n",
    "%matplotlib notebook \n",
    "# enable interactivity of plots\n",
    "# attention a bien fermer les fenetres plt après chaque visualisalgèbreation\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D \n",
    "\n",
    "\n",
    "import time"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Descente de gradient\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exercice 1 : Optimisation de la fonction $f: x \\mapsto x^2 +1$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Le but de cet exercice est d'implémenter la méthode (la plus basique) de descente de gradient, en 1D.\n",
    "\n",
    "\n",
    "On va considérer la fonction $f: x \\mapsto x^2 +1$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Question 1** \n",
    "\n",
    "Calculer $f'$ et dresser le tableau de variation de $f$.\n",
    "\n",
    "En déduire que $f$ admet un unique minimum sur $\\mathbb{R}$ et le donner."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "_Réponse:_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Question 2** \n",
    "\n",
    "Écrire une fonction `gradDesc_ex1(x0,k,d)` qui implémente la descente de gradient pour la fonction $f$ ci-dessus (on considère que la dérivée est connue). x0 étant l'abscisse de départ, k le nombre d'itérations et d représentant le pas $\\delta$.\n",
    "\n",
    "_Note : pour débugger, il peut être interessant d'afficher les résultats intermédiaires (ajout possible d'un paramètre booléen <tt>verbose</tt>)_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "itération  0  x =  1  f(x) =  2\n",
      "itération  1  x =  0.6  f(x) =  1.3599999999999999\n",
      "itération  2  x =  0.36  f(x) =  1.1296\n",
      "itération  3  x =  0.216  f(x) =  1.046656\n",
      "itération  4  x =  0.1296  f(x) =  1.01679616\n",
      "itération  5  x =  0.07776  f(x) =  1.0060466176\n",
      "itération  6  x =  0.046655999999999996  f(x) =  1.002176782336\n",
      "itération  7  x =  0.027993599999999997  f(x) =  1.00078364164096\n",
      "itération  8  x =  0.016796159999999997  f(x) =  1.0002821109907456\n",
      "itération  9  x =  0.010077695999999997  f(x) =  1.0001015599566685\n",
      "Minimum atteint en  0.006046617599999998\n"
     ]
    }
   ],
   "source": [
    "def gradDesc_ex1(x0,k,d):\n",
    "    x=x0\n",
    "    for i in range(k):\n",
    "        print(\"itération \", i, \" x = \", x, \" f(x) = \", x**2+1)\n",
    "        x=x-d*2*x\n",
    "    return x\n",
    "\n",
    "print(\"Minimum atteint en \", gradDesc_ex1(1,10,0.2)) #Est-ce cohérent ?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Question 3**\n",
    "\n",
    "Ecrire une fonction `gradDescVect_ex1` dans laquelle vous modifierez la fonction précédente <tt>gradDesc_ex1</tt> afin de renvoyer deux vecteurs : le premier listant les points $x$ visités par l'algorithme, le deuxième les valeurs prises par le gradient en chaque point.\n",
    "\n",
    "La fonction `graphique_descente_ex1` utilise le résultat de <tt>gradDescVect_ex1</tt> pour donner une représentation graphique de la descente de gradient."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([1,\n",
       "  0.6,\n",
       "  0.36,\n",
       "  0.216,\n",
       "  0.1296,\n",
       "  0.07776,\n",
       "  0.046655999999999996,\n",
       "  0.027993599999999997,\n",
       "  0.016796159999999997,\n",
       "  0.010077695999999997],\n",
       " [2,\n",
       "  1.2,\n",
       "  0.72,\n",
       "  0.432,\n",
       "  0.2592,\n",
       "  0.15552,\n",
       "  0.09331199999999999,\n",
       "  0.055987199999999994,\n",
       "  0.033592319999999995,\n",
       "  0.020155391999999994])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def gradDescVect_ex1(x0,k,d):\n",
    "    liste_X = []\n",
    "    liste_grad = []\n",
    "    x = x0\n",
    "    for i in range(k):\n",
    "        liste_X.append(x)\n",
    "        grad = 2*x\n",
    "        liste_grad.append(grad)\n",
    "        x = x - d*grad\n",
    "    return liste_X, liste_grad\n",
    "\n",
    "gradDescVect_ex1(1,10,0.2)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAABQ/UlEQVR4nO3dB3gU1RrG8TcEQk8g0ntTQEFABASVIgiKBa4NsICoWPGKYEOxYEPErgh2bCgWioqiSBGkKM0rIKAUpQaQFnpJ9j7fTCokGDCb2Z39/55nzO5mFk6GdfPuKd+JCgQCAQEAACDs5fO6AQAAAMgdBDsAAACfINgBAAD4BMEOAADAJwh2AAAAPkGwAwAA8AmCHQAAgE8Q7AAAAHyCYAcAAOATBDsAAACfCGqwGzZsmE499VTFxsY6R/PmzfXNN98c9Tmffvqp6tSpo0KFCql+/fr6+uuvg9lEAAAA3whqsKtUqZKeeuopzZs3T3PnztU555yjTp06afHixVmeP3PmTHXr1k3XX3+9FixYoM6dOzvHokWLgtlMAAAAX4gKBAKBvPwL4+PjNWTIECe8Ha5Lly7avXu3vvrqq7THzjjjDDVs2FDDhw/Py2YCAACEnfx59RclJSU5w6wW3GxINiuzZs1S3759Mz3WoUMHjR07Nts/d//+/c6RKjk5WVu3btUJJ5ygqKioXPwJAAAAcof1q+3cuVMVKlRQvnz5wifYLVy40Aly+/btU7FixTRmzBidfPLJWZ6bkJCgsmXLZnrM7tvj2Rk0aJAGDhyY6+0GAAAItjVr1jhT18Im2NWuXVu//PKLduzYoc8++0w9evTQDz/8kG24O1b9+/fP1Mtnf0+VKlWcC2ULNo7Vxx9LN90kFSokzZ4tVa+eK80EAAA+EAhIF10kTZ8unXuuLfqUjmeAMDExUZUrV1bx4sVztX1BD3YxMTGqVauWc7tx48aaM2eOXnzxRb322mtHnFuuXDlt3Lgx02N23x7PTsGCBZ3jcKkrcY9Vr15uuJsyRbr3XskW8TKiCwAAzIgRbqgrXFiy6f9xcfpXcnvaWJ7XsbM5cBnnxGVkQ7aTJk3K9NjEiROznZMXDHZ97R/KsuK330offZRnfzUAAAhhmzZJ/fq5tx95RKpRQyEnqMHOhkmnTZumP//805lrZ/enTp2qq666yvl+9+7dncdS3XHHHZowYYKeffZZLV26VI888ohTJqV3797KSyedJA0Y4N7u00faujVP/3oAABCC+vZ1M0GDBtKddyokBTXYbdq0yQlvNs+ubdu2zjDst99+q3NtUFrS6tWrtWHDhrTzW7RooZEjR+r1119XgwYNnDl5tiK2Xr16ymv33CPZNMDNm6W7787zvx4AAISQ776TPvzQHdl74w2pQAGFpDyvYxdsNhkxLi7OWURxPHPsMpoxQzrrLPe2zblr3Tp32ggAAMLHnj2S9TGtWmWji9ILL4RWXsmIvWKP4swzpZtvdm/bStl9+7xuEQAAyGuPPuqGOqtK8thjCmkEu38waJCt1pV+/1168kmvWwMAAPLS//4nPfOMe/vVV6Vcrk6S6wh2/6BECenll93bTz0l/fab1y0CAAB5ISnJLYNmXy+7zK1fF+oIdjlw6aXuP+bBg+4/cHKy1y0CAADBNnSoNGeOW6vupZcUFgh2OWArYOwft1gxaeZMadgwr1sEAACC6c8/pfvvTx+xK19eYYFgl0OVK7v/sOa++6xUi9ctAgAAwRAIuIsmd++WWraUbrxRYYNgdwxuucVdKbtrl7ta1l+FYgAAgHn/fbdune1CZTXr8oVRWgqjpnrP/mHffNP2v3X3kB050usWAQCA3N427M4707cNs92owgnB7hjVqSM99JB724oU2s4UAADAH/77X3fbsIYN0/eFDScEu+PcbuzUU6UtW9xwBwAAwt8XX0ijRknR0dJbb4XutmFHQ7A7DvYPbf/gNjT70UfS+PFetwgAAPwbO3a4c+nNXXdJp52msESwO06nny717evetoUUiYletwgAAByve++V1q+XTjxRevhhhS2C3b8wcKBUs6a0dq37ggAAAOFnyhTptdfc27YKtnBhhS2C3b9QpIj7AjDDh0uTJ3vdIgAAcCysVt0NN7i3rXZdq1YKawS7f6lNG3co1tgLw2rcAQCA8HD//dLKle5GBE8/rbBHsMsF9kKoUkVatUrq39/r1gAAgJyYPj19D1irUxsbq7BHsMsFxYu7LwjzyivStGletwgAABzNnj3Sdde5t6+/XmrfXr5AsMsl556bPkZvLxR7wQAAgND04IPS8uVSxYrSs8/KNwh2ueiZZ6RKlaQVK6QBA7xuDQAAyMqsWdLzz7u3X39diouTbxDscpG9MOwFYl54QZo50+sWAQCAjPbtc0fWAgGpe3epY0f5CsEul51/vtSjh/uCsRfO3r1etwgAAKR65BFp6VKpXLn0Xjs/IdgFgb1QypeXli1jSBYAgFAxe7Y0ZEh6/dn4ePkOwS4ISpZML1xsIc+WUwMAAO/s2eOOqCUnS1dfLXXqJF8i2AXJBRdIPXu6Q7L21SpbAwAAbzzwgPT771KFCum16/yIYBdE1ltnlaxtlSx7yQIA4I1p06QXX3RvW91ZG1nzK4JdkFfJvvWWe3voUGnSJK9bBABAZNm1S7r2WncEzQoR2yJHPyPY5UHh4tS9ZG2VbGKi1y0CACBy3HOPu+Wnbf353HPyPYJdHrAVONWrS6tXS/36ed0aAAAiw/ffS8OGubffftsfe8H+E4JdHihWTHrnnfSx/W++8bpFAAD4W2Ji+l6wt94qtW2riECwyyOtWkl33OHetjH+rVu9bhEAAP5lv3PXrJFq1JAGD1bEINjloSeflGrXljZscD89AACA3Dd2rDRihBQVJb37rjtyFikIdnmoSBHp/fel6Ghp1Cjpo4+8bhEAAP6ycaPUq1f6womzzlJEIdjlsSZNpAcfdG9br93atV63CAAAfwgE3FD399/SqadKAwcq4hDsPHD//W7A277dndhp25sAAIB/5+23pS+/lGJipA8+kAoWVMQh2HmgQAF3SLZwYWniRLd4MQAAOH4rV0p9+ri3H39cql9fEYlg5xFbRPH00+lzAJYu9bpFAACEp6QkqXt3d5eJs8+W+vZVxCLYecjm2NnOFPv2SddcIx086HWLAAAIP888I82Y4a5+tVWwtkgxUhHsPJQvn1u4uEQJae5c6bHHvG4RAADhZcGC9EWJL77o7vQUyQh2HqtYURo+3L39xBPuJw4AAPDP9uyRrrrKHfHq3Fnq2dPrFnmPYBcCunRxh2JtdezVV0s7dnjdIgAAQt/dd0tLlkjly0tvvOEWJI50BLsQ8corbvfxn39Kt9/udWsAAAht48dLr77q3rZdJkqV8rpFoYFgFyJiY90SKDbvzr5+/LHXLQIAIHR3l7A6sMZKnLRv73WLIiTYDRo0SE2aNFHx4sVVpkwZde7cWcuWLTvqc0aMGKGoqKhMR6FChRQJzjxTGjDAvX3zzdLq1V63CACA0NtdwkLdpk1urbpBg7xuUQQFux9++EG33XabZs+erYkTJ+rgwYNq3769du/efdTnxcbGasOGDWnHX3/9pUhhK3uaNXPn2VlNHqvNAwAAXMOGSV9/7e4qMXKkFCF9PzmWX0E0YcKEI3rjrOdu3rx5atmyZbbPs166cuXKKRLlzy99+KHUsKEFY2nIEOm++7xuFQAA3rOFEv36ubetyH+9el63KMLn2O1IWe4ZHx9/1PN27dqlqlWrqnLlyurUqZMWL16c7bn79+9XYmJipiPc1awpvfRSeg/enDletwgAAG9ZMf9u3dyvHTqw0NDzYJecnKw+ffrozDPPVL2jROzatWvr7bff1rhx4/TBBx84z2vRooXWrl2b7Ty+uLi4tMPCoB9ce610xRXSoUPuC9kHeRUAgON2773S//4nlS7troKltEnWogIBm4YYfLfccou++eYb/fjjj6pUqVKOn2fz8urWratu3brpsSy2ZrAeOztSWY+dhTvrHbS5euFs+3Z3SNamGFp9O1stCwBApPnyS+nii93bNr/u/PMV9hITE50OqdzOK3nSY9e7d2999dVXmjJlyjGFOlOgQAE1atRIy5cvz/L7BQsWdC5IxsMvbKsxmxhqe9598AHBDgAQedavT99Rom9ff4S6YApqsLPOQAt1Y8aM0eTJk1X9ODZwS0pK0sKFC1XeykpHoBYtpEcecW/feqv0xx9etwgAgLxhlSFsxGrLFum006Qnn/S6RREe7KzUic2TGzlypFPLLiEhwTn27t2bdk737t3Vv3//tPuPPvqovvvuO61cuVLz58/X1Vdf7ZQ7ueGGGxSp7PK0amWLStz5dgcOeN0iAACCz1a+TpkiFS0qffSRW+IEHga7YcOGOWPHrVu3dnrcUo9Ro0alnbN69WqnVl2qbdu2qVevXs68uo4dOzpj0DNnztTJJ5+sSJU6FGuLiefNkx54wOsWAQAQXLNnu5UhzNCh0kkned2i8JBniyfCfTJiKBg3Turc2b39zTfSeed53SIAAIKzeLBRI3f/9CuvdDs3/LYKNjGcF08gd3TqZMPb7m3blcImlAIA4CfW3WSzryzU2dR822nCb6EumAh2YeaZZ6QGDaTNm91PMVbnDgAAv3j1Venzz60qhmQzt3w2+BZ0BLswY3viffKJVKyYu+XYo4963SIAAHLH/PluSZPUhRNNmnjdovBDsAtDNoH0tdfc248/Lk2a5HWLAAD4d2yHpS5d3MoPVoz4jju8blF4ItiFKRuGtTkINhfhqqukhASvWwQAwPGx32U33STZXgRVqkjvvMO8uuNFsAtjL74o2ba7Gze6BRytkCMAAOHmjTekjz92y3vZVyvvheNDsAtjRYq48+3sqw3HUpEbABBufv01fdjVfo81b+51i8IbwS7M1a3rriAytvWYVegGACAc7NwpXX65tG+fuwfsXXd53aLwR7DzgR493CM5Weralfp2AIDwqVf3++9SxYrSu+9K+Ugl/xqX0Ces165+fWnTJnc/WerbAQBC2SuvuNOJ8ud3v5Yu7XWL/IFg5xM2z+6zz6TixaVp06QBA7xuEQAAWfvpJ6lfP/f2kCFSixZet8g/CHY+q2/31lvu7cGDpS++8LpFAABktmWLO6/u4EHp0kupV5fbCHY+Y/+z/Pe/7m2bd7dypdctAgDAZXPBrTzXmjVSrVpuZwT16nIXwc6HrFu7WTNp+/b01UYAAHjNyplMmOBuj2nTh+LivG6R/xDsfCgmxp2IesIJ7r57dHMDALxm9VYffjh9wV+DBl63yJ8Idj5lW7J8+KHbxf366+72LAAAeGH1arcclw3F9uzpHggOgp2PdejgFi02t9wizZvndYsAAJHGpgPZIom//5ZOO00aOtTrFvkbwc7nrOzJhRdK+/e7/2PZaiQAAPLK7bdLc+e6+79+/rlUuLDXLfI3gp3PWRXv99+XataU/vrLLV6clOR1qwAAkeDNN93DpgV99JFUrZrXLfI/gl0EKFFCGj3a/ZQ0caL00ENetwgA4Hdz5ki33ebefuwxqX17r1sUGQh2EeLUU91PTanLzceN87pFAAC/2rzZnf5z4IB08cVS//5etyhyEOwiyJVXphcv7t5dWrbM6xYBAPzG9iq3FbBWhPjEE6X33nOnBSFvcKkjzDPPSGedJSUmSp07u18BAMgt99wjTZ7s7mFu04AoQpy3CHYRpkAB6dNPpYoVpaVL3a1drK4QAAD/li3We/559/a770r16nndoshDsItA5cpJY8ZIBQtKX36ZXusOAIDjZSVNevVybz/wgHTZZV63KDIR7CJUkybujhSpq5WsuxwAgOOxcaP0n/+4NVMvuEB69FGvWxS5CHYRzBZQ9OmTfnvRIq9bBAAIN7by1Xrn1q6Vatd2t7NksYR3uPQRbsgQ6ZxzpN27pU6dpK1bvW4RACCcWAfBjz9KsbHS2LEslvAawS7C5c8vjRrlVgNfudJdom5L1QEA+CdvvCENG+buLGE9dXXqeN0iEOygUqXcgsW2NN12pujXz+sWAQBC3Q8/SLfe6t62OXW2Lzm8R7BD2s4UtkzdvPRS+sIKAAAOZyM8trOEjfB06eKugkVoINghzSWXuCtkje3vN3Wq1y0CAIQaK2x/0UXSli3S6adL77zjDsUiNBDskIl96kqdZ2efxuxTGQAAJilJ6tZN+u03qUIFdxpP4cJetwoZEeyQiX3qevttt86drZC1T2VsOwYAMPfdJ339tVSokLsC1sIdQgvBDkewT1+p/8PapzL7dGaf0gAAkWvECHe/8dTb1gGA0EOwQ5YydrHbp7O77/a6RQAAr0yfLt14o3v7wQfdBRMITQQ7ZMsmxdqnMmObOg8f7nWLAAB57Y8/pM6dpYMH3bnX7C8e2gh2OKorrpAef9y93bu39O23XrcIAJBXbK617f1qX5s2ld57j+3CQh3/PPhH998v9ejhzrO7/HJp4UKvWwQAyIs9YK0MlvXYVamSXsgeoY1ghxytlLWCxa1aSTt3utXFExK8bhUAIFgCAalXL3d3ieLFpfHjpXLlvG4VcoJghxyJiZFGj5ZOOklavVq6+GJpzx6vWwUACIYnn3SHXaOjpU8/lerV87pFCIlgN2jQIDVp0kTFixdXmTJl1LlzZy1btuwfn/fpp5+qTp06KlSokOrXr6+vbVkmPBcf735qO+EEac4c6ZprpORkr1sFAPhXbJ6NbTX00UfO11EfJWvAAPdbr7widejgdQMRMsHuhx9+0G233abZs2dr4sSJOnjwoNq3b6/du3dn+5yZM2eqW7duuv7667VgwQInDNqxaNGiYDYVOVSrllvjLrUHjzIoABDG7I28WjWpTRvpyis1rc1D6n7lQedbfftKN9/sdQNxrKICARtJzxubN292eu4s8LVs2TLLc7p06eIEv6+++irtsTPOOEMNGzbU8BzU20hMTFRcXJx27Nih2NjYXG0/0tkHuyuvdG+/8IJ0xx1etwgAcMyh7rLL3Al1kpaojlpoprarpP6j0fr0Eyn68ku8bqVvJQYpr+TpHDtrvIm3Mb1szJo1S+3atcv0WIcOHZzHETpsN4qnnnJv33mn9PnnXrcIAHBMw6/2iTwl1G1QOZ2vb5xQ11wz9aGuVnS/Pmw7FIbyLNglJyerT58+OvPMM1XvKLMwExISVLZs2UyP2X17PCv79+93Um/GA3njnnukW25x3xeuvlqaMcPrFgEAcryVxNq1zs2dKqYLy32lv1RNJ+p3faGLVVh7pTVr3PMQVvIs2NlcO5sn9/HHH+f6Ag3rykw9KleunKt/Po5eBuXll90Vsvv2uV9zsDYGAOC1DRucLweVX1eU/0TzExqrdOwmfaPzVUpbjjgP4SNPgl3v3r2dOXNTpkxRpUqVjnpuuXLltHHjxkyP2X17PCv9+/d3hnhTjzX2CQN5xpbC23w7q0hulcnPP9/+vbxuFQDgqMqXlw3C3lJumCZsOF+FY/boq70XqqZWHnEewktQg52ty7BQN2bMGE2ePFnVq1f/x+c0b95ckyZNyvSYrai1x7NSsGBBZ9JhxgN5yyqRf/mlVKOGtGqVu/2MFTIGAISos8/WwMpP662EG5QvKkmjCnRR04NzMg/J2AjY2Wd72UqEWrCz4dcPPvhAI0eOdGrZ2Tw5O/bu3Zt2Tvfu3Z1et1R33HGHJkyYoGeffVZLly7VI488orlz5zoBEaGrTBlpwgSpVClp3jx3GxrbjgYAEHqGvbRVA9e49aqGxt+mi3Z/lTnUpZY8sGEZhJWgBrthw4Y5w6OtW7dW+fLl045Ro0alnbN69WptyDCG36JFCycIvv7662rQoIE+++wzjR079qgLLhAaTjxRslrSRYtK33/v7i9LAWMACC2ffbxbt/U7wbn98GXf6ebC4zOfYFOmPvvM/YSOsJOndezyAnXsvPfdd+5+sgcPSrffLr34YvoHQACAd6Z8f1DnnZ+sA4cK6qbL52nYqMaKSk5yV79aJ4vNqbPhV3rqwjavEOwQ9ALGTzwh3X+/1y0CgMi2YH5Arc7cqZ37YnVJy9n6ZPIZ5DcP+aJAMSKrgLFNzzAPPCC9+abXLQKAyLVihXR+2y1OqGtdb6Y+/JZQ51cEOwSNFTVPXRdz003SmDFetwgAIo+NsHZotVEbt5dSgyq/aOz0M1SokNetQrAQ7BBUNgx73XXuIoquXd1FFQCAvGH1Rdu3+lsr1pVV9dIr9c2MOoorwa9+P+NfF0FliyZeey29/EnnztLs2V63CgD8b9cuqWO7bVr0RymVL7Fe3/9QQuUr0VXndwQ7BF3+/NLIkdK550q7d7u7U/z6q9etAgD/sm0eO1+4Sz8tKKn4Ylv03dd7VaNuvNfNQh4g2CFPFCzozrFr0ULavl1q315avtzrVgGA/xw6JHW9fL8m/VBMxQrt1Dcf/6F6zWt63SzkEYId8owVLh4/XmrQwN1Ptl07ae1ar1sFAP5h85mvu/aQxn1VUAUL7NMXw79X0wvO8LpZyEMEO+SpEiWkb791d6n46y93eHbTJq9bBQDhz6rS/vf2gN7/ML+i8x3Sp0++qTY9/uN1s5DHCHbIc2XLuqtjbX/ppUvdnrstW7xuFQCEd6i76y5p6KtRiopK1rt9H9JFd7HHeiQi2METVapIkya5u9csXOjOubO5dwCAY/fgg9Jzz7m3X7/+Rl319BNeNwkeIdjBMzYca+GudGlp/nzpvPOknTu9bhUAhJfHH3drhppXetymG14bxgbdEYxgB0/VresOy8bHSz/9JF1wgVsSBQDwz4YMcXvrzLNX9dVtrz8p5SvgdbPgIYIdPHfqqdJ330lxcdL06dLFF0t793rdKgAIbS+/LN1zj3v7iSvuV9/ht0sxcV43Cx4j2CEkNG4sTZggFSsmTZ4s/ec/boFNAMCRXn1V+u9/3dsP/udR3f/KBVKx6l43CyGAYIeQccYZ0tdfS0WKuCVRbPsxwh0AHBnqbrvNvX33BU9r4JBqUukzvW4WQgTBDiHl7LOlb75JD3edOjEsCwCphg7NHOoGP7pFUTW7e90shBCCHUJOy5bp4c7m3lnPHeEOQKSzUNe7d4ZQ1+c7RZ022OtmIcQQ7BDS4c62ISPcAYh0GUPdPRcO1uCrByqq7USvm4UQRLBDSIc7m3OXGu5sWHbPHq9bBQDehrqnut6nqCsSqVWHLBHsEDbhbuJEt87drl1etwoA8sazz2YR6rrskvJFe900hCiCHcIi3FkplOLFpalTpQ4dpB07vG4VAAR/Rwnb/9X0v/hJN9T9Z52Uv6jXTUMII9ghLJx1lrtDRYkS0syZUrt20tatXrcKAHJfICA98ED6jhKPXTZAT3Z5QFHnz5eKVPC6eQhxBDuEjaZNpSlTpFKlpLlzpTZtpE2bvG4VAORuqOvXT3rySff+M1f204D/PCGdPVqKb+R18xAGCHYIKw0bSj/8IJUrJ/36q9SqlbR+vdetAoB/4dBu6Zf+St4wVbfekqTnn3cfHnrtrep3wXNSgyelyv/xupUIEwQ7hJ2TT5amTZMqV5aWLnWLGq9c6XWrAOA4/fWJDv76jK69YrWGvxatqKhkvdXrOt167jCpyhXSKf29biHCCMEOYenEE91wV6OGG+psDt6iRV63CgCO3d7F7+jSF0fr/R+7KzrfIX1wa3dd1/od95vbfpHm3yUlTPa6mQgTUYGAjej7R2JiouLi4rRjxw7FxsZ63RwE2YYNUvv2bqgrWdItjWJ7zgJAOEhcvUQXn7dRPyxprUIF9uqT/16hi077KuuTL9smxZTI6yYizPIKPXYIa+XLu3PuLMxt2+aulrV6dwAQ6jZvls45r5gT6ooXStSEe887MtRFWb26KKn2nVJ0Ya+aijBCsEPYi493S6Gce660e7dbxPjzz71uFQBkb80amx+crHlLKqt07CZNHdBarepOO+ysfFLRatK5P0qNn5OiC3rUWoQTgh18wXam+PJL6bLLpIMHpSuukF5/3etWAcCRlixx5wUvW5ZPlU9YrekPnq3Tqi84speuTl+p40KpdAsvm4swQ7CDbxQsKH38sXTDDVJysnTTTdIjj7h1oQAgFFiB9TPPlFavlmpXXq0fH2ql2hV+z3BGlFSshtR+lnTaECk/w684NgQ7+Ep0tNtTN2CAe3/gQDfgHTrkdcsARLpx46S2bd35wGc02acfHzhNVUr9mbmXru49UsdfpVLNvG4uwhTBDr4TFSU99pg0bJiUL5/0xhvSJZdIe/Z43TIAkeq119z3oX37pAsvlCa99LRKFd+WoZeultThJ6nRU1J0IY9bi3BGsINv3Xyzu4iiUCF3/p19Uv77b69bBSCS2FQQ2/PV3o9siohNFRnz+SEVWf+qpGT317AVIO74P+mEJl43Fz5AsIOvde7srpi1GnezZ7tzW1as8LpVACLBgQPS9ddLjz/u3n/4YXeqSP79f0oHtkqxdaXzfpYaPMGKV+Qagh18z8LcjBlSlSrS77+7Ne9sAjMABMv27dL550vvvONOCbGhWFvMZVNFVLyW1HGRdP4vUnxjr5sKnyHYISLUrev22DVu7A7HnnOONGqU160C4EerVkktWkiTJ0vFirlTQW688bCTYk+SomM8aiH8jGCHiNul4uKLpf37pa5dpUGDKIcCIPf89JM7KmC16ipWlKZPlzp29LpViCQEO0RcIePRo6U+fdz7998v9erlFjUGgH/DFmu1bi1t2iQ1bOiOEthXIC8R7BCRte6ef156+WV37stbb0kdOkhbtnjdMgDhyHr9rff/8svdcibWQzdtmlSpktctQyQi2CFi9e7tFgy1OTBTpkjNmrnDJwCQU3v3Sldf7fb+W8C77Tb3faV4ca9bhkgV1GA3bdo0XXTRRapQoYKioqI0duzYo54/depU57zDj4SEhGA2ExHMCoXaCtlq1dwyKDY35uuvvW4VgHCwfr3UqpU0cqSUP79bFP2VV9zbgC+D3e7du9WgQQMNHTr0mJ63bNkybdiwIe0oU6ZM0NoI1K8v/fyz1LKllJjohr1nn2VRBYDszZ0rNWkizZkjxcdL333nFiEGvBbUzxXnn3++cxwrC3IlSpQISpuArJQuLU2c6A7P2hZkd90lLVrkfgK3nSsAINXHH0s9e7rz6U4+WfriC6lmTa9bBYTwHLuGDRuqfPnyOvfcczXDKssexf79+5WYmJjpAI5HTIxbRPSll9wFFiNGuMMsa9Z43TIAoeDQIfdDX7du6Xu+zppFqENoCalgZ2Fu+PDh+vzzz52jcuXKat26tebPn5/tcwYNGqS4uLi0w54DHC+rCn/77dKECe7wig3RWlHjqVO9bhkAL23eLLVv707TMPfeK9m08dhYr1sGZBYVCOTNTCJbBDFmzBh1ts07j0GrVq1UpUoVvf/++9n22NmRynrsLNzt2LFDsfwfh39ZPf6SS6RffnF78IYMcevfOVsCAYio+XT2XmC991YL8913pUsv9bpVCHeJiYlOh1Ru55WQ6rHLStOmTbV8+fJsv1+wYEHngmQ8gNxQvbq7x+w110hJSVLfvtJVV9miIK9bBiCv2F6vZ53lhrqTTnJ78Ql1CGUhH+x++eUXZ4gW8EKRIu6nc5t3ZyUMPvrILYmybJnXLQMQTDaH7qabpOuuc7cgtK0ILdTZYgkgYlfF7tq1K1Nv26pVq5ygFh8f7wyv9u/fX+vWrdN7773nfP+FF15Q9erVdcopp2jfvn168803NXnyZH1n68gBj+fd2dZAVlneVsuefrq7etb2mwXgL/Zry/5ft2kY9v//wIHSAw+4O9UAER3s5s6dqzZt2qTd72tjWZJ69OihESNGODXqVq9enfb9AwcOqF+/fk7YK1KkiE499VR9//33mf4MwCtnn+2+0duKOFtMYV9t26DnnqMkCuAXn33m9tLt3OmWQfrwQ+ncc71uFRCCiyfCfTIikLHkgX2Cf/xx936jRtKnn1LyAAhnNtx6993uHtLG5tVZvbqKFb1uGfwqMVIXTwChxubaPfaY9M030gknSAsWSKed5oY7AOHHthO0HvnUUGelTGz/aEIdwhHBDjhO553nhroWLdytyK64QrrhBlbNAuHkgw/cXnfbGqxkSenLL6WnnmK/V4Qvgh3wL1g9bJtvd//97iTrt95yCxpb4AMQuuzDmJUyssPm06XOobXdJIBwRrAD/qUCBaQnnpC+/16qUMEthWIlUV54QfLXDFYgzFgBSvvkZXWK7Kvdl1u2xHrprLfOVrranNnJk6UqVbxuMPDvEeyAXHLOOdL//ufWuzpwQLrzTumCC6QNG7xuGRCBRo+WqlWTrKrClVc6X5Oq1tCgqxfpzDOllSvdIGcr2x96iKFX+AfBDshFpUq5+0cOHWq7orgLLOrVY2EFkOeh7rLLpLVr0x5arppquW6k7v+wnrOy3ebE2gcxC3mAnxDsgFxmc+1uvVWaN88d7tm61f0lcvXV0rZtXrcO8Dkbbr3jjrR5EPbf4bpJDfQ/zdSZitUOvRPfVx9/mKQSJbxuLJD7CHZAkJxyijR7dnrFeit0Wr++NHGi1y0DfGz69LSeuvUqr44VvtYtGq49Kqo2mqxfdaqu3fq8on6c7nVLgaAg2AFBFBPjFjKeMUM68URp3TqpfXu3R89W4gHIZRs2OL10HxS5SvWKLtKE9eerYP59el599L3aqapSdjti8it8imAH5AFbJWslUG67zb0/bJg79+7bb71uGeAva/NX00Vlv9Q1ez7Qtt3xalxxruYnnaY+elH5nMiXonx5L5sJBA3BDsgjRYtKr7zilkWpXl2ybZKtyHHPnsy9A/4tm1L3+tBdOqXHyRq/8ULF5N+vx8s+oFnrmuvkwJLMk2CtAKUVrgN8iGAH5LG2baWFC9353fY7ZsQI6eSTpTFjvG4ZEJ6sdEm7Fmt1U+9iStwbpzNqzdGCqEZ6YNMgFdCh9BPtfzhjRSajoz1rLxBMBDvAo947+93y449S7dpSQoJ0ySXukaFCA4CjOHhQGvzkftWru0eTZ1dS4Zg9em7AL/pxaROd/PHjR272WqmS9Nln7v9ogE9FBQL+qo2fmJiouLg47dixQ7GxsV43B/hH+/ZJjz4qDRkip75WsWLSY49JvXtTNBXIji1Iuum67Vr8u1uzpM3Jk/XG581Us07RzKVPbJWsLZSwOXU2/EpPHXyeVwh2QIiw4dmbb5ZmznTvWw284cOlpk29bhkQOqwu5L33HNKbb7mfekoV36xnByzUNXefkzbSCkRyXmEoFggRVuPOOhdef10qWdJdRWuraa00ypYtXrcO8FZysvTOO1LtE/enhbobWr+hpUvzq/s9hDogFcEOCCFWyLhXL2npUumaa9yVflYa5aST3K8pe5gDEeWnn+xDTrKuu076e2tBnVJpkaa/977emNJLJ1Qo6XXzgJBCsANCUJky0nvvSVOmuD15NvxkPXeNG7ublgORwBYVXXut23M9Z04+FS+UqCFX3qX5i07QWfbJB8ARCHZACGvdWpo/361/Z8Oztml5q1ZS167SX3953TogOPbvdxcTnXRSQO++6z52bct39Pu453TXB0MUE0dxYSA7BDsgxNnKWNux4vff3cUVNpdo1Ci3TMq990rbt3vdQiD35tF99JFUp450zz227V6Umtb8SbMHNtM741upXPtH0mvRAcgSwQ4IE6VKufPsrAfPevKsV+Ppp6VataQXX5QOHPC6hcDx++EHd8j1yiulP/+UKpRcp3duvFaz3h2mZg/OlorV8LqJQFgg2AFhpmFDafJk6auvpLp13RWzffq4u1d88onb6wGEi99+ky6+2P2wMmeOVKzQTj122QD9/sxJunZwP+U7cwS9dMAxINgBYch+z11wgfTrr9Jrr0lly0orVkhdukinny6NH++uqAVCzrZfnBenvV67d3cXB335pdUNTtIt7V7V8udqacCt81S0506pRH2vWwuEHYIdEObz7268UVq+XHr4YXfXCqt/d+GF0plnuj17QMhY9YHWfHCRbjr/E9Wpk6z333d7mDufPkaLnjpFr/a8TWUvHye1+UaK4tcTcDz4PwfwAQt0jzwirVrlTjovXFiaNUtq21Y65xx3T1rAS+t//Vl9bt2qWn2X6/Vvu+jQoXw6r+F3mvPY6Rpz5yWqc0pRqetBqdQZXjcVCGsEO8BnCywGD3aHZW+/XYqJcWvh2RaZViblu+8YokXesoUQt9ywQ9UbN9CLE/6rA4cKqlXdqZr+0Fn65u4OOr3GPPfEql2kpD1eNxcIe+wVC/jY6tXSE09II0akr5pt0kR64AHpoovcnS6AYFi2TBo0SPrgg4CSktzFD2fVnq6HLxmotqdMyno9RMwJ0mV/53lbAS+wVyyAY1aliru4YuVKd+WsDdHa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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "-1"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def graphique_descente_ex1(x0,k,d):\n",
    "    ##inspiré de A. BODIN et F. RECHER    \n",
    "    xmin, xmax = -1.5*x0, 1.5*x0\n",
    "    plt.axis([xmin,xmax,-1,x0**2+2])\n",
    "     \n",
    "    num = 100\n",
    "    VX = np.linspace(xmin, xmax, num)\n",
    "    #1 Graphe de la fonctions\n",
    "    VY = VX**2+1\n",
    "    plt.plot(VX,VY,color='blue')\n",
    "\n",
    "    # 2. Points et gradients sur l'axe\n",
    "    liste_X, liste_grad = gradDescVect_ex1(x0,k,d)\n",
    "    for x in liste_X:    # points\n",
    "        plt.scatter(x, 0, color='red')\n",
    "    \n",
    "    for i in range(len(liste_X)-1):    # flèches\n",
    "        plt.arrow(liste_X[i],0, -d*liste_grad[i],0, linewidth=1, color='orange', length_includes_head=True, head_width=0.1, head_length=0.1)\n",
    "\n",
    "    # 3. Points et gradients sur le graphe\n",
    "    for x in liste_X:    # points\n",
    "        plt.scatter(x, x**2+1, color='red')\n",
    "    \n",
    "    for i in range(len(liste_X)-1):    # flèches\n",
    "        plt.arrow(liste_X[i],liste_X[i]**2+1, -d,-d*liste_grad[i], linewidth=1, color='orange', length_includes_head=True, head_width=0.05, head_length=0.1)\n",
    "\n",
    "\n",
    "    plt.tight_layout()\n",
    "    plt.show()\n",
    "    return -1\n",
    "\n",
    "\n",
    "graphique_descente_ex1(x0 = 1, k = 10, d = 0.2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exercice 2 : Optimisation d'une fonction dérivable $f$ dont on connait la dérivée $f'$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Question 1**\n",
    "\n",
    "1. Ecrire une fonction `gradDesc_ex2(f,fp,x0,k,d)` qui produit le même résultat que <tt>gradDesc_ex1</tt> mais pour une fonction quelconque <tt>f</tt> dont on connait la dérivée <tt>fp</tt>. \n",
    "\n",
    "2. Remarquer que les résultats obtenus sont bien les mêmes que pour l'exercice 1\n",
    "\n",
    "3. Ecrire une fonction `gradDescVect_ex2(f,fp,x0,k,d)` qui produit les mêmes résultats que <tt>gradDescVect_ex1</tt> mais pour une fonction quelconque <tt>f</tt> dont on connait la dérivée <tt>fp</tt>. \n",
    "\n",
    "La fonction `graphique_descente_ex2` utilise le résultat de <tt>gradDescVect_ex2</tt> pour donner une représentation graphique de la descente de gradient."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "itération  0  x =  1  f(x) =  2\n",
      "itération  1  x =  0.6  f(x) =  1.3599999999999999\n",
      "itération  2  x =  0.36  f(x) =  1.1296\n",
      "itération  3  x =  0.216  f(x) =  1.046656\n",
      "itération  4  x =  0.1296  f(x) =  1.01679616\n",
      "itération  5  x =  0.07776  f(x) =  1.0060466176\n",
      "itération  6  x =  0.046655999999999996  f(x) =  1.002176782336\n",
      "itération  7  x =  0.027993599999999997  f(x) =  1.00078364164096\n",
      "itération  8  x =  0.016796159999999997  f(x) =  1.0002821109907456\n",
      "itération  9  x =  0.010077695999999997  f(x) =  1.0001015599566685\n",
      "itération  0  x =  1  f(x) =  2\n",
      "itération  1  x =  0.6  f(x) =  1.3599999999999999\n",
      "itération  2  x =  0.36  f(x) =  1.1296\n",
      "itération  3  x =  0.216  f(x) =  1.046656\n",
      "itération  4  x =  0.1296  f(x) =  1.01679616\n",
      "itération  5  x =  0.07776  f(x) =  1.0060466176\n",
      "itération  6  x =  0.046655999999999996  f(x) =  1.002176782336\n",
      "itération  7  x =  0.027993599999999997  f(x) =  1.00078364164096\n",
      "itération  8  x =  0.016796159999999997  f(x) =  1.0002821109907456\n",
      "itération  9  x =  0.010077695999999997  f(x) =  1.0001015599566685\n",
      "Obtient-on les mêmes résultats pour le cas x^2 +1 ? True\n"
     ]
    }
   ],
   "source": [
    "def gradDesc_ex2(f,fp,x0,k,d):\n",
    "    x=x0\n",
    "    for i in range(k):\n",
    "        print(\"itération \", i, \" x = \", x, \" f(x) = \", f(x))\n",
    "        x=x-d*fp(x)\n",
    "    return x\n",
    "\n",
    "def f(x):\n",
    "    return x**2+1\n",
    "\n",
    "def fp(x):\n",
    "    return 2*x \n",
    "\n",
    "print(\"Obtient-on les mêmes résultats pour le cas x^2 +1 ?\", gradDesc_ex2(f,fp,1,10,0.2)==gradDesc_ex1(1,10,0.2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([1,\n",
       "  0.6,\n",
       "  0.36,\n",
       "  0.216,\n",
       "  0.1296,\n",
       "  0.07776,\n",
       "  0.046655999999999996,\n",
       "  0.027993599999999997,\n",
       "  0.016796159999999997,\n",
       "  0.010077695999999997],\n",
       " [2,\n",
       "  1.2,\n",
       "  0.72,\n",
       "  0.432,\n",
       "  0.2592,\n",
       "  0.15552,\n",
       "  0.09331199999999999,\n",
       "  0.055987199999999994,\n",
       "  0.033592319999999995,\n",
       "  0.020155391999999994])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def gradDescVect_ex2(f,fp,x0,k,d):\n",
    "    liste_X = []\n",
    "    liste_grad = []\n",
    "    x = x0\n",
    "    for i in range(k):\n",
    "        liste_X.append(x)\n",
    "        grad = fp(x)\n",
    "        liste_grad.append(grad)\n",
    "        x = x - d*grad\n",
    "    return liste_X, liste_grad\n",
    "\n",
    "gradDescVect_ex2(f,fp,1,10,0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "-1"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def graphique_descente_ex2(f,fp,x0,k,d):\n",
    "    ##inspiré de A. BODIN et F. RECHER    \n",
    "    xmin, xmax = -3*x0, 3*x0\n",
    "    plt.axis([xmin,xmax,-2,2])\n",
    "    \n",
    "    xmin, xmax = -5*x0, 5*x0\n",
    "    plt.axis([xmin,xmax,-2*f(x0),2*f(x0)])\n",
    "     \n",
    "    num = 100\n",
    "    VX = np.linspace(xmin, xmax, num)\n",
    "    #1 Graphe de la fonctions\n",
    "    VY =f(VX)\n",
    "    plt.plot(VX,VY,color='blue')\n",
    "\n",
    "    # 2. Points et gradients sur l'axe\n",
    "    liste_X, liste_grad = gradDescVect_ex2(f,fp,x0,k,d)\n",
    "    for x in liste_X:    # points\n",
    "        plt.scatter(x, 0, color='red')\n",
    "    \n",
    "    for i in range(len(liste_X)-1):    # flèches\n",
    "        plt.arrow(liste_X[i],0, -d*liste_grad[i],0, linewidth=1, color='orange', length_includes_head=True, head_width=0.05, head_length=0.1)\n",
    "\n",
    "    # 3. Points et gradients sur le graphe\n",
    "    for x in liste_X:    # points\n",
    "        plt.scatter(x, f(x), color='red')\n",
    "    \n",
    "    for i in range(len(liste_X)-1):    # flèches\n",
    "        plt.arrow(liste_X[i],f(liste_X[i]), -d,-d*liste_grad[i], linewidth=1, color='orange', length_includes_head=True, head_width=0.05, head_length=0.1)\n",
    "\n",
    "    plt.tight_layout()\n",
    "\n",
    "    plt.show()\n",
    "    return -1\n",
    "\n",
    "graphique_descente_ex2(f,fp,1,10,0.2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "__Question 2 : Exemple de problème d'optimisation__\n",
    "\n",
    "Un industriel cherche à optimiser la quantité de métal utilisée pour la fabrication d’une boite de conserve. Nous avons vu en début de cours que la surface $S$ de métal utilisée dépendait du rayon $r$ de la boite (nous fixons le volume à 425mL).\n",
    "\n",
    "$$S(r) = 2\\pi r^2 + \\frac{2V}{r}$$\n",
    "\n",
    "En utilisant la descente de gradient et les fonctions définies précédemment, donner une approximation du rayon permettant d'utliser le moins de métal possible pour produire la boite. A quelle surface ce rayon correspond-il ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "itération  0  x =  1  f(x) =  856.2831853071796\n",
      "itération  1  x =  17.748672587712818  f(x) =  2027.1909039245338\n",
      "itération  2  x =  13.341910254021386  f(x) =  1182.1572783049553\n",
      "itération  3  x =  10.084224568309962  f(x) =  723.2371441610157\n",
      "itération  4  x =  7.71695464353324  f(x) =  484.31948954704563\n",
      "itération  5  x =  6.062940135129554  f(x) =  371.161143428591\n",
      "itération  6  x =  5.001625797493476  f(x) =  327.1265420098078\n",
      "itération  7  x =  4.42413812725547  f(x) =  315.10859140101087\n",
      "itération  8  x =  4.1807744230042365  f(x) =  313.13462420479465\n",
      "itération  9  x =  4.102633860136328  f(x) =  312.94006782452016\n",
      "itération  10  x =  4.081534223669506  f(x) =  312.9261136615771\n",
      "itération  11  x =  4.076207006361292  f(x) =  312.92522824714064\n",
      "itération  12  x =  4.0748877344763645  f(x) =  312.925174009375\n",
      "itération  13  x =  4.074562637851878  f(x) =  312.92517071683693\n",
      "itération  14  x =  4.0744826259862075  f(x) =  312.9251705174102\n",
      "itération  15  x =  4.074462939688202  f(x) =  312.92517050533775\n",
      "itération  16  x =  4.074458096390685  f(x) =  312.9251705046071\n",
      "itération  17  x =  4.074456904846289  f(x) =  312.92517050456286\n",
      "itération  18  x =  4.074456611704768  f(x) =  312.9251705045602\n",
      "itération  19  x =  4.074456539586721  f(x) =  312.92517050456\n",
      "Le rayon minimal trouvé en 20 pas est de 4.074456521844398\n",
      "La surface correspondante est égale à 312.92517050456\n"
     ]
    }
   ],
   "source": [
    "def f(x):\n",
    "    return math.pi*x**2*2 + 2*425/x\n",
    "\n",
    "\n",
    "def fp(x):\n",
    "    return math.pi*4*x - 2*425/(x**2)\n",
    "\n",
    "x0 = 1\n",
    "k = 20\n",
    "d = 0.02\n",
    "rMin = gradDesc_ex2(f, fp, x0, k, d)\n",
    "\n",
    "print(\"Le rayon minimal trouvé en\", k, \"pas est de\", rMin)\n",
    "print(\"La surface correspondante est égale à\", f(rMin))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Question 3** \n",
    "\n",
    "À l'aide des widgets suivant, observer l'influence des paramètres $k$ et $d$. Commentez"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "390458281d5e47abaed522a2788f379e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(IntSlider(value=25, description='k', max=50), FloatSlider(value=0.25, description='d', m…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<function __main__.graphique_descente_ex2(f, fp, x0, k, d)>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from ipywidgets import interact, fixed\n",
    "\n",
    "def f(x):\n",
    "    return np.sin(x)\n",
    "\n",
    "def fp(x):\n",
    "    return np.cos(x)\n",
    "\n",
    "interact(graphique_descente_ex2,f=fixed(f),fp=fixed(fp), x0=fixed(1), k=(0, 50, 1), d=(0., .5, 0.005))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "30242579f09243c895c2c143715a560a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(IntSlider(value=25, description='k', max=50), FloatSlider(value=2.0, description='d', ma…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<function __main__.graphique_descente_ex2(f, fp, x0, k, d)>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "interact(graphique_descente_ex2,f=fixed(f),fp=fixed(fp), x0=fixed(1), k=(0, 50, 1), d=(0., 4, 0.005))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "__Influence de k :__\n",
    "TODO\n",
    "\n",
    "__Influence de d :__\n",
    "TODO"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exercice 3 : Cas d'une fonction dont on ne connait pas la dérivée\n",
    "\n",
    "Le but de cette dernière partie est de proposer un algorithme pour utiliser la méthode du gradient\n",
    "\n",
    "\n",
    "Pour cela, on utilise :\n",
    "\n",
    "$$f'(x) = \\lim_{t \\to 0} \\frac{f(x)-f(x+t)}{t} \\approx \\frac{f(x)-f(x+\\varepsilon)}{\\varepsilon}$$\n",
    "\n",
    "\n",
    "_Remarque stabilité numérique :  on prend généralement un petit epsilon que l'on fixe, par exemple $\\varepsilon = 10^{-5}$ et l'on symétrise, on choisira donc :_\n",
    "$$f'(x)  \\approx \\frac{f(x+\\varepsilon)-f(x-\\varepsilon)}{2\\varepsilon}$$\n",
    "\n",
    "\n",
    "\n",
    "_Remarque python_ : on pourra utiliser les lambda expressions pour recycler le code précédent https://www.w3schools.com/python/python_lambda.asp "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. Ecrire une fonction `fp_approx` qui donne l'approximation de la dérivée au point x en utilisant la formule précédente. \n",
    "\n",
    "2. Pour la fonction donnée, écrire la fonction `fp` donnant sa dérivée exacte. Comparer les résultats en un point.\n",
    "\n",
    "3. Faire la descente de gradient en utilisant <tt>fp_approx</tt> pour trouver le minimum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Difference entre la derivée exacte et l'approximation : -5.475229158946604e-10\n",
      "itération  0  x =  1  f(x) =  136\n",
      "itération  1  x =  1.5199999999945248  f(x) =  105.53954816034928\n",
      "itération  2  x =  2.157927679990678  f(x) =  63.683729824314135\n",
      "itération  3  x =  2.8023085867469035  f(x) =  27.52464128908523\n",
      "itération  4  x =  3.2390244835275297  f(x) =  14.403733275905445\n",
      "itération  5  x =  3.380154306445448  f(x) =  13.284284706588853\n",
      "itération  6  x =  3.3950286824545586  f(x) =  13.272725430550409\n",
      "itération  7  x =  3.395666862374135  f(x) =  13.272704319923347\n",
      "itération  8  x =  3.39569021568542  f(x) =  13.272704291663857\n",
      "itération  9  x =  3.395691063973082  f(x) =  13.27270429162657\n",
      "itération  10  x =  3.3956910947786625  f(x) =  13.27270429162652\n",
      "itération  11  x =  3.395691095896879  f(x) =  13.272704291626518\n",
      "itération  12  x =  3.395691095936847  f(x) =  13.272704291626518\n",
      "itération  13  x =  3.3956910959386235  f(x) =  13.272704291626521\n",
      "itération  14  x =  3.3956910959386235  f(x) =  13.272704291626521\n",
      "itération  15  x =  3.3956910959386235  f(x) =  13.272704291626521\n",
      "itération  16  x =  3.3956910959386235  f(x) =  13.272704291626521\n",
      "itération  17  x =  3.3956910959386235  f(x) =  13.272704291626521\n",
      "itération  18  x =  3.3956910959386235  f(x) =  13.272704291626521\n",
      "itération  19  x =  3.3956910959386235  f(x) =  13.272704291626521\n",
      "Minimum 13.272704291626521 trouvé en 3.3956910959386235\n"
     ]
    },
    {
     "data": {
      "image/png": "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jjjiCBUvXlyNGzfWZ599FvaQkEv9+vVTw4YNg1OJKlWqpA4dOmjx4sVhDwsH6LHHHgte83r27KlERrDz1F133RUcPYL4smjRouAIvBdeeEELFizQk08+qSFDhuiee+4Je2jYg1GjRumOO+4IwveXX36pE088UW3atNFvv/0W9tCQC9OnT9ctt9yiOXPmaMqUKdq2bZtat26tjRs3hj005NHnn38e/Nw84YQTlOhod+KhSZMmBS82Y8aM0XHHHaevvvoqmL1DfBowYIAGDx6sn376KeyhIAebobMZn0GDBgUfWyi38yp79Oih3r17hz085NGaNWuCmTsLfC1atAh7OMilDRs26OSTT9bzzz+vhx9+OHi9e+qpp5SomLHzzOrVq9WtWze9+uqrKlmyZNjDQT5ITU1VuXLlwh4GcrDl8blz5+rMM8/Mdi61fTx79uxQx4YD/79m+P8WX2zWtV27dtn+LyayImEPAPnHJl+7dOmiG2+8UaecckqwXwvx7YcfftCzzz6rgQMHhj0U5PD7779rx44dqly5crbH7WNbUkd8sdlW25vVvHlz1atXL+zhIJdGjhwZbIOwpVg4zNjFAVvSsQ2h+7rshcQCwPr169WnT5+wh4wD/B5mtXz5crVt21aXXHJJMAsLILqzPvPnzw+CAuLD0qVLddttt+n1118PipfgsMcuTvZ9rF27dp/PqVWrli699FJNmDAhCAkRNqNQuHBhdezYUcOHDy+A0eJgvodFixYN7q9YsUItW7ZUkyZNNGzYsGCJD7G3FGvbHd56662gmjKic+fOWrduncaPHx/q+JB73bt3D75fM2bMCCrSER/GjRunCy64IHiNy/qal5SUFPzMtO4QWT+XKAh2Hvn111+VlpaW8bGFA6vQsxce2+SdkpIS6viQOzZT16pVKzVo0ECvvfZaQv5gihf2/6pRo0bBbHlkOa969epBUKB4IvbZy58VuowdO1bTpk3TUUcdFfaQkAe2QvXLL79ke+yaa65RnTp1dPfddyfskjp77DxiLyhZlSpVKri1XmiEuvgJdTZTV6NGjWBfnc30RVSpUiXUsWF3Vn1uM3S2p9UCnlXiWasMe3FBfCy/jhgxIpits152q1atCh5PTk4O+kgittn3LGd4O/TQQ1W+fPmEDXWGYAfEEOulZQUTduUM40yux57LLrssCN99+/YNQoG1WZg8efJuBRWITdZGyNibqaxefvnloBANiEcsxQIAAHiCHdkAAACeINgBAAB4gmAHAADgCYIdAACAJwh2AAAAniDYAQAAeIJgBwAA4AmCHQAAgCcIdgAAAJ4g2AEAAHiCYAcAAOAJgh0AAID88P8BPPgeLZnArgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "-1"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eps = 1e-5\n",
    "\n",
    "def fp_approx():\n",
    "    def res(x) :\n",
    "        return (f(x+eps)-f(x-eps))/(2*eps)\n",
    "    return res\n",
    "\n",
    "def f(x):\n",
    "    return (x**2 - 11)**2 + (x - 7)**2\n",
    "\n",
    "#dérivée -14 - 42*x + 4*x**3\n",
    "def fp(x):\n",
    "    return -14 - 42*x + 4*x**3\n",
    "\n",
    "print(\"Difference entre la derivée exacte et l'approximation :\",fp(1)-fp_approx()(1))\n",
    "\n",
    "xMin = gradDesc_ex2(f, fp_approx(), 1, 20, 0.01)\n",
    "\n",
    "print(\"Minimum\",f(xMin), \"trouvé en\", xMin)\n",
    "# min{(x^2 - 11)^2 + (x - 7)^2}≈13.2727 at x≈3.3957\n",
    "\n",
    "\n",
    "\n",
    "graphique_descente_ex2(f,fp_approx(),1,20,.01)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.9.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
