{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TP 3 : Longueur de courbes, diagonalisation et suites de matrices\n",
    "\n",
    "Dans ce troisième TP, on utilise SymPy pour :\n",
    "- calculer la longueur d'une courbe paramétrée, de manière exacte ou approchée ;\n",
    "- passer d'une courbe paramétrée à une équation implicite pour calculer des intersections ;\n",
    "- diagonaliser une matrice et s'en servir pour calculer ses puissances ;\n",
    "- programmer des boucles pour étudier des suites définies à l'aide de matrices."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Cellule d'initialisation à exécuter en premier\n",
    "%matplotlib inline\n",
    "import sympy as sy\n",
    "from IPython.display import display\n",
    "sy.init_printing()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Longueur d'une courbe paramétrée\n",
    "\n",
    "La longueur de la courbe $t \\mapsto \\big(x(t), y(t)\\big)$ pour $t \\in [a,b]$ est\n",
    "$$\\ell = \\int_a^b \\sqrt{x'(t)^2 + y'(t)^2}\\,dt .$$\n",
    "Quand SymPy trouve une primitive, on obtient une valeur exacte. Sinon, comme au TP 1, on construit l'intégrale non évaluée avec `sy.Integral` et on en calcule une valeur approchée avec `evalf`.\n",
    "\n",
    "Exemple 1 : l'arc de parabole $x = t$, $y = t^2/2$ pour $t \\in [0,1]$.\n",
    "\n",
    "Exemple 2 : l'ellipse $x = 2\\cos t$, $y = \\sin t$. Son périmètre ne s'exprime pas avec les fonctions usuelles."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAANMAAAAcCAYAAAD7uYq4AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAASdAAAEnQB3mYfeAAABzxJREFUeJztnH2MXUUZxn/bloKAW5AoFRVLw0cUCfUrAmKtooWGYlkQDVGBEBWbNBuICIHWPD4KSFS0GjGAFVoMiAREk9JaUT5so2AkLRHQ1GKrVNpqqxYhgWpZ/5jZ3ZPLuXvO3s6554D3l2wme2fmfWefe98zM+/M3b6hoSGaiu0JwKCkxXWPJQW2U4t9hKQNiW02Ftv7Ac+ksiepL5UtgEkpjVXAlcD36x5ECmy/HZgv6bpE9vqAG21fJOlfKWw2majfO1MHQEom1D2Adth+NzBZ0uN1jyURpwJ3pzImaQi4FvhSKpsNJ6l+VdDYYAK+DCypexAJOVTSkykNSvotcJztaSntNpTk+qWmkcFk+2RgH0m/r3ssKbB9MLC1IvO3AYsqst0IKtYvGY0MJuB84P66B5GQOcCKimz/Evio7X0rst8EqtQvGY0LJtsTgVOAtXWPJSHvAh6syPbvgFcA763IfhOoUr9kjAST7Wm2h2wvrXE8AG8B+oFHah5HEmzvBeyW9EIV9iU9B6wHTqjCft1UrV9KmpgaPyqWf2/XwPaHCU/iGcCxwCuBWyR9vPLRjZ8TgTV5FbYPAgYImapjgNcBuwizzU3ATSU/RNuBI9tVxj3HU8B3gC8k8tktKtcvlT6NW+YRBg/w9BhtFgELCMH016oHtIecDKxqU3cW8F3CMuYhYDFwJ2F2XgLcHs+TiniaUd3ymEd4r3+U0Ge36IZ+SfRp4sy0H7BL0vNjtLkI2AxsIMxQ9+2pU9vnEZ4875N0fwf9JwATJP23pepASf9s02098CHg7uzTzvblwG+AM4EzCG/mWOxk7GAaAHYQkhV9iXy+iD3RsGb9kuhTKphsf4QwExwLTCZ8iG8Fvt76oY9ROwhcAEyPg7wLWEjcB0maNoa7FyiYMSWNBI/tMn9Cpdg+EPhB/FmWeX068ES7fpLubfP6VtvXEW6AzKL4wzAJ2N1mbP3A+4FbJe0GUvlMRp36pdSncJln+yrgh8CbCAH0bUL0XgWssj25pcu1hKlxCnADQaDZwD3AXkX+gH8Dk15iqd6jgW3A3JbX59L5qf1/Ytn6pM6jn6BbHnMJD8C7EvtMSZ36JdNnzGCyfTxwGfAkcIyk+ZI+R9irLCcssS7OtH8PMJ8w/R4taVDSxYT15nPAISUG/JdY9pdo2wgkrQGuAGbH7NMwb5b02Hjt2Z4EnBN//WmJLv2M6tbKAPAs8LPEPpNRs37J9Cmamc6P5RWSRk6g47r2s4Ql2Scz7c+N5ZXZy5eSdhGCsgzD4o21B2gckv5IOKWfCSM3nJ/t0NzVhAfQCkntNt9ZDmFUtxFs70M4s1sZU+gpfSalDv1S61O0Z3pbLF+0jpS03vZm4DDbUyTtBN4aq/NSmQ9SYvkgaYPtrdHWw0XtO8H2JuCNbarvy9mHLZN0XgnTywnLhl8AHwB+3sHYBgkPqj8AnyjR/gBgGrA6p/qDwP4ULGHG6zP22UR6DbutX1J9ioJpSiy3tKnfAhwKHEDIKA2339baUNJu2zsK/A3zY0YDuQoWE8acZQYhRboM2NRSt66k3eXA9YRs4yzKz8YA2F4AfBN4HDhJ0j9KdJtBOCN5KKfuDMIZSdt9R4c+oRoNu61fUn2KgmlnLKeSn1V5bUu74bOhg4E/tQxqInAQ5c6FrgfusN0Xv2qQlLwvG8a07jxgaSep8chq4DW2jwL2LrF0yPq/EPgG8CjhTftbya6nAEtaDxKj3qcB98ZVQ0qfVWnYNf2q0KdozzR8P25WjqPDgdcDGzP7o+H2J+bYOo6SqXhJ6wg5/Zll2jeFuJdcRThUXle2n+1LCW/aOsIZTakPdTybmQNck1M9k/Dwyl3CdOqzSrqsX3J9ioLpxlgusv3qjKOJwNdi/+9l2t8cy4W2p2TaTyak0sfDQuBT4+zTBJYDH6PkLWfbnydsbh8mPP22j8PXPOBmSXm3RQYICaKfJPZZNd3SL7k+Y84Ukn5l+yvAJcCjtu8gZFjmEDIba4CvZto/YPsG4NPAY7bvJOTmTyMsBZ+Kf0AhkjbaXml7jqSVLX/s6cDp8depsTw+c0l3e0zJ18EKYK2kzUUNbZ8LfJFw4LoaGMzZuG+StDSn7/6E87sFOXV9BH1+LWlbS13HPrtE5fpVpU/hskvSpbbXEt60cwgHr08QpuJrYto7y3xC1uMC4DOM3oC4nHAFqO2Jdo7vW2yflVM1g9E0/DDT4w/An8mcf3UTSTtsn1my+WGxnAhc2KbNA8DSnNdPAC6Jp/atvAN4AyFJkNJn5XRJv0r06evWfyeyfQThMPc2SWd3xen/KfHWymXAdEkb6x5P06hKn+S3xm1PjRvj7Gv7MvoUKHNto8eeMQA80guktlSiT/KZyfbVwNmEr51vIexpTiJk/lYCp1aR7u7Ro26q+ArGPYTb5bOBVxFuPawHvgUs7gVSj5crXdsz9ejxcqeJ37Tt0eMlyf8Azs2ITZNhj7kAAAAASUVORK5CYII=",
      "text/latex": [
       "$\\displaystyle \\frac{\\log{\\left(1 + \\sqrt{2} \\right)}}{2} + \\frac{\\sqrt{2}}{2}$"
      ],
      "text/plain": [
       "log(1 + √2)   √2\n",
       "─────────── + ──\n",
       "     2        2 "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFMAAAAQCAYAAABqfkPCAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAAvtJREFUeJzt2EuIXEUUBuBvdBIMRFFXulAxohiCOLrwhUERxYUGElARmdEsoisRFRcixuNZqUgWgiBOEuITXWhQ8AUiARGyzUIUn/ExuogjgooTlcy4qLqx0+k7j+4WZ5Efiqpb9d+/us49VedUj8zNzTmG4WC08yEzb8JVGMOFOBEvR8T4UoUH1crMcbxYH++MiB1d45uxawGZ2Yg4vh9+xzwj2FLLOozgU+zAZETMNtwjjImHlYX/jimcv8Dk86Fvrcw8A0/Xd1e30PYhW8bW4xq8OwC/wUu4DQfwCv7AdXgGV+D2hthtzPuUhX+peNWelskXg760qifsws/YjQd68SJin2KgXhp7a3OyX37t36QYcj8uiYjp2r8Sr2MiM9+IiN10GTMi9nQI9Zp30RhA6x7FS66u9ZKQmRfgMvyAtwfkb6r1tsaQEBF/ZeZW3Ii7lY/uuKX+2P8SmbkWj+OpiPiwT5m7ar0zIg4NyD+t1l/3eK/pW189dfkYMzNHlYDzHR7qU2MVxnFICRCD8htvPLvH2JpajzbtZWNMPIKLsDkiZvrUuAUn472I+H4I/Gbb35+ZpzadmbnCkcHsFI4OQP8LMvNSxRu3RcTehfjzoNmyzw6J/yomcD0+ycw3cRDX4nRlF52JWZaBZ9bt/QI+x9YBdNYpqcoU3hkGv56hG/AgfsIdtXxR3/2tUg+wPDxzNc6r7YMtkX97Zm5XAtO9LTrDDDyHERF/44laDiMzT8C5mI6I/SwPY/6JnS1jFyvn6Ef4DD2PgLqwCSWQtGn1zW/BrVipJPIY0JiZeQ5W4Kv6BZeMGmy2tOg/qhjz+e7rZBduVoLAW4sMPIvmZ+ZJEfFrV98YnsQvSiqHo+/mG7GxPjY51uWZ+VxtT0dE543kA5ylpA7fDKg1CJotOzkvqz/++5k5g4+VM3ItbsAMNkTEjw2x2zPHlAO2E2v8m1N9q+V61wPD1GpFTfSvtPjAsyQ+XlO29DhWKTelSTwWEVOdxJFjf8END/8APV4s3SJeA6MAAAAASUVORK5CYII=",
      "text/latex": [
       "$\\displaystyle 1.14779$"
      ],
      "text/plain": [
       "1.14779"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/latex": [
       "$\\displaystyle \\int\\limits_{0}^{2 \\pi} \\sqrt{4 \\sin^{2}{\\left(t \\right)} + \\cos^{2}{\\left(t \\right)}}\\, dt$"
      ],
      "text/plain": [
       "2⋅π                            \n",
       " ⌠                             \n",
       " ⎮     _____________________   \n",
       " ⎮    ╱      2         2       \n",
       " ⎮  ╲╱  4⋅sin (t) + cos (t)  dt\n",
       " ⌡                             \n",
       " 0                             "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/latex": [
       "$\\displaystyle 9.68844822$"
      ],
      "text/plain": [
       "9.688448220"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = sy.symbols('t', real=True)\n",
    "\n",
    "# Exemple 1 : longueur exacte\n",
    "xp, yp = t, t**2/2\n",
    "vitesse = sy.sqrt(sy.diff(xp, t)**2 + sy.diff(yp, t)**2)\n",
    "Lp = sy.integrate(vitesse, (t, 0, 1))\n",
    "display(Lp, Lp.evalf(6))\n",
    "\n",
    "# Exemple 2 : longueur approchée\n",
    "xe, ye = 2*sy.cos(t), sy.sin(t)\n",
    "ve = sy.sqrt(sy.diff(xe, t)**2 + sy.diff(ye, t)**2)\n",
    "Le = sy.Integral(ve, (t, 0, 2*sy.pi))\n",
    "display(Le, Le.evalf(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### À vous de jouer\n",
    "- **Exercice 1**\n",
    "  1. Tracer le cercle $x = \\cos t$, $y = \\sin t$ pour $t \\in [0, 2\\pi]$ et retrouver sa longueur. *Indication* : simplifier l'expression sous l'intégrale avant d'intégrer.\n",
    "  2. Tracer la courbe $\\mathcal C$ définie par $x = \\cos t$, $y = \\sin(2t)$ pour $t \\in [0, 2\\pi]$ et donner une valeur approchée de sa longueur avec 10 chiffres significatifs.\n",
    "- **Exercice 2** On cherche les points d'intersection de $\\mathcal C$ avec le cercle de centre $(0,0)$ et de rayon $\\frac12$.\n",
    "  1. Montrer que tout point de $\\mathcal C$ vérifie l'équation implicite $y^2 = 4x^2(1-x^2)$. *Indication* : remplacer $x$ et $y$ par $\\cos t$ et $\\sin(2t)$, puis utiliser `sy.expand_trig` et `sy.simplify`.\n",
    "  2. En déduire les points d'intersection en résolvant un système polynomial avec `solve`. Combien y en a-t-il ?\n",
    "  3. Tracer $\\mathcal C$ et le cercle sur un même graphique avec `plot_parametric`, qui accepte plusieurs courbes, et vérifier visuellement le résultat."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Exercice 1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Exercice 2\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Diagonalisation\n",
    "\n",
    "Une matrice carrée $A$ est diagonalisable s'il existe une matrice inversible $P$ et une matrice diagonale $D$ telles que $A = PDP^{-1}$. Les coefficients de $D$ sont les valeurs propres de $A$ et les colonnes de $P$ sont des vecteurs propres associés.\n",
    "\n",
    "La méthode `diagonalize` renvoie $P$ et $D$. La méthode `is_diagonalizable` indique si la matrice est diagonalisable. Appeler `diagonalize` sur une matrice qui ne l'est pas provoque une erreur."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1 & 2 & 3\\\\4 & 5 & 6\\\\7 & 8 & 9\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡1  2  3⎤\n",
       "⎢       ⎥\n",
       "⎢4  5  6⎥\n",
       "⎢       ⎥\n",
       "⎣7  8  9⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1 & - \\frac{3 \\sqrt{33}}{22} - \\frac{1}{2} & - \\frac{1}{2} + \\frac{3 \\sqrt{33}}{22}\\\\-2 & \\frac{1}{4} - \\frac{3 \\sqrt{33}}{44} & \\frac{1}{4} + \\frac{3 \\sqrt{33}}{44}\\\\1 & 1 & 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡      3⋅√33   1    1   3⋅√33⎤\n",
       "⎢1   - ───── - ─  - ─ + ─────⎥\n",
       "⎢       22     2    2    22  ⎥\n",
       "⎢                            ⎥\n",
       "⎢     1   3⋅√33    1   3⋅√33 ⎥\n",
       "⎢-2   ─ - ─────    ─ + ───── ⎥\n",
       "⎢     4    44      4    44   ⎥\n",
       "⎢                            ⎥\n",
       "⎣1        1            1     ⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}0 & 0 & 0\\\\0 & \\frac{15}{2} - \\frac{3 \\sqrt{33}}{2} & 0\\\\0 & 0 & \\frac{15}{2} + \\frac{3 \\sqrt{33}}{2}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡0      0           0     ⎤\n",
       "⎢                         ⎥\n",
       "⎢   15   3⋅√33            ⎥\n",
       "⎢0  ── - ─────      0     ⎥\n",
       "⎢   2      2              ⎥\n",
       "⎢                         ⎥\n",
       "⎢               15   3⋅√33⎥\n",
       "⎢0      0       ── + ─────⎥\n",
       "⎣               2      2  ⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Vérification de A = P D P^(-1)\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1 & 2 & 3\\\\4 & 5 & 6\\\\7 & 8 & 9\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡1  2  3⎤\n",
       "⎢       ⎥\n",
       "⎢4  5  6⎥\n",
       "⎢       ⎥\n",
       "⎣7  8  9⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "N est-elle diagonalisable ? False\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[ \\left( 1, \\  2, \\  \\left[ \\left[\\begin{matrix}1\\\\0\\end{matrix}\\right]\\right]\\right)\\right]$"
      ],
      "text/plain": [
       "⎡⎛      ⎡⎡1⎤⎤⎞⎤\n",
       "⎢⎜1, 2, ⎢⎢ ⎥⎥⎟⎥\n",
       "⎣⎝      ⎣⎣0⎦⎦⎠⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "A = sy.Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n",
    "display(A)\n",
    "P, D = A.diagonalize()\n",
    "display(P, D)\n",
    "print('Vérification de A = P D P^(-1)')\n",
    "display(sy.simplify(P*D*P.inv()))\n",
    "\n",
    "N = sy.Matrix([[1, 1], [0, 1]])\n",
    "print('N est-elle diagonalisable ?', N.is_diagonalizable())\n",
    "display(N.eigenvects())   # une seule valeur propre double mais un seul vecteur propre"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### À vous de jouer\n",
    "- **Exercice 3** Soient\n",
    "$$B = \\begin{pmatrix} 2 & 1 & 0 \\\\ 1 & 2 & 1 \\\\ 0 & 1 & 2 \\end{pmatrix} \\qquad\\text{et}\\qquad C = \\begin{pmatrix} 2 & 1 & 0 \\\\ 0 & 2 & 1 \\\\ 0 & 0 & 2 \\end{pmatrix}.$$\n",
    "  1. Donner les valeurs propres de $B$ et les vecteurs propres associés.\n",
    "  2. Diagonaliser $B$, donner $P$ et $D$ et vérifier que $B = PDP^{-1}$.\n",
    "  3. La matrice $C$ est-elle diagonalisable ? Justifier à l'aide de ses valeurs propres et de la dimension de ses sous-espaces propres.\n",
    "- **Exercice 4** La suite de Fibonacci est définie par $F_0 = 0$, $F_1 = 1$ et $F_{n+1} = F_n + F_{n-1}$. On pose $X_n = \\begin{pmatrix} F_{n+1} \\\\ F_n \\end{pmatrix}$.\n",
    "  1. Trouver la matrice $A$ de taille $2 \\times 2$ telle que $X_n = A X_{n-1}$. En déduire que $X_n = A^n X_0$.\n",
    "  2. Diagonaliser $A = PDP^{-1}$. Pour un entier $n$ symbolique, calculer $A^n = P D^n P^{-1}$, où $D^n$ est la matrice diagonale des puissances $n$-ièmes des valeurs propres.\n",
    "  3. En déduire une formule explicite pour $F_n$. Vérifier qu'elle donne $F_{10} = 55$.\n",
    "  4. Calculer une valeur approchée de $F_{31}/F_{30}$ et la comparer au nombre d'or $\\frac{1+\\sqrt5}{2}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Exercice 3\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Exercice 4\n",
    "n = sy.symbols('n', integer=True, nonnegative=True)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Boucles et suites de matrices\n",
    "\n",
    "Pour répéter un calcul tant qu'une condition est vraie, on utilise une boucle `while`. Pour répéter un calcul un nombre de fois connu à l'avance, on utilise une boucle `for`.\n",
    "\n",
    "Exemple : le plus petit entier $k$ tel que $2^k > 1000$, puis les dix premières puissances de $3$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Plus petit k tel que 2^k > 1000 : 10\n",
      "0 1\n",
      "1 3\n",
      "2 9\n",
      "3 27\n",
      "4 81\n",
      "5 243\n",
      "6 729\n",
      "7 2187\n",
      "8 6561\n",
      "9 19683\n"
     ]
    }
   ],
   "source": [
    "k = 0\n",
    "while 2**k <= 1000:\n",
    "    k = k + 1\n",
    "print('Plus petit k tel que 2^k > 1000 :', k)\n",
    "\n",
    "for j in range(10):\n",
    "    print(j, 3**j)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### À vous de jouer\n",
    "- **Exercice 5** Soit\n",
    "$$S = \\begin{pmatrix} 1 & 0 & 0 \\\\ 0 & \\frac{\\sqrt3}{2} & \\frac12 \\\\ 0 & -\\frac12 & \\frac{\\sqrt3}{2} \\end{pmatrix}.$$\n",
    "  1. Trouver avec une boucle `while` le plus petit entier $p > 0$ tel que $S^p = I$. Pouvait-on deviner le résultat ?\n",
    "  2. Vérifier que $S^{-1} = S^T$. Comment appelle-t-on une telle matrice ? Que peut-on dire de la norme de $Sx$ pour un vecteur $x$ ?\n",
    "- **Exercice 6** Soit\n",
    "$$A = \\begin{pmatrix} 0 & 2 & 2 \\\\ -2 & 0 & -1 \\\\ -2 & 1 & 0 \\end{pmatrix}.$$\n",
    "On considère la suite $(x_n)$ de $\\mathbb R^3$ définie par $x_0 = \\begin{pmatrix} 1 \\\\ 0 \\\\ 0 \\end{pmatrix}$ et\n",
    "$$(I - A)\\, x_{n+1} = (I + A)\\, x_n .$$\n",
    "  1. Vérifier que $A^T = -A$ et que $I - A$ est inversible.\n",
    "  2. Calculer les 50 premiers termes de la suite en résolvant à chaque étape un système linéaire avec `LUsolve`, sans calculer d'inverse, ainsi que la norme euclidienne de chaque terme. Qu'observe-t-on ?\n",
    "  3. Démontrer cette observation dans une cellule Markdown. *Indication* : on a $x_{n+1} = Cx_n$ avec $C = (I-A)^{-1}(I+A)$. Montrer que $C^TC = I$ en utilisant $A^T = -A$ et le fait que $I+A$ et $I-A$ commutent.\n",
    "  4. La suite est-elle convergente ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Exercice 5\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Exercice 6\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Démonstration de l'exercice 6*\n"
   ]
  }
 ],
 "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.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
