{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TP 2 : Intégrales multiples et systèmes linéaires avec SymPy\n",
    "\n",
    "Dans ce deuxième TP, on utilise les outils découverts au TP 1 pour :\n",
    "- calculer des intégrales triples, en particulier à l'aide d'un changement de variables (jacobien) ;\n",
    "- résoudre des systèmes linéaires par la méthode du pivot de Gauss (factorisation $PA = LU$) ;\n",
    "- étudier des matrices dépendant de paramètres (inversibilité, noyau) ;\n",
    "- calculer un polynôme caractéristique et des valeurs propres."
   ]
  },
  {
   "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. Intégrales triples et changement de variables\n",
    "\n",
    "Comme pour les intégrales doubles du TP 1, on calcule une intégrale triple en donnant les trois variables avec leurs bornes. **La variable du premier couple est intégrée en premier** : ses bornes peuvent donc dépendre des variables suivantes.\n",
    "\n",
    "Exemple : on intègre la fonction $1$ sur le domaine $\\{(x,y,z) \\mid 0 \\le x \\le 1,\\ 0 \\le y \\le x,\\ 0 \\le z \\le xy\\}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAB8AAAASCAYAAACjMAXnAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAAjBJREFUeJzF1U2ojmkYB/Dfi4ZibIyoSYoVCx9DkyKD6GAMXpmdsho2xCAfNXV1WSgWJ2cjy7NgJ4fM+I4iZGqUjQUa+R4TahJJcSye580z74l4X+Wqp7v7/9zP9b///+t+rrvW29vrS8WA6iQzl+MHTMJEfI39EbHiQ0kycwQeYE9ErC2xH7EO4zEMD/EXOiPiEvRryvMb1pTk9z9BxJIy18GSeCd+x3c4ji5cKdddyMwVfZTjV9zDTYUDZz+SvI4nOJeZI7EJjzAhIv5tLMrM2TiD7dj3P+URcTYibkTERx+EzByKOTgSEa8xWuHC5SpxIz+eYTh9bW8lFuEr9JTzG3iF7zPzm6aNzlSco9P0tb2VqOM5TkJEPM3MLejEtcw8pCjJWCzGKaymTeWZOQjzcSwiXjbwiNiNZQpxv2ArfsZddDfK0a7t8zDEO8sbm9qMA+hWKB6MKfgb+zNzF+3bvkxR3z8qxLOwEz0RsaGy9kpm1nEdGzNzb8vKM7M/fsKZiPiv8mpROfb5TSPiBf5UOD65HdtnKjpXTxM+sByHv+e7Bv6qHfI63uBwE36+HFdl5rfVF5m5ANPxEhdr1YslM5diaTkdiQ7FIWkkfBwRmzKzhtu4ExEzmgj64QTmKhpKD/7BOEVJalgfEV3NyidhZfl0lNiYCra8xKZilLKXVyMi3mCholVfKx3aiGk4io6I6IJaK1dqZu7ANoyJiFufnKCMVmtex9V2iGlR+eeKt2idupqhzXBiAAAAAElFTkSuQmCC",
      "text/latex": [
       "$\\displaystyle \\frac{1}{8}$"
      ],
      "text/plain": [
       "1/8"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x, y, z = sy.symbols('x y z', real=True)\n",
    "V = sy.integrate(1, (z, 0, x*y), (y, 0, x), (x, 0, 1))\n",
    "display(V)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pour un **changement de variables** $(u,v,w) \\mapsto \\big(x(u,v,w), y(u,v,w), z(u,v,w)\\big)$, on a besoin de la valeur absolue du déterminant de la matrice jacobienne :\n",
    "$$\\iiint f(x,y,z)\\,dx\\,dy\\,dz = \\iiint f\\big(x(u,v,w), y(u,v,w), z(u,v,w)\\big)\\,\\big|\\det J(u,v,w)\\big|\\,du\\,dv\\,dw .$$\n",
    "La méthode `.jacobian` calcule directement la matrice jacobienne d'un vecteur d'expressions.\n",
    "\n",
    "Exemple avec les coordonnées cylindriques $x = r\\cos\\theta$, $y = r\\sin\\theta$, $z = z$ : volume d'un cylindre de rayon $R$ et de hauteur $H$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\cos{\\left(\\theta \\right)} & - r \\sin{\\left(\\theta \\right)} & 0\\\\\\sin{\\left(\\theta \\right)} & r \\cos{\\left(\\theta \\right)} & 0\\\\0 & 0 & 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡cos(θ)  -r⋅sin(θ)  0⎤\n",
       "⎢                    ⎥\n",
       "⎢sin(θ)  r⋅cos(θ)   0⎥\n",
       "⎢                    ⎥\n",
       "⎣  0         0      1⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAALCAYAAABCm8wlAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAAINJREFUeJx9zTEKwgAMBdCnFBy8h4MIgqsgeCIP4BByAO/g7O7q5FDBrbfwCA7WpZWitVlCwsvPqK5rQ1V0h8zc4oIDTtiPvw5WTV/gilfxB6yxiYjyX8IuIkr4gMycYoYHju2+m7Bs5nNEvPpAG3/r/uwD9yHwRPUDMnOCOaqIeHbBG1PGHtZXPwiiAAAAAElFTkSuQmCC",
      "text/latex": [
       "$\\displaystyle r$"
      ],
      "text/plain": [
       "r"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAADUAAAAUCAYAAAAtFnXjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAAvNJREFUeJzdl8tLV1EQxz+/alVGZRERQRBFQkKmQhYtUmgViD3AWrS22kQFQauvEwQtInHRgyhqF2hQUET0oAihoodaRg+ifyB6gVGZjxb3XDkez73+zEDsu5nfnTMzd76/mTPn3MLQ0BD/G2ZMdgLjhZkdBrYCK4FfwCPgsKSe1GbaJOU2EWwETgHrgTqgH7hjZqWpQWGqt5+ZlQDfgAZJ1+AftJ+Z3QI2AbWS7mfYnAGagCZJZyO+Pj4C74BWSe1FpDCbpOO+pIp/0X5VwADwJMdmrZNPI75DwBHAgKPAA6AGaDOz/UW8vxXoAh6miglVysyWAaXAC0nfM2xmAuUkm/plxPetJAU+u4HTwD6gJef9J4ANwAZJA6l+hmewGbheJJ9KSZ1AtXt+nGNb5d7TKem3p099n0V8bjq5MCuombUAO0ja/oO/5lfqG8m/swd4BVz21sqARqADuA10B4nlkapxMmy9PFLLnXwdC2hmrS6fWklvwvVhUpI6zGwBCamrkpq9IIdckIuSzkcSazSz2lgCZO+n6pje5XDcPR6LEDoJ7AIagC9mtsgt9UrqHUHKocLJrkBfGerNrODpwwkWw3DygW+9mdUB04GlQD3JANubMf32Onk30BvQDNmkugN9Jckh1+PpVgBzgEeS1sVYmNk84DPwg6SlQ1+Ag4Hbd2C7pJtEIKkQ0/sIR3oF0Au89xKbTdLjbyT98mzT9nmeE3+4wv508nwvSCq4ROcDB4BZwCUzmztW8lkYJuWCLCUZz/41owIoMLolx0NqzP0k6bOkFqAdmEuyb/4KfqUqnIy1HvwdqTVOjmfynXNyZ07cXMRIdQU25U76B+c0koT7GLlXQoyqlOfbz+g/EOAe8BWoMbPFeclnoZhKpbffVWa2xP0uA0qAV5L6YoHdRXMFyR71zxLf92fo5w7oGyQtv6VoJh5CUoN4FXFoAz6R3Mt2OF0xrbfaxe+UNOjp81ovxRUnt+XYZGLKf3rEMBU/EsfEHzJH9WfZ8zyFAAAAAElFTkSuQmCC",
      "text/latex": [
       "$\\displaystyle \\pi H R^{2}$"
      ],
      "text/plain": [
       "     2\n",
       "π⋅H⋅R "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "r, th = sy.symbols('r theta', real=True)\n",
    "R, H = sy.symbols('R H', positive=True)\n",
    "\n",
    "X = sy.Matrix([r*sy.cos(th), r*sy.sin(th), z])\n",
    "Jac = X.jacobian([r, th, z])\n",
    "display(Jac)\n",
    "detJ = sy.simplify(Jac.det())\n",
    "display(detJ)   # r, positif sur le domaine r >= 0\n",
    "\n",
    "Vcyl = sy.integrate(detJ, (r, 0, R), (th, 0, 2*sy.pi), (z, 0, H))\n",
    "display(Vcyl)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### À vous de jouer :\n",
    "- **Exercice 1 :** On note $B$ la boule unité de $\\mathbb R^3$ et $f(x,y,z) = x^2 + y^2 + a z^4$, où $a$ est un paramètre réel. On utilise les coordonnées sphériques\n",
    "$$x = r \\sin\\theta \\cos\\varphi, \\quad y = r \\sin\\theta \\sin\\varphi, \\quad z = r \\cos\\theta, \\qquad r \\in [0,1],\\ \\theta \\in [0,\\pi],\\ \\varphi \\in [0,2\\pi].$$\n",
    "  1. Calculer le jacobien de ce changement de variables et simplifier son déterminant. Quel est son signe sur le domaine ?\n",
    "  2. En déduire $\\displaystyle\\iiint_B f(x,y,z)\\,dx\\,dy\\,dz$ en fonction de $a$.\n",
    "  3. Vérifier votre jacobien en retrouvant le volume de la boule.\n",
    "- **Exercice 2 :** Calculer l'intégrale de la même fonction $f$ sur le tétraèdre de sommets $(0,0,0)$, $(1,0,0)$, $(0,1,0)$ et $(0,0,1)$.\n",
    "\n",
    "  *Indication :* commencer par décrire le tétraèdre par des inégalités, sous la forme $0 \\le x \\le 1$, $0 \\le y \\le \\dots$, $0 \\le z \\le \\dots$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Exercice 1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Exercice 2\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Résolution de systèmes linéaires\n",
    "\n",
    "On cherche à résoudre $Ax = b$, où $A$ est une matrice carrée inversible de taille $n$, $b$ un vecteur colonne de taille $n$ et $x$ le vecteur des inconnues.\n",
    "\n",
    "Pour éviter des calculs inutiles, **on ne calcule pas la matrice inverse** pour résoudre un système. On utilise la méthode du pivot de Gauss, qui correspond à la factorisation\n",
    "$$PA = LU,$$\n",
    "où $P$ est une matrice de permutation (les échanges de lignes effectués pendant le pivot), $L$ est triangulaire inférieure avec des $1$ sur la diagonale et $U$ est triangulaire supérieure (la matrice obtenue à la fin du pivot de Gauss).\n",
    "\n",
    "Une fois la factorisation connue, on résout $Ax = b$ en deux étapes :\n",
    "1. on résout $Ly = Pb$ ;\n",
    "2. on résout $Ux = y$.\n",
    "\n",
    "Le vecteur $x$ obtenu est la solution de $Ax = b$.\n",
    "\n",
    "**Remarque.** Le pivot de Gauss *sans* échange de lignes revient à prendre $P = I$. Cette factorisation $A = LU$ existe (et est unique) si et seulement si toutes les sous-matrices principales $A_k$ (les $k$ premières lignes et colonnes) sont inversibles. Les échanges de lignes permettent de traiter toute matrice inversible."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- **Exercice 3 :** Expliquer, dans une cellule Markdown, pourquoi les étapes 1 et 2 sont simples à réaliser."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Réponse à l'exercice 3 :*\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La méthode `LUdecomposition` renvoie $L$, $U$ et la liste des échanges de lignes effectués, à partir de laquelle on construit $P$ :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1 & 2 & 0\\\\3 & 2 & 2\\\\2 & 0 & 0\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡1  2  0⎤\n",
       "⎢       ⎥\n",
       "⎢3  2  2⎥\n",
       "⎢       ⎥\n",
       "⎣2  0  0⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "P, L, U :\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1 & 0 & 0\\\\0 & 1 & 0\\\\0 & 0 & 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡1  0  0⎤\n",
       "⎢       ⎥\n",
       "⎢0  1  0⎥\n",
       "⎢       ⎥\n",
       "⎣0  0  1⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1 & 0 & 0\\\\3 & 1 & 0\\\\2 & 1 & 1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡1  0  0⎤\n",
       "⎢       ⎥\n",
       "⎢3  1  0⎥\n",
       "⎢       ⎥\n",
       "⎣2  1  1⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1 & 2 & 0\\\\0 & -4 & 2\\\\0 & 0 & -2\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡1  2   0 ⎤\n",
       "⎢         ⎥\n",
       "⎢0  -4  2 ⎥\n",
       "⎢         ⎥\n",
       "⎣0  0   -2⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Vérification PA = LU : True\n"
     ]
    }
   ],
   "source": [
    "A = sy.Matrix([[1, 2, 0], [3, 2, 2], [2, 0, 0]])\n",
    "display(A)\n",
    "\n",
    "L, U, perm = A.LUdecomposition()\n",
    "P = sy.eye(A.rows).permuteFwd(perm)\n",
    "print('P, L, U :')\n",
    "display(P, L, U)\n",
    "print('Vérification PA = LU :', P*A == L*U)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "En pratique, la méthode `LUsolve` effectue directement ces étapes pour résoudre $Ax = b$.\n",
    "\n",
    "Il existe d'autres factorisations utiles pour résoudre des systèmes ($LDL^T$ pour les matrices symétriques, $QR$, etc.), qui ne sont pas au programme de ce TP."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2}\\\\\\frac{1}{4}\\\\- \\frac{1}{2}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡1/2 ⎤\n",
       "⎢    ⎥\n",
       "⎢1/4 ⎥\n",
       "⎢    ⎥\n",
       "⎣-1/2⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Vérification A * sol :\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1\\\\1\\\\1\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡1⎤\n",
       "⎢ ⎥\n",
       "⎢1⎥\n",
       "⎢ ⎥\n",
       "⎣1⎦"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "b = sy.ones(3, 1)\n",
    "sol = A.LUsolve(b)\n",
    "display(sol)\n",
    "print('Vérification A * sol :')\n",
    "display(A*sol)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### À vous de jouer :\n",
    "- **Exercice 4 :** On considère le système\n",
    "$$\\begin{pmatrix} 11 & 2 & 3 \\\\ 4 & 15 & 6 \\\\ 7 & 8 & 19 \\end{pmatrix} \\begin{pmatrix} x \\\\ y \\\\ z \\end{pmatrix} = \\begin{pmatrix} 1 \\\\ 2 \\\\ 3 \\end{pmatrix}.$$\n",
    "  1. Le résoudre par pivot de Gauss (`LUsolve`).\n",
    "  2. Vérifier la solution en calculant le produit de la matrice du système par la solution trouvée.\n",
    "  3. Donner $P$, $L$ et $U$ et vérifier que $PA = LU$.\n",
    "- **Exercice 5 :** Soit\n",
    "$$A = \\begin{pmatrix} 1 & 2 & 0 \\\\ 3 & 2+b & 2 \\\\ 2 & 0 & a \\end{pmatrix}, \\qquad d = \\begin{pmatrix} 1 \\\\ 2 \\\\ 3 \\end{pmatrix},$$\n",
    "où $a$ et $b$ sont des paramètres réels.\n",
    "  1. Calculer $\\det A$ et donner la relation entre $a$ et $b$ pour laquelle $A$ n'est pas inversible. *(Indication : résoudre $\\det A = 0$ par rapport à $b$.)*\n",
    "  2. Lorsque $A$ est inversible, résoudre $Ax = d$ avec `LUsolve` en fonction de $a$ et $b$, puis vérifier la solution (penser à `simplify`). Que devient cette solution quand $\\det A \\to 0$ ?\n",
    "  3. On prend $a = 2$ et la valeur de $b$ qui rend $A$ non inversible. Que se passe-t-il si on appelle `LUsolve` ?\n",
    "  4. Le système $Ax = d$ a-t-il alors des solutions ? Pour le savoir, comparer le rang de $A$ et celui de la matrice augmentée $[A \\mid d]$, obtenue avec `A.row_join(d)`. Interpréter à l'aide de l'image de $A$ (`columnspace`)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Exercice 4\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Exercice 5\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Polynôme caractéristique et valeurs propres\n",
    "\n",
    "La méthode `charpoly` calcule le polynôme caractéristique $\\chi_A(\\lambda) = \\det(\\lambda I - A)$ d'une matrice carrée. Ses racines sont les valeurs propres de $A$ : on peut les comparer avec celles données par `eigenvals`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAN0AAAAUCAYAAAAJIzhmAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAASdAAAEnQB3mYfeAAABhhJREFUeJztm3uIVFUcxz+rQpaallBC0cNIizIltCyNfIBoQmlpVPhYiiw01FAQK/nx7SkRPgqtLFOz/gyM8pGmFlFJIGxopVvWlqYRPsle5qM/zpl1drwz956ZO7vjMh8Yzs69v3Pu+X3nPH/3bM2pU6eoUqVK89Gu1AIkTQEeAa7wl74BnjWz1aWW3RqQNBu4G+gJ/AtsAWab2fYWrViVFqNNCmXsAWYBNwJ9gU3AKkk3pFB2a2AQsBi4FRgCHAc+lnRhS1aqSstRk7u8lPQwsAQ4AKwEZpjZyZBCJR3Ejeavp1XRSqIUjSR1BI4Ao8zsg/LV8uwjjbZ3NhC1vGwAXgImAdOBdcBHSQqT1BYYC3QEvkilhgmR1BUYDYwEegGXAMeAbcAyYFn2Dxhqn0MDRWoEdMKtMA4ldi4lJI0Bbgf6AL19Xd41s3F57IM1klTr7xXipJm1jbjeQPG6pkYpPki6FHgaGA50BfYBqwCZ2SGI6HRmtgHY4Ger54H+xDguqRfwJdAeOAqMNrNtMZVOm7HAqzgnNwO/ABfj9lNvAiMkjTWzU0XaN1KMRlksBOpwejU3T+E621HctuCaGPtiNKoDlKe823BL7LVRN0vUNU3qKMIHSVfhJpuLgPeBHcBNwDRguKQBZnagUCBli097J6jkTtzo2RkYA6yQNKiZgwX1wJ3A6pwZ7QngK+AeXGN5r0j7KEI0QtI8YCAw0MxOJMkTUUYtbhQebGafBGZ/HNfZfsDNeJtj7IM1MrM6XKONqntmoFkS89wgXdOmBB8W4zrcVDN7JSvPPJz2zwGPFup0P/k0NiBiZsdwPyTAVkn9/EMeisubFma2Kc/13yS9hnN4EL6BhNrnIbFGkuYD9+E6y49x9uXAzBo7mZRvIG9in4ZGmef1ws1cvwJxke3EujYnhXzws9ww3BJ5UU5Wwy2Zx0uaUSh6Ocen3f3mP4Q2wDmBecrJfz49nrJ9Io0kLQTuB4aY2Y6Edah0QjWd5NOlCWb5UtpeOSnkw2Cfrs/d55rZH8DnwHlA/8iZTtIw4EH/tQa3iY7cg0iai+v1u3Eb8wdwo9/IAGfKhqR2wAT/dV1a9kk1krQIGA+MAg5J6uZvHTWzowlcqDiK0PRcYBxwArcXLGSbuO01Jwl86OnT+jxFfI+bCXucMdNJ6gS8ARwG3vGXC03z3bzdTmAj0A8YYWaRm+UWYC5wPbDGzJJsymPtAzWajBuMNuICEpnPzIT1r0RCNb0X6AKsM7Pd+YyKaHvNSZwPnX16JE/+zPUuUTPdi8BlQC0uPDyOAhtaM6uNrW4EkhqAywOy5A1tF3jGVGAGLoo0PkX7xBqZWU1InXPq00B+jTZH7MtWFPt7BNQpSFNPZlkW9942qO1l1amBMrclkvsQS5NOJ2kw7kjXajNbIelaf6sco80u4J8A+70hhUt6DBee/xYYamYH07BvZo0W4EbXbPoAdwErcJv2bOrKUIdGQjX1ea7DncbZA6wpYFeKruVuS0l8yMxknfPcz1w/3NjpJHXArVWPcLpX1wN/A70k1US9syoWMxuaVlm5SJoOzAe24xrH72nYt4BGCyLqUIvrdMuLeGVQNKGaZhEbQClV13K2JU+SINBOn/bIc/9qn9Zn7+leALoD08xsL4B/wHbgfE4faK5oJM3CNY46XHg+rsOF2LcKjUIJ1TQrX3vcEvQEsLSAacXqGuBD5nXMMElNYiV+rzoA+AvY0sZfHAhMAT40s7dzCvvap5Wyoc2LpDm4Tf5W3Gi8Py371qJRKKGa5jAWuABYmy+AchboGusDgJntAtbjBogpObcFdABWmtmf7Xwo9C2aTu3Z1Pm0N+5oS0UiaSLuzNsJ4DNgakSgocHMlofatyKNRuFeXYCLOgPcImm5/3u/mc3Msg/SNIKMVpEnUM4SXQv6kMNk3DGwlyUNBb4Dbsa9w6sHngQXSHkGt96cYGb7IgqqhNEmCVf6tC3usGwUnwLLi7BvLRr1ASbmXOvuPwA/0/RVRqimjfhAyEAKBx8qWteEPjRiZrsk9eX0gec7cK+HFpJ14PmMf+2pUqVKeUnjn1irVKkSwP+ByxmjURgCYwAAAABJRU5ErkJggg==",
      "text/latex": [
       "$\\displaystyle \\lambda^{3} - 22 \\lambda^{2} + 127 \\lambda - 70$"
      ],
      "text/plain": [
       " 3       2             \n",
       "λ  - 22⋅λ  + 127⋅λ - 70"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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YRh137OAgABj/vz57jGbN282JBnp6emmZPSKGbtnnnlGbdq00cCBA/Xcc8+ptrbW7EgtVp6jUle/nq6PMrNl9bPoicv76NExPfTDmtUaMWKEe5yfn59GjBih9PR0E9OiMbZt26a4uDh17txZ119/vbKyssyOhBO0a9cu5ebm1vsO2u12JScn8x30EkuXLlV0dLR69OihiRMnqrCw0OxIaEBxcbEkKTIyUpKUkZGhmpqaet+9nj17qkOHDqZ99zz+5Il77rlHgwYNUmRkpJYvX64ZM2YoJydHzz//vNnRWpzNOQ7d8tZq5ToqFRESoNeuG6QzurZVdna2nE7nr65OERMToy1btpiUFo2RnJysOXPmqEePHsrJydFjjz2ms88+Wxs2bFBYGItJe4vc3FxJavA7eOQxeK5Ro0bpiiuuUGJionbs2KHf/e53Gj16tNLT02W1sv6np3C5XJo6darOPPNM9e3bV1Lddy8wMFARERH1xpr53TOl2E2fPl1/+MMfjjlm8+bN6tmzp9LS0tz39evXT4GBgbrzzjv19NNPe+SKz77q++0FuvOdDJVW1apbdCv9bfwQdWwTanYsnKLRo0e7/7lfv35KTk5Wx44dNW/ePE2YMMHEZEDLcc0117j/OSkpSf369VOXLl20dOlSXXjhhSYmw89NmjRJGzZs8PjjkE0pdvfee69uvvnmY47p3Llzg/cnJyertrZWu3fvVo8ePZogHX7pwx/36f7561TrMpScGKk3bhoie3CA+/G2bdvKarUqLy9Pffr0cd+fl5en2NhYMyLjJEVERKh79+7avn272VFwAo58z/Ly8tSuXTv3/Xl5eRowYIBJqXCyOnfurLZt22r79u0UOw8xefJkLViwQMuWLVN8fLz7/tjYWFVXV6uoqKjerJ2Z//0z5Ri7qKgo9ezZ85i3wMCG10DLzMyUn5+foqOjmzl1y2MYhl79erumzV2rWpehS/vH6R8ThtUrdZIUGBiowYMHa/Hixe77XC6XFi9erJSUlOaOjVNQWlqqHTt21CsH8HyJiYmKjY2t9x10OBxauXIl30EvtG/fPhUWFvI99ACGYWjy5Mn68MMPtWTJEiUmJtZ7fPDgwQoICKj33du6dauysrJM++559DF26enpWrlypc4//3yFhYUpPT1d06ZN0w033KDWrVubHc+nOV2GZn2yQf9cUXcg/Z3ndNaDo3rK78gKxL+Qlpam8ePHu2fspk2bprKyMt1yyy3Nlhkn7r777tOll16qjh07Kjs7W7NmzZLVatW1115rdjT8Qmlpab2Z1F27dikzM1ORkZHq0KGDpk6dqt///vfq1q2bEhMT9cgjjyguLk5jx441LzQkHfuzi4yM1GOPPaZx48YpNjZWO3bs0AMPPKCuXbsqNTXVxNSQ6na/vvfee/r4448VFhbmPm7ObrcrODhYdrtdEyZMUFpamiIjIxUeHq4pU6YoJSVFw4cPNye0KefiNlJGRoaRnJxs2O12IygoyOjVq5fx1FNPGZWVlWZH82nVtU7jnsPLmXSavsB467udjXreyy+/bMTHxxuSjMGDBxsrVqxo4qQ4VVdffbXRrl07IzAw0Gjfvr1x9dVXG9u3bzc7Fhrw9ddfG5J+dRs/frxhGHVLnjzyyCNGTEyMYbPZjAsvvNDYunWruaFhGMaxP7vy8nJj5MiRRlRUlBEQEGB07NjRuP32243c3FyzY8MwGvzcJBlvvfWWe0xFRYVx9913G61btzZCQkKM3/zmN0ZOTo5pmS2GYRjN3ibhsSprnJr83o/6anOe/P0seuGaAbqkX1yjn+9wOGS321VcXKzw8PAmTAoAAH7Jo3fFonmVVdXqjnfW6PvthQr099PsGwbpgp4xx38iAADwCBQ7SJKKK2p065zVythzSCGBVv1t/BCd0aWt2bEAAMAJoNhBReXVuv5vK7Ux26HwIH/NuXWYBnXg5BQAALwNxa6FKy6v0Q1/ryt1bUID9c6EZPWO49g4AAC8EcWuBSuuqNGNb67Uhv11pe79O4arewyXkQIAwFuZskAxzFdSWaPxb67Sun3Fah0SoHdvT6bUAQDg5Sh2LVBpVa3Gv7lKmXuLFBESoHdvG66esex+BQDA21HsWpiKaqdueWuVfsgqkj04QP/kmDoAAHwGxa4Fqa51aeK7GVq9+5DCgvz1zwnJ6tvebnYsAABwmlDsWgiXy9B989dq6dYDCgrw05xbhiopnlIH3zd9+nTZbDZdd911ZkcBgCZHsWsBDMPQrE826pO12fL3s2j2DYM1uGOk2bGAZjFjxgz96U9/0vvvv1/vQuwA4Isodi3Anxf9pHdW7JHFIj1/9QCd1yPa7EhAs7Hb7ZowYYL8/Py0fv16s+MAQJOi2Pm4N7/bpZeW1M1SPH55X13WP87kREDzq62tVUhIiDZs2GB2FABoUhQ7H/bZuhw9vmCTJCntou66cXhHkxMB5nj44YdVWlpKsQPg8yh2Pipjz0FNm5cpSboppaOmXNDV3ECASTIyMjR79myNGTOGYgfA51HsfNCugjLd9vYaVde6NKJXtGZd2kcWi8XsWECzc7lcuvPOOzV58mTddNNN2rZtm2pqasyOBQBNhmLnYw6WVeuWt1bpUHmN+sXb9dK1A2X1o9ShZXr55ZdVUFCgxx9/XElJSaqpqdGWLVvMjgUATYZi50Mqa5y6/R9rtLuwXO0jgvW38UMUEuhvdizAFPv379cjjzyiV199VaGhoerWrZtsNhu7YwH4NIqdj3C5DN07f60y9tRdVWLOLUMVHRZkdizANPfcc49Gjx6tMWPGSJL8/f3Vq1cvih0An8Z0jo94ack2fbYuRwFWi16/cbC6xYSZHQkwzYIFC7RkyRJt3ry53v1JSUkUOwA+zWIYhmF2CJyahRtydNc/f5AkPTuun64ammBaFofDIbvdruLiYoWHh5uWAwCAlohdsV5uc45D0+aulSTdcmYnU0sdAAAwF8XOixWWVum2t9eoosaps7q21UMX9zI7EgAAMBHFzktV17o08d0ftL+oQh3bhOiV6wbK38rHCQBAS0YT8FKPfbpRq3YdVCubv/520xBFhASaHQkAAJiMYueF5q/Zq3dXZslikV68ZgBnwAIAAEkUO6+zKduhhz+qW65h6oXddWGvGJMTAQAAT0Gx8yLFFTWa+G6GqmpdOq9HlKZc0NXsSAAAwINQ7LyEy2Xo3nlrtefw5cJeuHqA/LgGLAAA+BmKnZd4fdlOfbU5T4FWP/3lhkGcLAEAAH6FYucF0ncU6rkvtkiSHr2sj/rFR5gbCAAAeCSKnYfLL6nUlPd/lMuQxg2K17XDuLIEAABoGMXOgx05rq6gtEo9YsL0+7F9ZbFwXB0AAGgYxc6DvfHtTn27rUBBAX565bqBCg60mh0JAAB4MIqdh/ox65D++MVWSdKsS/uwCDEAADguip0HclTW6J4PflSty9CYpHa6ZijH1QEAgOOj2HkYwzD00IcbtPdghdpHBOupK5I4rg4AADQKxc7DzF+zT5+uzZbVz6KXrh0oe3CA2ZEAAICXoNh5kN0FZZr1yUZJUtpF3TW4Y2uTEwEAAG9CsfMQtU6Xps3LVEWNU8M7R2riuV3MjgQAALwMxc5DzP5mh37MKlKYzV9/uorrwAIAgBNHsfMAG/YX64WvtkmSHru8j9pHBJ/wa3Tq1EkWi6Xe7Zlnnqk3Zt26dTr77LMVFBSkhIQEPfvss796nfnz56tnz54KCgpSUlKSPv/885PbKAAA0OwodiarrHFq2txM1boMje4bq98MbH/Sr/X4448rJyfHfZsyZYr7MYfDoZEjR6pjx47KyMjQc889p0cffVRvvPGGe8zy5ct17bXXasKECfrxxx81duxYjR07Vhs2bDilbQQAAM3DYhiGYXaIluyJBZv09+92qW0rm76cdo4iQwNP6nU6deqkqVOnaurUqQ0+/pe//EUPPfSQcnNzFRhY9x7Tp0/XRx99pC1btkiSrr76apWVlWnBggXu5w0fPlwDBgzQ7NmzG5XD4XDIbreruLhY4eHhJ7UtAADg5DBjZ6LlOwr09+92SZKe/W3SSZe6I5555hm1adNGAwcO1HPPPafa2lr3Y+np6TrnnHPcpU6SUlNTtXXrVh06dMg9ZsSIEfVeMzU1Venp6Ud9z6qqKjkcjno3AABgDn+zA7RUJZU1un/+OknStcM66IKeMaf0evfcc48GDRqkyMhILV++XDNmzFBOTo6ef/55SVJubq4SExPrPScmJsb9WOvWrZWbm+u+7+djcnNzj/q+Tz/9tB577LFTyg4AAE4PZuxM8sx/t2h/UYU6RIbo4TG9Ghwzffr0X50Q8cvbkd2oaWlpOu+889SvXz/ddddd+tOf/qSXX35ZVVVVTbodM2bMUHFxsfu2d+/eJn0/AABwdMzYmWD5jgK9uzJLkvTMuCSF2hr+GO69917dfPPNx3ytzp07N3h/cnKyamtrtXv3bvXo0UOxsbHKy8urN+bI77Gxse6fDY058nhDbDabbDbbMTMCAIDmQbFrZuXVtZr+7/WSpOuTO+iMLm2POjYqKkpRUVEn9T6ZmZny8/NTdHS0JCklJUUPPfSQampqFBBQd5myRYsWqUePHmrdurV7zOLFi+udgLFo0SKlpKScVAYAANC82BXbzP705U/KOliuOHuQpo/ueVpeMz09XS+88ILWrl2rnTt36t1339W0adN0ww03uEvbddddp8DAQE2YMEEbN27U3Llz9eKLLyotLc39Ov/3f/+nhQsX6k9/+pO2bNmiRx99VGvWrNHkyZNPS04AANC0WO6kGWXsOaTfzl4uw5Dm3DJU5/WIPi2v+8MPP+juu+/Wli1bVFVVpcTERN14441KS0urt5t03bp1mjRpklavXq22bdtqypQpevDBB+u91vz58/Xwww9r9+7d6tatm5599lldfPHFjc7CcicAAJiHYtdMKmucGvPSt9pxoEy/HRyvP17Z3+xITYJiBwCAedgV20xeWrxNOw6UKSrMpkfG9DY7DgAA8EEUu2awKduh15ftlCQ9Obav7CEBJicCAAC+iGLXxJwuQ7/7cL2cLkMXJ8VqZJ+jLx0CAABwKih2Tey9VVnK3FukVjZ/zbq0j9lxAACAD6PYNaF8R6We/W/dlSHuT+2hmPAgkxMBAABfRrFrQo8v2KSSqlr1j7frhuEdzY4DAAB8HMWuiSzdmq8F63Jk9bPoqSuSZPWzmB0JAAD4OIpdE6ioduqRjzdIkm45o5P6xNlNTgQAAFoCil0TeGnJNu09WKE4e5CmXdTd7DgAAKCFoNidZtvzS/TXw2vWPXZ5X4Xa/E1OBAAAWgqK3WlkGIYe/WSTal2GRvSK1kW9Y8yOBAAAWhCK3Wn0xcZcfbe9QIH+fpp5CWvWAQCA5kWxO00qqp16YsFmSdJd53ZRhzYhJicCAAAtDcXuNPnL0u3aX1Sh9hHBmnhuF7PjAACAFohidxrsKSzT7MMnTDxySS8FB1pNTgQAAFoiit1p8MSCTaqudensbm2V2ifW7DgAAKCFotidoq+35Ourzfny97No1qV9ZLFwhQkAAGAOit0pqK516bFPN0qSJpyVqK7RrUxOBAAAWjKK3Sn4R/pu7S4sV1SYTVMu7GZ2HAAA0MJR7E7SwbJqvbh4myTp/pE91IorTAAAAJNR7E7Si1/9pJLKWvVuF65xg+PNjgMAAECxOxnb80v0z5VZkqSHL+klqx8nTAAAAPNR7E7CU59vkdNl6KLeMTqjS1uz4wAAAEii2J2wb7cd0JItdcubzBjd0+w4AAAAbhS7E+B0Gfr94evB3pTSSZ2jWN4EAAB4DordCZi7eq+25pXIHhygey7sanYcAACAeih2jVRaVavnF22VJE0d0U0RIYEmJwIAAKiPYtdIf/t2pwpKq5XYNlQ3DO9odhwAAIBfodg1woGSKv112U5J0v2pPRRg5Y8NAAB4HhpKI7yyZJvKqp3qH2/X6L6xZscBAABoEMXuOPYUlundw4sRPzi6pywWFiMGAACeiWJ3HH/88ifVugyd2z2KxYgBAIBHo9gdw/p9xfp0bbYsFunBUSxGDAAAPBvF7hj+sHCLJGnsgPbqHRduchoAAIBjo9gdxbfbDui77QUKtPop7aLuZscBAAA4LopdA1wuQ8/8t2627vrhHZQQGWJyIgAAgOOj2DVg4cZcbcx2KDTQqsnnc+kwAADgHSh2v+B0Gfrzop8kSRPOSlSbVjaTEwEAADQOxe4XPl2brW35pQoP8teEszubHQcAAKDRKHY/U+t06cXF2yRJd5zTWfbgAJMTAQAANB7F7mf+8+N+7SooU+uQAN18ZqLZcQAAAE4Ixe6w6lqXXvyqbrZu4nld1Mrmb3IiAACAE0OxO2zemr3aX1ShqDCbbhzeyew4AAAAJ4xiJ6myxqlXlmyXJE06r4uCA60mJwIAADhxFDtJ763MUq6jUu3sQbpmWAez4wAAAJyUFl/sKqqdem3pDknSlAu6KSiA2ToAAOCdWnyxe2fFbhWUVikhMlhXDok3Ow4AAMBJa9HFrqLaqTeW7ZRUN1sXYG3RfxwAAMDLtegm8/6qLBWUViu+dbB+M7C92XEAAABOSYstdpU1Tr2+rO7YurvP68psHQAA8Hotts3Mz9inPEeV2tmDNG4ws3UAAMD7tchiV13r0uzDZ8LedW4X2fw5ExYAAHi/FlnsPvxxn/sqE1cPTTA7DgAAwGnR4opdrdOlV7+um62785zOrFsHAAB8Rosrdp+szVbWwXJFhgbqumSuMgEAAHxHiyp2TpehV76uuybsbWcnKiTQ3+REjfPkk0/qjDPOUEhIiCIiIhock5WVpTFjxigkJETR0dG6//77VVtbW2/M0qVLNWjQINlsNnXt2lVz5sz51eu8+uqr6tSpk4KCgpScnKxVq1Y1wRYBAICm0KKK3efrc7TzQJnswQG6KaWT2XEarbq6WldeeaUmTpzY4ONOp1NjxoxRdXW1li9frrfffltz5szRzJkz3WN27dqlMWPG6Pzzz1dmZqamTp2q2267TV988YV7zNy5c5WWlqZZs2bphx9+UP/+/ZWamqr8/Pwm30YAAHDqLIZhGGaHaA4ul6HRL36rrXklmjaiu/5vRDezI52wOXPmaOrUqSoqKqp3/3//+19dcsklys7OVkxMjCRp9uzZevDBB3XgwAEFBgbqwQcf1GeffaYNGza4n3fNNdeoqKhICxculCQlJydr6NCheuWVVyRJLpdLCQkJmjJliqZPn96ojA6HQ3a7XcXFxQoPDz8NWw0AABqrxczYLdmSr615JWpl89fNZ3YyO85plZ6erqSkJHepk6TU1FQ5HA5t3LjRPWbEiBH1npeamqr09HRJdbOCGRkZ9cb4+flpxIgR7jENqaqqksPhqHcDAADmaDHFbvY3dWfC3jC8o+zBASanOb1yc3PrlTpJ7t9zc3OPOcbhcKiiokIFBQVyOp0NjjnyGg15+umnZbfb3beEBJaPAQDALC2i2K3ZfVBr9hxSoNVPt3rIbN306dNlsViOeduyZYvZMY9rxowZKi4udt/27t1rdiQAAFos7zgt9BQdma0bN7i9osODTE5T595779XNN998zDGdO3du1GvFxsb+6uzVvLw892NHfh657+djwsPDFRwcLKvVKqvV2uCYI6/REJvNJpvN1qicAACgafl8sfspr0Rfbc6XxSLdfnbjilJziIqKUlRU1Gl5rZSUFD355JPKz89XdHS0JGnRokUKDw9X79693WM+//zzes9btGiRUlJSJEmBgYEaPHiwFi9erLFjx0qqO3li8eLFmjx58mnJCQAAmpbP74p9/ZudkqRRfWLVOaqVyWlOTlZWljIzM5WVlSWn06nMzExlZmaqtLRUkjRy5Ej17t1bN954o9auXasvvvhCDz/8sCZNmuSeTbvrrru0c+dOPfDAA9qyZYtee+01zZs3T9OmTXO/T1pamv7617/q7bff1ubNmzVx4kSVlZXplltuMWW7AQDAifHpGbvsogp9nLlfknTXuV1MTnPyZs6cqbffftv9+8CBAyVJX3/9tc477zxZrVYtWLBAEydOVEpKikJDQzV+/Hg9/vjj7uckJibqs88+07Rp0/Tiiy8qPj5ef/vb35Samuoec/XVV+vAgQOaOXOmcnNzNWDAAC1cuPBXJ1QAAADP5NPr2D2xYJP+/t0upXRuo/fvGG52nBaBdewAADCPz+6KLSqv1vursiRJd53nvbN1AAAAjeWzxe6d9D0qr3aqd7twndOtrdlxAAAAmpxPFrvKGqfmLN8tSbrz3M6yWCzmBgIAAGgGPlns5q/Zq8KyaiVEBmtMUjuz4wAAADQLnyt2Tpehv323S1LdunX+Vp/bRAAAgAb5XOtZvDlPewrLZQ8O0G8Hx5sdBwAAoNn4XLE7Mlt3fXIHhQT69DJ9AAAA9fhUsVu/r1irdh2Uv59FN6V0MjsOAABAs/KpYvf37+ouH3Zp/zjF2oNMTgMAANC8fKbY5RZXasG6HEnShLMSTU4DAADQ/Hym2L2dvlu1LkPJiZHq295udhwAAIBm5xPFrry6Vu+trLt8GLN1AACgpfKJYvfvjH0qrqhRpzYhurBXjNlxAAAATOH1xc7lMvTm97slSbeelSirH5cPAwAALZPXF7slW/K1q6BM4UH+GjeIBYkBAEDL5fXF7m+Hlzi5LrmjQm0sSAwAAFoury52G7OLtWJn3YLE48/oaHYcAAAAU3l1sfvH8j2SpNFJ7dTOHmxyGgAAAHN5bbE7VFatjzL3S5JuZrYOAADAe4vdvDV7VVXrUp+4cA3q0NrsOAAAAKbzymLndBl6Z0XdbtjxKZ1ksbDECQAAgFcWuyVb8rXvUIUiQgJ02YA4s+MAAAB4BK8sdm8v3y1JunpogoICrOaGAQAA8BBeV+y255fou+0F8rNINyRz0gQAAMARXlfs/pFed2zdhb1ilBAZYnIaAAAAz+FVxa6kskb/ztgnSbr5jE7mhgEAAPAwXlXs/p2xT2XVTnWNbqUzurQxOw4AAIBH8Zpi53IZ7t2w41M6ssQJAADAL3hNsftue4F2FpSplc1fvxkUb3YcAAAAj+M1xe4f6bslSb8dHK9WNn9zwwAAAHggryh22UUVWrIlX5J0w3CWOAEAAGiIVxS7D1bvlcuQUjq3UdfoVmbHAQAA8EgeX+xqnC59sCpLknRdcgeT0wAAAHgujy92izfnK7+kSm1CA5XaJ9bsOAAAAB7L44vde4dn664amqBAf4+PCwAAYBqPbkpZheVa9tMBSdK1Q9kNCwAAcCweXeyOzNad0z1KHdpwXVgAAIBj8dhiV13r0vw1eyVJ13PSBAAAwHF5bLH7YmOuCsuqFRNu04U9o82OAwAA4PE8tti9u7LuurBXD+0gf6vHxgQAAPAYHtmYtueXasXOg/KzSNcMTTA7DgAAgFfwyGL3/uGTJi7oGaO4iGCT0wAAAHgHjyt2lTVO/StjnyTp+uGcNAEAANBYHlfsPluXo+KKGrWPCNY53aLMjgMAAOA1/M0O8Et92ofrqiHx6h4TJqufxew4AAAAXsNiGIZhdgj4DofDIbvdruLiYoWHh5sdBwCAFsXjdsUCAADg5FDsAAAAfATFDgAAwEdQ7AAAAHwExQ4AAMBHUOwAAAB8BMUOAADAR1DsAAAAfATFDgAAwEdQ7LzAk08+qTPOOEMhISGKiIhocIzFYvnV7YMPPqg3ZunSpRo0aJBsNpu6du2qOXPm/Op1Xn31VXXq1ElBQUFKTk7WqlWrmmCLAABAU6DYeYHq6mpdeeWVmjhx4jHHvfXWW8rJyXHfxo4d635s165dGjNmjM4//3xlZmZq6tSpuu222/TFF1+4x8ydO1dpaWmaNWuWfvjhB/Xv31+pqanKz89vqk0DAACnEdeK9SJz5szR1KlTVVRU9KvHLBaLPvzww3pl7ucefPBBffbZZ9qwYYP7vmuuuUZFRUVauHChJCk5OVlDhw7VK6+8IklyuVxKSEjQlClTNH369EZl5FqxAACYhxk7HzJp0iS1bdtWw4YN05tvvqmfd/b09HSNGDGi3vjU1FSlp6dLqpsVzMjIqDfGz89PI0aMcI8BAACezd/sADg9Hn/8cV1wwQUKCQnRl19+qbvvvlulpaW65557JEm5ubmKiYmp95yYmBg5HA5VVFTo0KFDcjqdDY7ZsmXLUd+3qqpKVVVV7t8dDsdp3CoAAHAimLEzyfTp0xs84eHnt2MVql965JFHdOaZZ2rgwIF68MEH9cADD+i5555rwi2o8/TTT8tut7tvCQkJTf6eAACgYczYmeTee+/VzTfffMwxnTt3PunXT05O1hNPPKGqqirZbDbFxsYqLy+v3pi8vDyFh4crODhYVqtVVqu1wTGxsbFHfZ8ZM2YoLS3N/bvD4aDcAQBgEoqdSaKiohQVFdVkr5+ZmanWrVvLZrNJklJSUvT555/XG7No0SKlpKRIkgIDAzV48GAtXrzYfQKGy+XS4sWLNXny5KO+j81mc78HAAAwF8XOC2RlZengwYPKysqS0+lUZmamJKlr165q1aqVPv30U+Xl5Wn48OEKCgrSokWL9NRTT+m+++5zv8Zdd92lV155RQ888IBuvfVWLVmyRPPmzdNnn33mHpOWlqbx48dryJAhGjZsmF544QWVlZXplltuae5NBgAAJ4HlTrzAzTffrLfffvtX93/99dc677zztHDhQs2YMUPbt2+XYRjq2rWrJk6cqNtvv11+fv87jHLp0qWaNm2aNm3apPj4eD3yyCO/2h38yiuv6LnnnlNubq4GDBigl156ScnJyY3OynInAACYh2KH08owDJWUlCgsLEwWi8XsOAAAtCgUOwAAAB/BcicAAAA+gmIHAADgIyh2AAAAPoJiBwAA4CModgAAAD6CYgcAAOAjKHYAAAA+gmIHAADgIyh2AAAAPoJiBwAA4CModgAAAD7i/wFXBh8hFy7QSAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Valeurs approchées des racines :\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/latex": [
       "$\\displaystyle \\left[ 10.0, \\  0.614835, \\  11.3852\\right]$"
      ],
      "text/plain": [
       "[10.0, 0.614835, 11.3852]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Valeurs propres données par eigenvals :\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/latex": [
       "$\\displaystyle \\left\\{ 0.614835 : 1, \\  10.0 : 1, \\  11.3852 : 1\\right\\}$"
      ],
      "text/plain": [
       "{0.614835: 1, 10.0: 1, 11.3852: 1}"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "A = sy.Matrix([[10, 3, 0], [3, 2, 2], [0, 2, 10]])\n",
    "lam = sy.symbols('lambda')\n",
    "chi = A.charpoly(lam).as_expr()   # polynôme caractéristique sous forme d'expression\n",
    "display(chi)\n",
    "sy.plot(chi, (lam, -5, 20));\n",
    "\n",
    "racines = sy.solve(chi, lam)\n",
    "print('Valeurs approchées des racines :')\n",
    "display([rac.evalf(6) for rac in racines])\n",
    "print('Valeurs propres données par eigenvals :')\n",
    "display({vp.evalf(6): m for vp, m in A.eigenvals().items()})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Remarque.** Pour un polynôme de degré 3, les racines exactes s'écrivent souvent avec des racines cubiques et des nombres complexes, même lorsqu'elles sont réelles : on utilise alors `evalf` pour les lire. Une partie imaginaire de l'ordre de `1e-20` dans le résultat est une erreur d'arrondi."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### À vous de jouer :\n",
    "- **Exercice 6 :** Soit $A = \\begin{pmatrix} 1 & 2 & 0 \\\\ 3 & 2 & 2 \\\\ 2 & 0 & 1 \\end{pmatrix}$.\n",
    "  1. Calculer son polynôme caractéristique et le tracer.\n",
    "  2. Calculer les valeurs propres de $A$ comme racines du polynôme caractéristique. Combien sont réelles ? Est-ce cohérent avec le graphe ?\n",
    "  3. Vérifier ces valeurs propres avec `eigenvals`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Exercice 6\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pour aller plus loin (si vous avez le temps)\n",
    "\n",
    "- **Exercice 7 :** Soit $A$ la matrice réelle de taille $10 \\times 10$ avec des $3$ sur la diagonale et des $-1$ sur la première sur-diagonale et la première sous-diagonale (tous les autres coefficients sont nuls).\n",
    "  1. Construire cette matrice avec SymPy. *(Indication : `sy.Matrix(n, n, lambda i, j: ...)` construit une matrice à partir d'une formule pour le coefficient $(i,j)$.)*\n",
    "  2. Calculer son inverse. Qu'observe-t-on sur le signe des coefficients de $A^{-1}$ ?\n",
    "\n",
    "  Nous démontrerons cette propriété et utiliserons cette matrice dans un prochain TP."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Exercice 7\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
}
