{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2fb93c53",
   "metadata": {},
   "source": [
    "# TP 2 — Méthode de Newton–Raphson"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3e2e34d",
   "metadata": {},
   "source": [
    "#### Préambule\n",
    "La fiche suivante traite de l’algorithme de Newton–Raphson pour déterminer des racines de fonctions.\n",
    "Il n’est pas attendu que vous soyez capable de la terminer endéans les trois heures de TP.\n",
    "L’important est d’essayer d’avancer à votre rythme, et de manipuler à la fois des mathématiques et de l’implémentation numérique.\n",
    "La fiche a été conçue pour être suffisamment longue pour occuper même celles et ceux d’entre vous qui seraient les plus rapides, motivés, et curieux."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "24f0e6dc",
   "metadata": {},
   "source": [
    "## Initialisation des packages"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c6a6df74",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "29fbbb85",
   "metadata": {},
   "source": [
    "## Implémentation de l’algorithme de Newton-Raphson"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f651660c",
   "metadata": {},
   "source": [
    "Dans un premier temps, on implémente une itération de l'algorithme de Newton-Raphson."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3e90da56",
   "metadata": {},
   "outputs": [],
   "source": [
    "def iter_NR(x,f,df):\n",
    "    '''\n",
    "    Input : f et df deux fonctions d'une variable reelle, df est la derivee de f\n",
    "        x0 une valeur reelle dans le domaine de f et df\n",
    "    Output : x1, la valeur de l'iteration de Newton-Raphson pour f a partir de x0\n",
    "    '''\n",
    "    # A COMPLETER\n",
    "    return x_next"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f1f9b6ba",
   "metadata": {},
   "source": [
    "Ensuite, on utilise la fonction construite ci-haut pour mettre en œuvre l'algorithme de Newton-Raphson complet."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9b5c39b0",
   "metadata": {},
   "outputs": [],
   "source": [
    "def NR(x0, nb_iter, f, df):\n",
    "    '''\n",
    "    Input : f et df deux fonctions d'une variable reelle, df est la derivee de f\n",
    "        x0 une valeur reelle dans le domaine de f et df\n",
    "        nb_iter un entier\n",
    "    Output : une liste de nb_iter+1 couples (xk,f(xk)) avec les premieres iterations de la methode de Newton-Raphson pour f a partir de x0\n",
    "    '''\n",
    "    # A COMPLETER\n",
    "    retrn iters"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6fd95f9a",
   "metadata": {},
   "source": [
    "## Outil de représentation graphique"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0a4c3f5",
   "metadata": {},
   "source": [
    "La fonction proposée ci-dessous permet de représenter graphiquement une fonction $ f $ ainsi que les valeurs des itérées de Newton fournies selon le format renvoyé par la fonction NR.\n",
    "On pourra consulter les spécifications pour une description précise des arguments à fournir."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "409b1636",
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_NR(left,right,f,nb_sample_points,iters):\n",
    "    '''\n",
    "    Input : left la limite gauche de l'intervalle à représenter, right la limite droite de l'intervalle à representer,\n",
    "        f la fonction dont on souhaite representer le graphe, nb_sample_points le nombre de points d'echantillonnage utilises dans le calcul de la representation graphique,\n",
    "        iters les iterees de Newton-Raphson a representer, fournies sous le format renvoye par NR\n",
    "    Output : aucune valeur retrournee, affiche une representation graphique de f sur l'intervalle [left,right] et des iterees de Newton-Raphson correspondantes\n",
    "    '''\n",
    "    x = np.linspace(left,right,nb_sample_points)\n",
    "    y = f(x)\n",
    "    x_iter = []\n",
    "    y_iter = []\n",
    "    for it in iters:\n",
    "        if (it[0] >= left) and (it[0] <= right):\n",
    "            x_iter.append(it[0])\n",
    "            y_iter.append(it[1])\n",
    "    plt.plot(x,y,'-')\n",
    "    plt.plot(x_iter,y_iter,'o')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce372ae3",
   "metadata": {},
   "source": [
    "## Premiers essais"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c91048b6",
   "metadata": {},
   "source": [
    "Test sur la fonction $ \\sin $.\n",
    "La solution au premier exercice vous est fournie afin d'illustrer la syntaxe.\n",
    "Ensuite, c'est à vous de compléter pour les suivants."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "46de6a0a",
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "iters_sin_1 = NR(1,10,np.sin,np.cos)\n",
    "print(iters_sin_1)\n",
    "plot_NR(-10,10,np.sin,1000,iters_sin_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1b21efa8",
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "iters_sin_minus_3 = # A COMPLETER\n",
    "# A COMPLETER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9b14dfda",
   "metadata": {},
   "outputs": [],
   "source": [
    "iters_sin_1_point_5 = # A COMPLETER\n",
    "# A COMPLETER"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a0de104",
   "metadata": {},
   "source": [
    "Test sur la fonction $ \\arctan $."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "483aa911",
   "metadata": {},
   "outputs": [],
   "source": [
    "def darctan(x):\n",
    "    return # A COMPLETER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "95f2bb2b",
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "iters_arctan_1 = # A COMPLETER\n",
    "# A COMPLETER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b8e73b8a",
   "metadata": {},
   "outputs": [],
   "source": [
    "iters_arctan_minus_3 = # A COMPLETER\n",
    "# A COMPLETER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2b9177aa",
   "metadata": {},
   "outputs": [],
   "source": [
    "iters_arctan_1_point_5 = # A COMPLETER\n",
    "# A COMPLETER"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0ebc39d9",
   "metadata": {},
   "source": [
    "Tests sur la fonction $f$ définie par $ f(x) = x^{3}-2x+2 $."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9e004dae",
   "metadata": {},
   "outputs": [],
   "source": [
    "def f_per(x):\n",
    "    return # A COMPLETER\n",
    "\n",
    "def df_per(x):\n",
    "    return # A COMPLETER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "32512f6e",
   "metadata": {},
   "outputs": [],
   "source": [
    "iters_f_1 = # A COMPLETER\n",
    "# A COMPLETER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3cde21f2",
   "metadata": {},
   "outputs": [],
   "source": [
    "iters_f_minus_3 = # A COMPLETER\n",
    "# A COMPLETER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ddcc25d1",
   "metadata": {},
   "outputs": [],
   "source": [
    "iters_f_1_point_5 = # A COMPLETER\n",
    "# A COMPLETER"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "863c384c",
   "metadata": {},
   "source": [
    "## Questions de convergence"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34423f40",
   "metadata": {},
   "source": [
    "Convergence lente."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "91b9ec0e",
   "metadata": {},
   "outputs": [],
   "source": [
    "def f_slow(x,n):\n",
    "    return x**n\n",
    "\n",
    "def df_slow(x,n):\n",
    "    return # A COMPLETER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9e1cb922",
   "metadata": {},
   "outputs": [],
   "source": [
    "iters_f_10 = # A COMPLETER\n",
    "# A COMPLETER "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d8be0431",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "iters_f_50 = # A COMPLETER\n",
    "# A COMPLETER"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e895714",
   "metadata": {},
   "source": [
    "Une fonction avec un point singulier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2ccd2692",
   "metadata": {},
   "outputs": [],
   "source": [
    "alpha=0.4\n",
    "def abs_alpha(x):\n",
    "    return np.abs(x)**alpha\n",
    "\n",
    "def dabs_alpha(x):\n",
    "    return # A COMPLETER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1665c1ea",
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "iters_abs_alpha = # A COMPLETER"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97ff05bb",
   "metadata": {},
   "source": [
    "Une fonction oscillante."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9eb35f86",
   "metadata": {},
   "outputs": [],
   "source": [
    "def f_osc(x):\n",
    "    return (x**4)*np.sin(1/x)+2*x**4\n",
    "\n",
    "def df_osc(x):\n",
    "    return # A COMPLETER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d9102c17",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "iters_f_osc = # A COMPLETER\n",
    "# A COMPLETER"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7919f62f",
   "metadata": {},
   "source": [
    "## Méthode de la sécante"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "169fcca5",
   "metadata": {},
   "source": [
    "Ci-dessous, on se propose d'implémenter la méthode de la sécante."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e1a10fb2",
   "metadata": {},
   "outputs": [],
   "source": [
    "def secante(x0,x1,nb_iter,f):\n",
    "    '''\n",
    "    Input : f une fonction d'une variable reelle\n",
    "        x0 et x1 les deux valeurs initiales pour la methode, dans le domaine de f\n",
    "        nb_iter le nombre d'iterations souhaitees, un naturel non nul\n",
    "    Output : une liste de couples, contenant les iterations de la methode et les valeurs de f associées\n",
    "    '''\n",
    "    # A COMPLETER\n",
    "    return iters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d5456baf",
   "metadata": {},
   "outputs": [],
   "source": [
    "iters_sin_secante = # A COMPLETER\n",
    "# A COMPLETER"
   ]
  }
 ],
 "metadata": {
  "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.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
