{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "34fb6a3c",
   "metadata": {},
   "source": [
    "#  Matrices y aplicaciones lineales\n",
    "\n",
    "#### https://meet.noysi.com/metodosnumericos1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "340e1c04",
   "metadata": {},
   "source": [
    "Para definir un vector o una matriz con Sage, debemos usar las funciones `vector` y `matrix`, respectivamente. La primera entrada (opcional) es un valor con el tipo de dato que queremos usar, como `ZZ` para enteros, `RDF` para reales en doble precisión y `CDF` para complejos en doble precisión. La segunda entrada (o primera si no hemos elegido tipo de datos) es una lista en el caso del vector y una lista con una lista por cada fila de la matrix. Veamos algunos ejemplos."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c269cee4",
   "metadata": {},
   "outputs": [],
   "source": [
    "v = vector(ZZ,[1,2,3])\n",
    "type(v) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "46aff7fb",
   "metadata": {},
   "outputs": [],
   "source": [
    "w = vector(RDF,[1,2,3])\n",
    "show(v,w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "821a514a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Podemos sumarlos. Para ello convertirá los enteros en números reales.\n",
    "v+w"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b26c6141",
   "metadata": {},
   "outputs": [],
   "source": [
    "type(v+w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "81f84f71",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<class 'sage.modules.vector_integer_dense.Vector_integer_dense'>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Si no ponemos tipo, elige el menos general posible\n",
    "u = vector([1,2,3])\n",
    "type(u)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a73ae277",
   "metadata": {},
   "source": [
    "Veamos algunos ejemplos con matrices."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "72af041a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html>\\(\\displaystyle \\left(\\begin{array}{rrr}\n",
       "1.0 & 2.0 & -3.0 \\\\\n",
       "3.0 & 1.0 & 1.0 \\\\\n",
       "1.0 & 1.0 & 2.0\n",
       "\\end{array}\\right)\\)</html>"
      ],
      "text/latex": [
       "$\\displaystyle \\left(\\begin{array}{rrr}\n",
       "1.0 & 2.0 & -3.0 \\\\\n",
       "3.0 & 1.0 & 1.0 \\\\\n",
       "1.0 & 1.0 & 2.0\n",
       "\\end{array}\\right)$"
      ],
      "text/plain": [
       "[ 1.0  2.0 -3.0]\n",
       "[ 3.0  1.0  1.0]\n",
       "[ 1.0  1.0  2.0]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Una matriz de números reales (con saltos de línea visualizarlo mejor)\n",
    "A = matrix(RDF, [[1,2,-3],\n",
    "                 [3,1,1],\n",
    "                 [1,1,2]])\n",
    "show(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bcf14972",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Otra de enteros (en este caso no hemos incluído saltos de línea)\n",
    "B = matrix([[1,0,-1],[0,1,2],[1,1,1]])\n",
    "show(B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "812afe71",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Podemos operar con matrices y vectores\n",
    "show(A+B,A*B,A*u,7*v,-2*A,B^10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5bd5c668",
   "metadata": {},
   "source": [
    "También están definidas las funciones usuales sobre matrices. Se puede consultar https://doc.sagemath.org/html/es/tutorial/tour_linalg.html para una introducción. Veamos cómo calcular el determinante y los autovalores y autovectores.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "469c1bf4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Determinante\n",
    "A.det()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "6b06bab4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(-1.5556218095982448,\n",
       "  [(-0.6412412320435306, 0.7665298768041036, -0.035236774738629656)],\n",
       "  1),\n",
       " (2.777810904799123 + 1.3878807693998005*I,\n",
       "  [(-0.21853271682511874 - 0.41443027683117184*I, -0.6460200641125963, -0.4929033642230454 + 0.346692006865217*I)],\n",
       "  1),\n",
       " (2.777810904799123 - 1.3878807693998005*I,\n",
       "  [(-0.21853271682511874 + 0.41443027683117184*I, -0.6460200641125963, -0.4929033642230454 - 0.346692006865217*I)],\n",
       "  1)]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Autovalores y autovectores\n",
    "A.eigenvectors_right()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "21da7204",
   "metadata": {},
   "source": [
    "La orden anterior muestra una lista que contiene un elemento por cada autovalor. El elemento (tupla) contiene el autovalor en la primera posición, una base en la segunda posición (lista de vectores) y la multiplicidad de ese autovalor. Vamos a quedarnos con esos valores:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "356ca15e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1.125695510226935?,\n",
       " -0.8128477551134672? - 2.160860167587330?*I,\n",
       " -0.8128477551134672? + 2.160860167587330?*I]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "autovalores = [l for l,v,m in A.eigenvectors_right()]\n",
    "autovalores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e65e8fbb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(1, -1.776679378952849?, -5.679054268132632?),\n",
       " (1, 0.3050063561430910? - 0.810823529627093?*I, 0.4228604673996492? + 0.5392131083331441?*I),\n",
       " (1, 0.3050063561430910? + 0.810823529627093?*I, 0.4228604673996492? - 0.5392131083331441?*I)]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Esto es válido si no hay autovalores duplicados\n",
    "autovectores = [v[0] for l,v,m in A.eigenvectors_right()]\n",
    "autovectores"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7a142e6",
   "metadata": {},
   "source": [
    "Vamos a representar los autovalores como vectores en el plano complejo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ebc92bee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnUAAAHWCAYAAAARl3+JAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlcelbwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAR0ZJREFUeJzt3QmczdX/x/G3fd8jKRIlRr+Ukl3WZM++t6AUWihJKrRRf1JKixaRSij7Utn3KGlRSsqeLGki28yY/+N8j5k7ambMjHvv93vvfT0fj/vgnJnrnr53mnnP+Z7zOZni4+PjBQAAgJCW2e0BAAAA4PwR6gAAAMIAoQ4AACAMEOoAAADCAKEOAAAgDBDqAAAAwgChDgAAIAwQ6gAAAMIAoQ5Ampg65X///bfzJwDAewh1ANLkyJEjKlCggPMnAMB7CHUAAABhgFAHAAAQBgh1AAAAYYBQBwAAEAYIdQBSNW7cOEVFRalKlSpcKQDwsEzx1CcAkAamnInZ/RodHa38+fNzzQDAY5ipAwAACAOEOgAAgDAQsFAXFye1aCGZZThvvint2xeoVwIAAEDWQF2CiROluXPt37/80v5ZsaLUsKHUoIF0440Sy3IAAAA8vlHixx+lqKiUP54li3TDDb6QV62alCNHIEYCwB/YKAEAEbz7tW5dafnytH1u7txS7dq+kFepkpSZFX+AZxDqACCCQ92cOVLLlhl7bpEiUtu20qhRUr58/h4ZgPQi1AGAtwV0LqxpU6lkyYw999Ahafx46ZNP/D0qAACA8BPQUGfWzd15Z8afnzOnVL26P0cEIL04UQIAQkPAT5TYu1cqVcqWOEmPTJmk6dOlNm0CNTIA6cHtVwDwtoBvRShRImPr6saMIdABAACkVVD2l959d/o+v39/6f77AzUaAACA8BOUUGfKlJQpk7bPrVfP7ngFAACAx0KdqTfXu3faPnf1aunjjwM9IiB0bdq0SV27dlWpUqVUsmRJtW/fXj/99NM5nzdp0iRVrFhRBQoUULVq1bQ8rUUkAQAhIWjlfe+4Q8qWLeWP58lj/zx1SurQQXrhBSmwWziA0HTfffepefPmWr16tVauXOn01atXT4dMHaAUzJo1Sz179tSgQYO0ZcsWNWzYUE2aNNHPP/8cxJEDAEJ692tSXbpIH3743/4LL5RWrJCee0565x1f/3332XBnSqMASN5ff/2lQoUKafr06WprKnYno2bNmipdurTef//9xL7y5curQYMGTsmStGD3KwB4W1AP4kpuw4Q5HmzuXKlcOemtt6Rhw3wfGztWat9eOn48mKMEQi/UGXnz5k324zExMVq/fr0zm5eUCXRmtg8AEB6CGurM2a4VKvjaZgZu2jTp+ut9temGDrWzdVmz2r4ZM+xZsAcPBnOkQGgwE+39+/dXmTJldOONNyb7OQcOHFBsbKyKFSt2Vr9p79u3L8V/++TJk87sXNIHAMC7ghrqTGgz5UoSvPaaPUosufV38+aZmQfbXrtWqlFD2rYteGMFQoFZI7dkyRJNmzZNOc0RLKnIbHYs/aud2uqLESNGOJsqEh5mUwYAwLuCGuqMXr3s7NySJakfIXbTTZJZA37RRba9das9Mmz9+qANFfC0xx57TK+//roWLlyoypUrp/h5RYoUUZYsWZwZu6T279+vC82C1hQMHjxY0dHRiY9du3b5dfwAgBAPdWa2rl07W4/uXK65Rlq3ToqKsm3zM6luXWnOnIAPE/C0J554QmPHjnUCXfVzHJCcI0cOJ/T9u4TJ0qVLU32ueV7+/PnPegAAvCvooS69zLmxq1ZJCcuFzKaJW26xt26BSDR8+HC9+OKLTqCrYdYlpDDLdvnllye2zbq7KVOmaM6cOTp27JhGjx7tlDPp27dvEEcOAIjoUGcUKiR9+qnUubNtnz4t9eljfnDZvwORIi4uTsOGDdM///yj+vXrO+voEh4m6CXd8XrixInEdufOnfXcc8+pd+/ezi7Z8ePH65NPPtHVV1/t0n8JACCk69SdLxPgHn3U1rNLWvvO7JbNkcPNkQHBkzSsJZUtWzZn7ZxhdruaAGhuof7b6dOn/7NpIi2oUwcA3hZSoS7Bq69K997rm6Uz6+xM6ZOCBd0eGRC+CHUA4G0hcfv138ytVxPicuWy7WXLpFq1pJ073R4ZAACAO0Iy1BktW5rde1LRora9ebMtebJpk9sjAwAACL6QDXVG1aq2MHHCJr+9e6U6daTPP3d7ZAAAAMEV0qHOKFtWWrNGqlbNto8csadUvPuu2yMDwsO4ceMUFRWlKlWquD0UAEC4bZRIzrFjUteu0syZvr7hw6XHH7cFjwGcHzZKAIC3hfxMXYLcuaXp0+2u2ARDh9qjyGJi3BwZAABA4IVNqDNMia6XXpJGjfL1vf223VRhbssCAACEq7AKdYa51frgg9KUKVL27LZv4UJ7zNjvv7s9OgAAgMAIu1CXoGNHuws2oSDx11/bkic//uj2yAAAAPwvbEOdYcqbmJ2xl15q2zt2SOb88xUr3B4ZAACAf4V1qDMqVLC17CpXtu2//pIaNZI++sjtkQEAAPhP2Ic646KLpOXLpZtvtu1Tp6ROneyGivAo6AIAACJdRIQ6I29eafZsqWdPX9/AgdJ990lxcW6ODAAA4PxFTKgzsmWT3nxTevJJX98rr0jt2tnixQD+ixMlACA0hM2JEuk1caLUq5cUG2vb5pgxM5NXtKjbIwO8iRMlAMDbImqmLqnbbpPmz5fy5bPtdevszthffnF7ZAAAAOkXsaHOMLtgV66USpSwbRPoTC27L75we2QAAADpE9GhzqhUyc7SVaxo2wcPSvXqSbNmuT0yAACAtIv4UGeULCmtWmXDnHH8uNSmjVkgno4rCQAA4CJC3RnmOLEFC6SuXW379GmpXz9p0CD7dwAAAC8j1CWRI4c0aZI0eLCv7/nnbdA7edKFdwcAACCNCHX/viCZpWeflV57zf7dmDJFatxYOnw4rZcVAAAguAh1Kbj7bmnmTCl3bts2x4zVqiXt2BHEdwcAACCNCHWpaNFCWrbMV5D4hx9syZNNm9J6eYHQx4kSABAaIvZEifTYtk1q0kTautV3juz06faWLBApOFECALyNmbo0KFtWWrPGztIZR49KzZpJ77wT4HcHAAAgjQh1aXTBBdLixbZ+nREXJ/XsKQ0bJjHXCQAA3EaoS4dcuaSpU6X77/f1DR9uw11MTADeHQAAgDQi1KVTlizSiy9KL7zg65swQWre3Kw5Su+/BgAA4B+Eugzq39/O2pmCxcZnn0l16kh79/rpnQEAAEgHQt15aN9eWrRIKlTItr/5RqpWTdq8+Xz+VQAAgPQj1J0nU5DY7IwtXdq2d+2Sata09e0AAACChVDnB+XLS2vXStddZ9vR0baG3Ycf+uNfBwAAODdCnZ8UL25n55o2te1Tp6QuXaTnnqPkCUIbJ0oAQGjgRAk/i42V+vSR3nzT13fPPdLLL9uds0Co4kQJAPA2Zur8LGtW6Y03pKef9vW99potWnzsmL9fDQAAwCLUBUCmTNKQIdKkSTbkGbNnS/XqSfv3B+IVAQBApCPUBVD37tKCBVK+fLa9fr09P3br1kC+KgAAiESEugBr2FBatUq6+GLb/vVXG+zMblkgI2JjY/XJJ5+oUaNGKl68uBYuXHjO5zzzzDPO5yZ9VK5cmTcAAMLImZuDCKSrr5bWrZOaNJG+/146dEiqX1/64AOpdWuuPdJnxIgR2rhxo+655x61bdtWJ06cOOdzjhw5onLlymmqOQbljCzs3AGAsEKoC5JLLrEzdmbDxJIlkvk53Lat9NJL0r33BmsUCAdDhgxR5syZdfTo0XQ9L3v27M4MHQAgPHH7NYgKFLBr7Lp1s+34eOm++6SHHpJOnw7mSBDKTKDLiK+++kply5ZVpUqVdPfdd2vfvn1+HxsAwD2EuiDLnt3uin30UV/f6NFS58529g4IhEKFCumpp57SvHnznGLCW7Zs0Q033KBoc/xJCk6ePOnUpkv6AAB4F6HOpZInzzxj69klTLqYpU433ST9+acbI0K4e/jhh9WvXz+VL19etWrV0syZM/XXX3/pnXfeSXXtXoECBRIfJUuWDOqYAQDpQ6hz0V132fp1uXPb9sqVUs2a0vbtbo4K4SiT+U0iiYIFC+rKK6/Ujz/+mOJzBg8e7MzkJTx27doVhJECADKKUOeyZs2k5culYsVse8sWW/Jk40a3R4ZwFhMTox07duiCCy5I8XNy5Mih/Pnzn/UAAHgXoc4Drr/e1q0rV862zfr1OnXspgogI5588smz6tD17t1b27Ztc/5u1sb16dPHKXPS3VTIBgCEBUKdR5QpI61ZY2+/Gv/8I7VoIb31ltsjg9eYYsOmNInZyWrccccdTvuJJ55I/BwT3PYnOZOubt26atmypTPbduGFFzq3XZcuXaoKFSq48t8AAPC/TPHxprAGvOL4cenWW6Xp0319jz8uDR9uN1gAZlfq4cOH/3Mh8uTJo3xnzqQzs3CmKHHRokXP+px//vlHuXLlylBZFBMUzYYJs76OW7EA4D2EOg8yNetM7boxY3x9t90mjR9vS6IAbiDUAYC3cfvVg8wkygsvSC++6JudmzjRbqqgVBgAAEgOoc7D7r9fmjZNypnTthctkmrXlvbscXtkAADAawh1HmfOh128WCpc2La//VaqVk36/nu3RwYAALyEUBcCatSwO2Mvu8y2d++WatWSli51e2SIBOZYsaioKFWpUsXtoQAAUsFGiRDyxx9S8+bSl1/adrZs0oQJUteubo8MkYCNEgDgbczUhZALL5SWLbPBzoiJkbp1M2d0ShSmAQAgshHqQkyePNKMGdLdd/v6Hn1U6tNHio11c2QAAMBNhLoQlDWr9OqrdoYuweuvS61b25MoAABA5CHUhShTv+6RR6TJk+3aOmPuXKlePbv2DgAARBZCXYgzmyQWLpTy57ftDRuk6tWln392e2QAACCYCHVhoH59afVq6ZJLbPu333xlUAAAQGQg1IWJq66S1q2Trr7atg8dkho0kD7+2O2RAQCAYCDUhZGLL5ZWrpQaNrTtEyek9u3tGbIAACC8EerCjFlbN2+edOuttm3q1/Xvbx+nT7s9OoQiTpQAgNDAiRJhyoS5oUOlp57y9bVrJ733npQzp5sjQ6jiRAkA8DZm6sK45MmTT0pvvillyWL7pk+3t2bNejsAABBeCHVhrlcvac4cexKFYXbJ1qxpd8gCAIDwQaiLAE2aSMuX27NjjZ9+kqpVk7780u2RAQAAfyHURYjrrrMlT8qXt+39+6Ubb7SbKgAAQOgj1EWQ0qXt7dfatW372DGpZUtp/Hi3RwYAAM4XoS7CFC4sffaZ1KGDbZsyJ717S0OG2B2zAAAgNBHqIpApafLhh9KDD/r6nn3W1rY7dcrNkQEAgIwi1EWozJmlUaOksWNt+RNj8mSpaVMpOtrt0QEAgPQi1EW4e++158MmFCRevNiuudu92+2RwSs4UQIAQgMnSsCxdq3UooWvMLE5R3b+fOnqq7lAsDhRAgC8jZk6OKpXl9askcqUse09e+yMnZm5AwAA3keoQ6Jy5eyM3Q032Pbff0s332zPiwUAAN5GqMNZihWTliyxt2KN2Fi7K/aZZyh5AgCAlxHq8B/mnNgZM6R77vH1PfaYrWdnQh4AAPAeQh2SlSWL2fUojRzp63vzTalVK+noUS4aAABeQ6hDikz9ukGDpPffl7Jls31mR2zdutK+fVw4AAC8hFCHc+rSxR4tVqCAbX/1ld0tu2ULFw8AAK8g1CFNzOzc6tVSyZK2vX27VKOGtGoVFxAAAC8g1CHNKlaU1q2TKlWy7cOHpYYNpWnTuIjhjBMlACA0cKIE0s3Ur2vXTvr88zNfRJmk0aOl/v25mOGMEyUAwNuYqUO65c8vzZsn3X67bcfHSwMGSA88IMXFcUEBAHADoQ4ZYnbDvvOONHSor++ll6QOHaTjx7moAAAEG6EOGWZuuw4bJr31lq1rZ3zyiV1nd/AgFxYAgGAi1OG89ewpzZ0r5c1r22vW2J2xv/7KxQ2UJUuWqH379ipfvrwWL16c5uc0a9ZMlSpVUqdOnfTjjz/yBgFAGCHUwS9uvllasUIqXty2t261tew2bOAC+9szzzyjp556Sk2bNtVPP/2kI0eOnPM5K1euVOPGjVW1alW9/vrrypEjh2rXrq29e/fyBgFAmGD3K/xqxw6pSRMpYRIod27po4+k5s250P5y8uRJJ5QdPXpU+fLl04wZM3TLLbek+pybbrpJuXLl0qxZs5z26dOnVbp0aXXu3FnPPfdcml6X3a8A4G3M1MGvLr3UFimuU8e2jx2z58W+/joX2l9MoEuPuLg4rVixQjeb6dQzMmfO7LSXLl3KGwMAYYJQB78rVMgeK9axo22fPi3dc480eLD9O4LrwIEDzuzeRRdddFZ/8eLFtXv37hSfZ55jZueSPgAA3kWoQ0CYyaQPPpAGDvT1jRwp3XqrdOoUFz2YzEydkT179n+9RzkUGxub4vNGjBihAgUKJD5KJpwRBwDwJEIdAvfFlVl6/nnplVds+RPj/fftpoq//uLCB0vhwoWVKVMmHfxXnRnTLlKkSIrPGzx4sKKjoxMfu3btCsJoAQAZRahDwPXta+vX5cxp22YZV61aEhkhOMwGiYoVK2qdObg3iTVr1uj6669P8XlmJi9//vxnPQAA3kWoQ1CYzZkmzF1wgW1v3ixVqyZ98w1vQCA8//zzqlu3bmK7d+/e+uCDD/TNmQv+8ccfa8OGDU4/ACA8EOoQNCbErV0rlS1r26ZEWu3a0uef8yakhyk2bIoOX3fddU67X79+TtusgUuwf/9+/fLLL4ntvn376o477nDq1F144YXO31999VXVMlOmAICwQJ06BN2BA1KLFtIXX9h21qz2qLHbbuPNSAtTny65Xatm7VyxYsXOXOMDzm7VsgkJOslzzcdKlCiR7tIo1KkDAG8j1MEVpn5dly7SmVq4jieflB57zLepAt5CqAMAb+P2K1xhTpr4+GO7iSLBE09Id90lxcTwpgAAkF6EOrgmSxbp5Zdt2ZME5jZsy5bmNiFvDAAA6UGog6vMrVZToPjDD01xXNu3cKF0443Svn28OQAApBWhDp7QqZM9WqxgQdveuNHulv3xR7dHhnHjxikqKkpVqlThYgCAh7FRAp7yww9SkybSzp2+c2TNZgpT+gTuYqMEAHgbM3XwlKgoW8vummts+/BhqWFDaepUt0cGAIC3EergOSVKSCtWSI0b2/apU1LHjtKoUVJ8vNujAwDAmwh18KR8+aQ5c6QePXx9ZkPFffdJcXFujgwAAG8i1MGzsmWzJU6GDfP1vfKK1K6dLV4MAAB8CHXwfMmToUOlCRPscWLGzJlSgwb2uDEAAGAR6hASbr9dmjfP3pY11q2TatSQkpxZDwBARCPUIWTcdJPdQHHRRbZtAl316tIXX7g9MgAA3EeoQ0gxpU7MLF3FirZ98KBUr56tZQcAQCQj1CHklColrVol1a1r28ePS23aSOPGuT2y8MSJEgAQGjhRAiHr5Elb8uSDD3x9Dz8sjRghZebXFb/jRAkA8DZ+9CFk5cghvfee9Mgjvr7nn5e6drWBDwCASEKoQ0gzM3JmZu7VV32zc1Om2NMozBFjAABECkIdwsI990gzZki5ctn28uVSrVrSjh1ujwwAgOAg1CFstGwpLVsmFS1q2z/8YEuebNrk9sgAAAg8Qh3Cyg03SGvXSldcYdu//y7Vri19+qnbIwMAILAIdQg7ZctKa9bYWTrj6FGpWTN71BgAAOGKUIewdMEF0uLFUuvWth0XZ8ufDBsmxce7PToAAPyPUIewZTZNTJsm3Xefr2/4cKlnTykmxs2RAQDgf4Q6hLUsWaQXX5RGj/b1mduwLVpIR464ObLQwYkSABAaOFECEWPqVKl7d+nUKd85svPmSSVKuD2y0MCJEgDgbczUIWJ06CAtWiQVKmTbptSJ2UyxebPbIwMA4PwR6hBRTHmT1aulSy+17Z07pZo1bX07AABCGaEOEadCBWndOqlyZduOjrbHipnjxQAACFWEOkSk4sXtUWJNmti2WWfXubP0/POUPAEAhCZCHSJW3rzS7NlSr16+vkGDpH79bF07AABCCaEOES1rVmn8eOmpp3x9r74qtW0rHTvm5sgAAEgfQh0iXqZM0mOPSRMn2pBnzJol1a8vHTgQ8ZcHABAiCHXAGbfeKs2fL+XLZ9tffGFLnmzdyiUCAHgfoQ5IolEjaeVKX0HibdukGjXsbtlIxYkSABAaOFECSMauXVLTptL339t2zpzShx9Kt9wSuZeLEyUAwNuYqQOSUbKknbGrV8+2T5yQ2rSRXnmFywUA8CZCHZCCggWlhQulrl1tOz5euvdeaeBA6fRpLhsAwFsIdUAqsmeX3ntPGjzY1zdqlNSli529AwDAK1hTB6TRG29Iffr4Zunq1JFmzJAKFw7+JVy/fr1eeukl7d69WxUqVNDgwYN1acKBtsl49dVXNWnSpLP6ihUrptmm+nIasaYOALztTFUuAOfSu7d08cVSx462MPGKFVKtWtKCBVIqecrvvvzyS9WpU0d9+vRRt27d9Oabb6p69er65ptvVLRo0WSfs3PnTp0+fVpjx45N7MuRI0fwBg0ACDhm6oB02rBBat5c2r/fd47svHlS5crBuZTNmjVTXFycFpoFf5JiYmKcWbqePXvqqaRHYyTxyCOPOGFw0aJFGX5dZuoAwNtYUwekU5Uq0tq1Urlytr1vn70VeyZjBZSZbVu6dKlatGiR2JctWzY1adLknIFt8+bNatCggVq1aqWRI0fq+PHjgR8wACBoCHVABpQpI61ZYwsTG//8Y2fv3n47sJfzwIEDThgrkVAd+QzT3rFjR4rPM7dau3btqoEDB6p9+/bO+rpq1arp5MmTKT7HfMzMziV9AAC8izV1QAYVKSKZybHu3aWPP5bi4qRevcz6NWnYMDlnyvqbudWa3Hq4XLlyJX4sOY8++uhZz6lfv74uv/xyTZgwQXfffXeyzxkxYoSGDx/ut7EDAAKLmTrgPOTKJX30kfTAA76+J5+UevQwAcz/l7ZQoULKlCmT/vzzz7P6Dx06pCImZabg3yHQzOxFRUU5mytSYnbURkdHJz52mWM2AACeRagDzlOWLNKYMdILL/hm595912xoMJsL/Ht58+TJo3LlymmD2a2RxBdffKFrr702zf9OfHy8/vjjD+ffSy0I5s+f/6wHAMC7CHWAn/TvL02dasKQbX/+ud1AsWePfy+x2eX6/vvva9u2bWde53OtXbvW6U/w8ssvq2XLlontZ599NnFjhNls8eSTT2rv3r3q0KGDfwcHAHANa+oAP2rXzpY4adVKMndIzd3N6tVtLbuKFf3zGgMGDNAPP/ygihUrOqVMTA06E9oaNmyY+Dlm08TGjRsT25kzZ3Y+1xQc3r9/v3LmzKmpU6fqhhtu8M+gAACuo04dEAA//STdfLO0fbttFyhgT5+oV89/r2Fun5rZtjJlyqiAeYEkTNAz6+yS3pKNjY3Vzz//rHz58umSSy5x1ualB3XqAMDbCHVAgJj6dabMyVdf2Xa2bHatnTk3NhQR6gDA21hTBwSIuQ27bJnUtKltm92wXbtKI0eajQpcdgCAfxHqgADKm1eaNUu66y5f3+DBUt++5nYolx4A4D+EOiDAsmaVXn9deuYZX99rr0lt2tiTKAAA8AdCHRAEZk/Co49KkybZkGfMmWM3Tuzf7+23YNy4cU6h4irm0FsAgGexUQIIssWL7SxdQmFic46sKXlSrpy33wo2SgCAtzFTBwRZgwbSqlXSxRfb9q+/SjVqSGvW8FYAADKOUAe44H//k9ats38ahw7ZsGdq2QEAkBGEOsAll1wirVxpw5xx4oTUtq00dixvCQAg/Qh1gIvMQRDz50vdu9u2qV93//3Sgw+aM1p5awAAaUeoA1yWPbs0caI0ZIiv74UXpE6d7OwdAABpQagDPFLy5OmnpTfekLJksX3TpkmNGkl//un26AAAoYBQB3iIOXli9mwpd27bNrtka9aUtm93e2QAAK8j1AEeY86KXb5cKlbMtrdskapVk776yu2RAQC8jFAHeND119uSJ1deadt//CHdeKPdVBFsnCgBAKGBEyUADzP161q1klavtm2z3s6cG3vnncEfCydKAIC3MVMHeFiRItKiRVL79rYdF2fX3T32mC1/AgBAAkId4HE5c0pTpkgDBvj6nnlGuu026dQpN0cGAPASQh0QAjJnlkaPll56yZY/Md57z26qiI52e3QAAC8g1AEh5L77pOnT7eydsXixVLu2tHu32yMDALiNUAeEmDZtbJgz6+2M776zJU/MnwCAyEWoA0JQjRrSmjVSmTK2vWePVKuWDXsAgMhEqANCVLly0tq1UpUqtv3331KTJnatHQAg8hDqgBBmTp1YulRq0cK2Y2KkW2+Vnn2WkicAEGkIdUCIy5NH+uQT6Z57fH1Dhkh33y3Fxp7/v8+JEgAQGjhRAggTphjxc89Jgwf7+po1szXu8uY9/3+fEyUAwNuYqQPChKlf98gj0vvvS9my2b5586S6de3ZsQCA8EaoA8JMly7Sp59KBQrY9ldfSdWrSz/95PbIAACBRKgDwlC9etKqVVLJkrb922+2DMrq1W6PDAAQKIQ6IExddZUteXL11bb9559Sgwb2RAoAQPgh1AFh7OKLpZUrpUaNbPvkSalDB2nMGLdHBgDwN0IdEOby57cbJm67zbdLdsAAqX9/6fRpt0cHAPAXQh0QAcxu2AkTpCee8PW9+KKdtTt+3M2RAQD8hVAHRFDJk+HDpbfekrJksX0ffyw1bCgdOuT26AAA54tQB0SYnj2lOXPsSRTGmjV2Z+yvvyb/+ZwoAQChgRMlgAi1caM9cWLfPt85snPnSlWqJP/5nCgBANKBA9KWLVK1ar5C717BTB0QoSpXtiVPKlSw7f377ekTJtgBAP7LnKdtvnfWqSOVKye9/bYUEyPPINQBEax0aVuQ2HyDMo4dk1q1kt54w+2RAYD3/P67tHu3/fv27VKvXt4Kd4Q6IMIVKmSPFTM7YQ1T5uTuu6VHH7XlTwAAKfNSuCPUAVDOnNKHH0oPPeS7GCNGSN27S6dOcYEAIBTCHaEOgP1mkFn6v/+TXn7Zlj8x3n9fatJEio7mIgGA18MdoQ7AWfr1s/XrzOydsWSJVKuWbx0JAMCb4Y6SJgCSZXbGtmjhK0ycN+/fOnq0gMaOjVauXPm5agAizp9/SoMGZey5RYrYkPfss/bOiGuhznzKkSNHAjMCAJ508uRJbdkSoy5dcmv3bvMd6G9JJSXtMifKuj08AAhJvXtLzz+fsefmy5dPmRLWx2Q01CUUHQUAAIA7oqOjlT9/fvdn6qpUqaINGzac17/B6547fJcsWVK7du1K9U3nWvO1lRarVp1St25ZdfiwvU+QO/dhHTtWWsOHb1WhQsWC+rX19NNP67HHHgvqa0bi67r12sePH9egQQP13HP/p1y5cgX1tXmPw/taH/fz19bhw9LQoRl7buHC0m23SU88kfHbr+eaqTOBLSgqVKgQrJeK2NeNjo42Ad350w2RdK3D/XU/+SQ+PmdO8wuffVx1VXz8+vW7na+vXbt2xQdbOF9rL71uJH7v4j0O72sd7eevrZ07fd8X0/q47LL4+Lffjo8/dSo+4IK2+7Vv377BeqmIfl03Rdq1DtfXNSVN2raVTpyw7fr1zayddNFF7lUiDtdr7bXXdfu13cB7HP7X2i1FikQ7u15/+knq0SM458Sy+zWMcOA6zoc5SeLhh6XRo3193brZrfjZs5uSJrsTb+9fcsklXGz4Dd+7ECpfW7t2SaVKpf45l10mmbvMpnh7MIJcUlmD+3IIpBw5cmjo0KHOn0B6mFk5s9Zj6lRfnzkm7OmnfYWIE76u+PqCv/G9C+HwtXWZi2EuATN1QIQzdZduuUVaudK2zQLe116T7rrr7M9jNgVApNuVzEydF8JcAmbqgAiveG6OAduyxbZz57azdc2auT0yAPCeiy6SzOoTc8KOl8JcAkIdEKE2brThbd8+2y5WTJo3T7r+erdHBgDelDWr/d5pNj9UreqdMJeAUAdEoAULpPbtpX/+sW1zNqHpK1PG7ZEBgLcVLWofXkSoCwOnTp3Sa6+9puXLlytPnjzq2rWrbr755hQ///Dhw+rcufN/+k1RyFrm5HaEtbfeku6+W4qLs+2aNaVZs+y5hMkZN26c84hLeAKQTj/88IPzNWR2UFeoUEEDBgxQMTM1nIIJEyboo48+OquvaNGieu+997j2OIvZ1Tpp0iQtXLjQ+bl37733puk5Y8aM0aZNm5yvw7vuukvXh8ktCkJdGOjQoYM2b96sRx99VL///rtatmypN954Q3fccUeKZ3p++umnev3113XppZcm9l9xxRVBHDWCzZTBNJXQn3rK12fq0Zmfk6kVWje1pcyD4wKREd99952qV6+ujh07qlOnTk5gq1q1qr7++msVLFgw2ef89NNP+uOPPzRixIjEvpw5c/IG4D9fW40bN1br1q3166+/Oj8Hz8X8/KtTp44zAWK+r5mTrmrUqKFFixY5/aGOUBfiVqxYoVmzZjm/cVSqVCnxWJRHHnlE3bt3V1azACAFNWvW1FVXXRXE0cItp07Z3awTJ/r6+veXRo3K+HE1QFqYchLmmMi3TcFDmZ3Wtzi/TL788st6/PHHU3xekSJFUr3jAJivo19++UW5c+dO812miRMnauvWrdqzZ48KFSrk3Nkyfx88eLBWr14d8heVb+chzkw5ly5dOjHQGW3bttX+/fud34RTM2TIELVp00YPP/yw8z8GwtPff9sNEQmBztSdGzNGeuEFAh0Cy5wb/tlnnzlBLoE5f7Np06bO967UmNk6873stttuc+4qxMbG8nbhLKaYsAl06bFw4ULdeOONTqBLYL7O1q5d69yNCHWEuhC3fft2p8p/UgnV/s3HUvK///1PjRo1cm7dmhMCzIzdkiVLAj5eBNeePVLt2tKiRbZt6m9OmyY98ADvBALvwIED+ueff5L9HpXa96csWbI4t9Xat2/vzPKNHDnSuTVGsEOgfmbGx8drx44dIX+Buf3qMWYdifnNNDUNGjTQwIEDEzdJmN98k0r4zcV8LKXbGmYdQUKFbbPOxax3uf/++501CggP339va9CZekpG4cLS7Nl2YwQQDAnfg5L7HpXS9yfD3ArLmzdvYrtZs2bOBgtz66xnz54BHDHC3akM/MwMJYQ6D04nP3COaZQSJUok/t0sNP73bxeHDh1y/kw6vZxUtmQK65hvmtOnT9eJEydYkBwGli6VWrc2u7xs2xTJNCVLrrzS7ZEhkiRshPjTHFvyr+9RKX1/MpIGOuOyyy5TVFSUNm7cSKjDeX9N/pnM16OR2tdkqCDUeYz5DSI9i4OvueYaZ+t/0jCWsJbu6quvTvO/Y77IzS0P80Boe/99yWx8jomxbbNTf+5c6cIL3R4ZIo0JZ2XLlnW+J5kF6QlMO+k64LR+j8qePXsARolIcs0112jZsmVn9ZmvxwIFCpxVDSJUsaYuxLVr106nT5/WK6+84rRjYmI0evRo5xZtwtq6gwcPOkFx1apVTnvu3Lnatm1b4r9hZvpMzR5TCiW5WTyETskSUwGiWzdfoDMbJMz3LwId3GKWk0yePNnZYWisWbPG2bWfdJnJW2+95ezWT2Bq2iVdP/fiiy8636fMxi4gPTZt2uT8/Eu4o3Xrrbc6pU/Mz8GEXxbGjx+vbt26hcWkBjN1Ia548eJO4cUePXo43zhNgDO3cBeYe21nmFk8U5euV69eTrtw4cLON0dTTDZfvnz65ptvnNuvZocZQpP5+WdqbiZ9C3v3lkzWT6WqDRBwZne9uW1qbp+WL19e3377rbMmuHnz5omfs2XLFi01awbOMEWKS5UqpTJlymjfvn1Osdh33nlHtc2uH+AMM4nRokUL5+8mqO3cudMJcGYjxJtvvun0m5+J5uffkSNHnPYNN9ygUaNGOZtwzAZBU9/O3NVKWhMxlGWKN1s+EPLMF6yZQjYLPitXrqzMSYqPmWKL5hvmtddeqwvPTNmY2b2ff/7ZWUtw+eWXJ/Yj9Jijvjp1srdYEzz7rPTII7Z8yflKeqKE+ZoxP2DNLw5AepivHTNbV65cOV188cX/KV9iCqfXrVv3rO9pZuOW+cXTFEan+DD+zfwcMyVzkrvtX+tM3TrzM85sDDTtpGs1zc7s77//3jmpJJzqtRLqgBD2xx+S+UV1wwbbNnfP33nH3oL1t4QTJQh1AOBN3JgBQtTPP0tmT81vv9m2mTybMUOqX9/tkQEA3ECoA0LQmjVSy5bm1oJtmz0x8+ebotJujwwA4BZ2vwIh5pNPTAFqX6AzlWvWriXQAUCkI9QBIeSll0wZG7Oj2bZNuFuxws7UAQAiG6EOCAGnT0sDBtgzWxP2q996q73lWqCA26MDAHgBoQ7wODMr17GjNGaMr++xx6R335UosA8ASMBGCcDDzLq5Vq2k1att2xQ8f+016c473R4ZAMBrCHWAR5lSJU2amMKstp0njzR1qtS0qdsjAwB4EbdfAQ/68kupWjVfoDMHfixf7k6gM6dJmCOeqlSpEvwXBwCkGSdKAB4zb57UoYN07Jhtly8vmaN8S5d2d1ycKAEA3sZMHeAh48fbosIJgc6cX27W07kd6AAA3keoAzzAlCkZMkTq3duWLzHMbJ05q7pwYbdHBwAIBWyUAFx26pTUs6c0ebKv78EHpeeflzLzaxcAII0IdYCLoqOltm2lxYttO1Mme2rEvffytgAA0odQB7hk9267m/W772w7Z07pgw+k1q15SwAA6UeoA1zw7bc20O3ZY9tFikhz5kjVq/N2AAAyhhU7QJCZW61mV2tCoCtTRlqzhkAHADg/hDogiN57T7r5ZlPzzbZvuEFau1YqV463AQBwfgh1QJBKljzzjHTrrVJsrO1r0UJaskQqVszbbwEnSgBAaOBECSDATIjr00d6801f3z33SC+/LGXJEjqXnxMlAMDb2CgBBNDRo1LHjtL8+b6+kSOlhx+25UsAAPAXQh0QIPv2Sc2bS199ZdvZsknvvit16cIlBwD4H6EOCIAtW6QmTaTt2227QAFp5kypbl0uNwAgMAh1gJ+tWiW1bCkdPmzbJUtKCxZIFSv67zV27Nih8ePHa/fu3apQoYLuueceFTDJMQUffvihZs2adVZfkSJFnE0QAIDwQKgD/GjaNKl7d+nkSduuVMmupytRwn+vsXXrVlWtWlX169dXgwYN9N5772nixInasGGD8ubNm+xzvvnmG23evFlDhgxJ7MudO7f/BgUAcB2hDvCTMWOkBx+05UuMRo2k6dOl/Pn9e4kff/xxlS9fXtOmTVOmTJnUrVs3lS5d2pl1GzRoUIrPu/DCC9WpUyf/DgYA4BnUqQPOU1yc9MAD0oABvkB3++3SvHn+D3Tx8fFasGCB2rVr5wQ6I1++fGrSpInmmRdMxa+//qqePXvq/vvv15QpU5x/CwAQPgh1wHk4flzq0EF66SVf39Ch0jvv2N2u/nbw4EGnXlypUqXO6r/00kud0JYSEwArV66sKlWqqGjRok6wu/nmm3X69OkUn3Py5EnntZI+AADexe1XIIMOHpRatbLnthqmkPAbb0g9e6bv35k0aZLmJy1kl4xnn31WZcqU0YkTJ5z2v9fOmXbCx5Lz0EMPORsjErRv317/+9//9P7776u7WQSYjBEjRmj48OHp+48BALiGUAdkgJkUM2e4bt1q2yZjmU0Spi+9TLjKnj17qp9TqFAh58+EHa5//vnnWR8/dOiQChYsmOLzkwY648orr1TFihW1fv36FEPd4MGDNcDcUz7DzNSVNFt5AQCeRKgD0mnDBltUeP9+2y5e3O5wvfbajF3Ka6+91nmkRf78+Z1brd9///1Z/d99950TDtPjyJEjievykpMjRw7nAQAIDaypA9Jh7lxbQDgh0FWoIK1bl/FAlxFdu3Z1ypgcOHDAaW/atElLlixxdsEmMLdV+/bte1Y76caICRMmaNu2bWppCuoBAMICoQ5Io9dft2vojh2z7Tp1pNWrzSaF4F5CU2uuXLlyzsxc48aNVadOHfXq1Utt27ZN/Jyvv/76rGLDq1at0uWXX67mzZvr+uuv13333acxY8aoYcOGwR08ACBgMsVT1wBIldkgamr2jhzp6+vYUZo40dyidOfimf9tTbHhPXv2ODXrzKkSSZnZu507d541E7dv3z5t3LjRKYFiAmFqa/CSY9bUmTV90dHRzm1gAIC3EOqAVJw6JfXoYW5f+voGDrQBL3OEzXMT6gDA29goAaTgr7+kNm2kpUtt2+wpePllKclSNQAAPINQByRj1y6pSRNp82bbzplT+vBD6ZZbuFwAAG8i1AH/8s03UtOm0t69tn3BBdKcOVK1alwqAIB3RdiqICB1n38u1a7tC3Rly0pr10Z2oBs3bpyioqKcI8YAAN7FRgngDLObtVcvKTbWtqtWtTN0RYtyiQw2SgCAtzFTh4hnavI+9ZR0++2+QGfq0S1ZQqADAIQO1tQhosXESH36SG+95eszu1tfeknKksXNkQEAkD6EOkSso0el9u2lhQt9fc8/Lz30kC1fAgBAKCHUISLt2yc1ayZt3Gjb2bPbNXWdOrk9MgAAMoZQh4jz44+2Bt2OHbZtTsuaOVO68Ua3RwYAQMYR6hBRVq60myAOH7btUqWkBQukqCi3RwYAwPlh9ysixtSpUsOGvkB3zTW2Bh2BDgAQDgh1iIiSJaNHSx07SqdO2b7GjaUVK6QSJdweHQAA/kGoQ1iLi5Puv9/uaE3Qo4ctKpwvn5sjCx2cKAEAoYETJRC2jh+XunaVZszw9Q0bJj3xBCVLMoITJQDA29gogbB08KDUooW0bp1tZ80qjR8v3XGH2yMDACAwCHUIO9u22ZIlW7fadt680scfSzfd5PbIAAAIHEIdwsr69VLz5tKBA7Z90UXS/Pl2pysAAOGMjRIIG7NnS3Xr+gKdKVVibr8S6AAAkYBQh7Dw6qtS69Z2c4RhTodYtcoWFwYAIBIQ6hDSTp+WHnlE6tvX/t3o3Fn69FOpUCG3RwcAQPAQ6hCyTp6UunWTnnvO1zdokDR5spQjh5sjAwAg+NgogZD011/2duuyZbadObP08stSnz5ujwwAAHcQ6hBydu60JUt++MG2c+WSpkyRWrZ0e2The6KEecSZ4zkAAJ7FiRIIKZs2SU2bSr//bttFi9ojv6pWdXtk4Y8TJQDA21hTh5Dx2WdS7dq+QHf55dLatQQ6AAAMQh1CwoQJUrNm0tGjtl2tmrRmjVS2rNsjAwDAGwh18LT4eGnYMKlHDyk21vbdcou0eLG99QoAACw2SsCzYmKk3r3tLF2Ce++VxoyRsmRxc2QAAHgPoQ6edOSI1L69LSKcYNQoacAAKVMmN0cGAIA3EergOXv32vVzZqerkT279N57UocObo8MAADvItTBUzZvtiVLTC06wxz1NWuW3fUKAABSxkYJeIY5HaJmTV+gu/RSafVqAh0AAGlBqIMnmBMhGjeWoqNtu3Jlad06qUIFt0cGc5pEVFSUqlSpwsUAAA/jRAm4XrLk//5PGjTI12eOAJs6Vcqb182R4d84UQIAvI2ZOrjGHCXar9/Zga5XL2n2bAIdAADpxUYJuOLYMalLF7sJIsFTT0lDhlCyBACAjCDUIegOHJBatJC++OLMF2FW6e23pVtv5c0AACCjCHUIqq1b7Zq5bdtsO18+6eOPpUaNeCPS46+//tLEiRP13XffqV+/frrmmmvO+Zx9+/ZpwoQJ2r17typUqKAePXood+7cXHgACBOsqUPQmN2sNWr4Al2JEtLKlQS69Jo0aZKzG3Xz5s16++23tX379nM+x3xOpUqVtGLFCpUuXVrvvPOOatasqWPmPjgAICwQ6hAUM2dK9epJBw/a9lVX2ZBXqRJvQHpVr15dv/zyi1544YU0P+fxxx9XqVKlNHfuXA0cOFCLFy/Wb7/9ptdff503AADCBKEOAffKK1KbNtKJE7Ztwp2ZoStZkoufEVdccUW6b5uaMNehQwdlyZLFaRcqVEhNmjTRnDlzeBMAIEwQ6hAwp09LAwdK995r69EZXbtKCxdKBQty4YPl4MGDzho8c9s1qcsuu8yZ8UvJyZMnndp0SR8AAO9iowQCwszK3X679NFHvr7Bg6VnnqFkyb999NFH+vzzz895+/RSc25aBhw/ftz5M5/ZlZKEaSd8LDkjRozQ8OHDM/SaAIDgI9TB7/78U2rdWlqxwrYzZ5ZefVXq3ZuLnRwT1qpVq5bqxcmTJ0+GL17+/PmdPw8fPvyv9+nPxI8lZ/DgwRowYEBi28zUleSeOQB4FqEOfrVjhy1Z8uOPtm2WfpnZuubNudApMYHuXKHufBQoUECXXHKJfvjhh7P6ze7Zq8yOlRTkyJHDeQAAQgNr6uA3GzeagOILdMWKScuWEejcMG3aND388MOJ7c6dO2vy5MnO2jrDBDyzA9b0AwDCQ6b4+IQl7EDGmc0P7dpJ//xj2+XKSQsWSGXKcFX9bdOmTXrllVcUGxvrFCBu2LChcwu3UaNG6tixo/M5Dz30kKZMmeIUGjaOHDmim266Sb///ruuu+46LVu2TE2bNnVq3mXKlClNr2tuv5pZv+jo6FRv2wIA3EGow3kzR3yZ9XJxcbZtCgzPni0VKcLFDYQdO3Yku7HC3EpNuI27fv16bdu27ayZuLi4OC1fvlx79uxR+fLlVaVKlXS9LqEOALyNUIcMM3O8w4ZJTz7p62vbVnrvPSlXLi5suCHUAYC3sVECGRITI911l/Tuu76+Bx6QRo2SztS3BQAAQUSoQ7qZGrRm/VzCHUCzJGv0aKl/fy4mAABuIdQhXfbskZo1k775xrZNxYvJk23IAwAA7qGkCdJs82ZzmLwv0BUuLC1aRKALd+PGjVNUVFS6N1YAAIKLjRJIk6VL7SkR0dG2bY4RNWVMrrySCxgp2CgBAN7GTB3O6YMPpMaNfYHuuuuktWsJdAAAeAmhDqmWLBk5Uura1e52NZo2tadEFC/OhQMAwEsIdUhWbKzUt6851N3XZ0qYzJol5c3LRQMAwGvY/Yr/MEd9mYMI5szx9T3zjA14aTxRCgAABBmhDmfZv19q3lzasOHMF0hW6Z13pO7duVAAAHgZoQ6Jfv5ZatJE+vVX2zZntn/yidSgARcJAACvI9TBsWaN1LKldOiQbV98sbRggfS//3GBAAAIBWyUgGbMsLNxCYHOBLl16wh0AACEEkJdhBs7VmrbVjpxwrZNuFu5UrrkErdHBq/gRAkACA2cKBGhTp+WBg6UXnjB12c2Q7z1lpQ9u5sjg1dxogQAeBszdRHIzMp16nR2oBsyRJo4kUAHAECoYqNEhPnzT6lVK2nVKtvOkkV69VVbWBgAAIQuQl0E2b7dlizZssW2c+eWpk2zR38BAIDQRqiLEF99JTVrJv3xh20XKybNmyddf73bIwMAAP7AmroIMH++dOONvkB35ZW2ZAmBDgCA8EGoC3NvvmmLCpvzXI2aNaXVq6XLLnN7ZAAAwJ8IdWEqPl56/HG7ASIuzva1ayctWiQVKeL26AAAgL+xpi4MnTol3XmnNGmSr69/f2nUKCkzMR4AgLDEj/gwEx1tN0QkBLpMmaQXX7Q16Qh0yAhOlACA0MCJEmFkzx5bnuTbb207Z05p8mR7DBhwvjhRAgC8jduvYeK772yg273bts26udmzpRo13B4ZAAAIBm6/hoElS6RatXyBrkwZac0aAh0AAJGEUBfizO3Vm282t8Zsu0oVae1aqVw5t0cGAACCiVAXwiVLRoyQuneXYmJsX4sW0tKl9rQIAAAQWQh1ISg2VrrnHunRR319pv3JJ1KePG6ODAAAuIWNEiHGnAzRqZM0d66vz8zYDRpky5cAAIDIRKgLIebs1ubNpS+/tO1s2aR335W6dHF7ZAAAwG2EuhDx009SkybSb7/ZdoEC0owZUr16bo8MAAB4AWvqQsDq1bY8SUKgK1lSWrWKQIfg4EQJAAgNnCjhcR9/LHXtKp08adtXXy3Nny9dfLHbI0Ok4UQJAPA2Zuo8zJzZ2r69L9A1aiStXEmgAwAA/0Wo86DTp6X+/e3D1KMzbrtNmjdPyp/f7dEBAAAvItR5zPHjUocOdpYuwRNPSBMm2N2uAAAAyWH3q4ccOiS1bGnPbTWyZJHeeEPq2dPtkcFrTpw4oY8++kjfffed7rjjDlWsWDHVz58/f76WmEOCkyhYsKAee+yxAI8UABAszNR5xK+/2h2uCYHOnAwxZw6BDv81depUlS1b1glqo0eP1tatW895mVasWKHZs2erePHiiY+iRYtyeQEgjDBT5wEbNtiiwvv323bx4nb9XOXKbo8MXlS+fHlnhi579uxOwEurUqVK6aGHHgro2AAA7iHUucwc99Wxo3TsmG1XqGBLlpQu7fbI4FVXm7o2ko4ePZqu5+3Zs0dDhw5V3rx5Vb16ddWqVStAIwQAuIHbry4y6+VatfIFujp1bKFhAh0Cwayhi4uL07Zt29S4cWNnLV5qTp486dSmS/oAAHgXM3UuMGVKhgyRRozw9ZkdrxMnSjlzujEiuMmsdTNr3lLzwAMP6JJLLsnwa/Tu3VsjR45MbJtAV6NGDbVo0UJt2rRJ9jkjRozQ8OHDM/yaAIDgItQF2alTUo8e0vvv+/rMMqfnnpMyM28akfLly+dsXEhNtvOsZ3PZZZed1a5ataqioqK0cuXKFEPd4MGDNWDAgMS2makrac6oAwB4EqEuiKKjJfPzM6GyRKZM0tixUr9+wRwFvKZevXrOI9hiY2OdW6wpyZEjh/MAAIQG5oaCZNcuyaxLTwh05jarOdeVQIdAmDt3rp5++unE9rJly876+MKFC7VlyxY1MmfPAQDCQqb4+ISDqBAo334rNW1qdh/adpEitgZd9epcc6Tf5s2bNWHCBMXExGjs2LFq1aqVLr/8ctWpU0ctTfVq55b+Q5oyZYp2797ttE3/gQMHVKlSJe3bt88Jdf369dOoUaPS/Lrm9muBAgUUHR2t/JxXBwCew+3XAFu0yN5yPXLEtsuWlRYskK64ItCvjHBlbokmrMH7v//7v7PW5iUwGyCuSPJFZjZjfP3119qwYYPzeaZosSlgDAAIH8zUBdCkSfZEiNhY277hBjtDV6xYIF8VCAxm6gDA21hTFwDmhrZZznTbbb5AZ+6KLV1KoAMAAIHB7Vc/MyHunnukt97y9fXpY3e5Zsni71cDAACwCHV+ZE5tMkWEzZq5BKb+3MCBtnwJAABAoBDq/GTfPqlZM2njRtvOnl16912pc2d/vQLgjnHjxjkPc8QYAMC72CjhB1u2SE2aSNu323bBgtLMmdKNN/rjXwe8gY0SAOBtzNSdp5UrpVatpMOHbducomRuv1as6Id3BwAAII3Y/Xoepk2TTEH+hEB3zTXSunUEOgAAEHyEugyWLHnhBbspIuHozJtuklaskEqU8PM7BAAAkAaEunQya8UfeEB68EFf3x13mLM2TUX/9P5rAAAA/kGoS4fjx6X27W3NuQTDhklvvy1ly+andwQAACAD2CiRRgcP2lMh1q61bVNIePx4qUePjFx2AAAA/yLUpcG2bbZkydattp03rzR9utS4sZ/fDQAAgAwi1J3D+vVS8+bSgQO2fdFF0vz5dqcrAACAV7CmLhVz5kh16/oCXVSULVlCoEMkMadJREVFqUqVKm4PBQCQCk6USMFrr0n9+kmnT9u2OR1ixgypUKHULicQvjhRAgC8jZm6fzEhbvBgqU8fX6Az57d++imBDgAAeBehLglTSLh7d2nkSF/foEHS5MlSjhwuvDsAAABpxEaJM/76S2rdWlq2zLYzZ5ZeftnO2AEAAHgdoU7Szp1S06bS5s32ouTKJU2ZYuvSAQAAhIKID3WbNknNmkl799oLUrSo3fVatarbbw0AAEDaRfSaus8/l+rU8QW6yy+3J0YQ6AAAQKiJ2FD37rv2luuRI7ZdrZq0Zo1UtqzbIwMAAEi/iAt18fHSk09Kd9whxcbavltukRYvtrdeAQAAQlFEhbqYGOnOO6WhQ319995rz3HNndvNkQHexYkSABAaIuZECXObtUMHaeFCX9+oUdKAAVKmTG6ODAgNnCgBAN4WEbtff//d7nD9+mvbzp5dmjRJ6tjR7ZEBAAD4R9iHuh9/lJo0kXbssO2CBaVZs+yuVwAAgHAR1mvqVqyQatTwBbpLL7U7XAl0AAAg3IRtqPvoI6lRI3v8l1G5sq1BV6GC2yMDAADwv7ALdWbbh9kA0amTdOqU7bv5Zmn5cumii9weHQAAQGCEVaiLi5Puu08aONDX17OnNHu2lDevmyMDAAAIrLDZKHHsmNS1qzRzpq/PFBl+7DFKlgAAgPAXFqHuwAGpZUtp3TrbzppVeust6bbb3B4ZAABAcIT87ddffrE7XBMCXb580vz5BDrAXzhRAgBCQ0ifKPHFF1Lz5tLBg7ZdooQNdJUquT0yIPxwogQAeFvIztSZAsL16vkCXcWKdraOQAcAACJRSIa6ceOkNm2k48dt24S7VaukkiXdHhkAAIA7QirUnT4tDRok9etn/26YHa8LFtjjvwAAACJVyOx+PXlSuv12acoUX9/gwdLTT0uZQyqaAufvhx9+0KpVq2SWxFatWlXXXHPNOZ9z7NgxzZo1S7t371aFChXUtGlTZeZ/HgAIGyERhw4flho39gU683PotdekZ58l0CHytGnTRh07dtRXX32lDRs2qFatWrr//vtTfc6BAwdUuXJlPffcc9q+fbv69u3rhLrY2NigjRsAEOG7X3fskJo2NTMTtp07tw13LVq4PTLAHZ9//rkamYONz1i6dKnq16+vdevWObN2yTEhbsmSJdq4caNy5cqlnTt3qnz58ho7dqx69eqVptdl9ysAeFvQZ+pMhJw2zfwgOvfnbtokVa/uC3RFi0rLlhHoENmSBjqjhinUKOnXX39N8TnTp09Xly5dnEBnlCpVSo0bN3b6AQDhIeihzpz00KGDVL++NH58yp/36adS7drS77/b9hVXSGvXSlWqBG2oQEiYOnWqszauSgr/cxw+fFj79+9XuXLlzuo37S1btqT47548edKZnUv6AAB4V9Zgz9KNGeNr9+kjXXyx1KzZ2Z83YYJ0551SXJxtm9m62bOlCy4I5miB4N1O/cJU0k5Fz549ddFFFyW7YeLee+/VgAEDdPnllyf73KNHjzp/FihQ4Kz+ggULJn4sOSNGjNDw4cPT+F8BAIiombqVK6Uff/S1TWgzs3ZffukLfcOGST16+AKdqUe3eDGBDuErJiZGJ06cSPWR3NLXX375xbkV27x5c2cDREry5Mnj/Pnvmbbo6OjEjyVn8ODBzuckPHbt2nVe/50AgDCaqXv99f/2HTtmZ+pM4Bs50s7SJTAb+kaPlrJkCeYogeAyu1DNIz22bdumevXqqW7dupo4cWKqpUkKFy6sokWLOiEwqa1bt+rKK69M8Xk5cuRwHgCA0BC0mbr9+81i7ZQ/Vrny2YHuhRekF18k0AH/ZjZEmDBXp04dTZo0SVmS+a1n8eLFzs7WBK1bt9YHH3zgrJMz9u7dq08//dQpjwIACA9BK2ny/PP2NIhzyZ5dmjxZat8+GKMCQov537V06dLOrdQHHnjgrEDXsGFDVatWzfn7Qw89pClTpjiFho19+/apZs2aKlKkiGrXrq2ZM2c6O2A/++wzZcuWLU2vTUkTAPC2oNx+NUd6vfFG2j7XVGdo2zbQIwJCN9R17949cS2eeSSIS1iIeibgXXjhhYnt4sWLa9OmTZo2bZr27NmjkSNHOrN0yc3yAQBCU1Bm6j77zJ4IkVb9+9vbrwC8g5k6APC2zG5tkEiNKXvy0kuBGg0AAED4CXio27vX1phLLzNb9/HHgRgRAABA+Al4qHv7bV/NufQwN4W7dZN+/jkQowIAAAgvAQ11sbGpHwV2LidO2KPBALhn3LhxioqKSvEYMgBABGyUmDNHatkyY88tUsTugh01SsqXz98jA5BebJQAgAguaWJOg0ir3LmlOnVMKQapQQPp6qulVIrkAwAAIBihzpzxunx5yh835bGqVvWFOFMz1RQeBgAAgIdCXXJr4a66yhfizKxc/vyBenUAAIDIErA1dWbHa+vW0u+/S717S82bm6r2gXglAMHAmjoAiNCZOnN7NSP16QAAAJB+bEUAAAAIA4Q6AACAMECoAwAACAOEOgCp4kQJAAgNAT1RAkD4YPcrAHgbM3UAAABhgFAHAAAQBgh1AAAAYYBQBwAAEAbYKAEgTcyeqiNHjihfvnzKlCkTVw0APIZQBwAAEAa4/QoAABAGCHUAAABhgFAHAAAQBgh1AAAAYYBQBwAAEAYIdQAAAGGAUAcAAKDQ9/+elfziFqf7GgAAAABJRU5ErkJggg==",
      "text/plain": [
       "Graphics object consisting of 3 graphics primitives"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sum( [ arrow( (0,0) , (k.real(),k.imag()) ) for k in autovalores ] )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f303c70e",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-block alert-info\">\n",
    "<strong>Ejercicio 1. </strong> Consideremos la matriz\n",
    "    $$A=\\left(\\begin{array}{rrr}\n",
    "3 & 1  \\\\\n",
    "2 & -2  \n",
    "\\end{array}\\right)$$\n",
    "\n",
    "a) Calcula el determinante, los autovalores y los autovectores de la matriz.\n",
    "\n",
    "b) Representa los autovectores. Comprueba que son autovectores.\n",
    "\n",
    "c) Para cada vector de la base usual, dibuja una flecha cuyo origen sea dicho vector y el destino sea su imagen por $A$.\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f7b2ad75",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "77a763cd",
   "metadata": {},
   "source": [
    "# Normas matriciales "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3cbf4401",
   "metadata": {},
   "source": [
    "Podemos calcular la norma matricial usando la función norm de Sage. Si no se especifica nada, será la norma euclídea."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a69d4638",
   "metadata": {},
   "outputs": [],
   "source": [
    "A = matrix([[1,2,3],[4,5,6],[0,0,1]])\n",
    "show(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a7c19c82",
   "metadata": {},
   "outputs": [],
   "source": [
    "A.norm(),A.norm(2),A.norm(1),A.norm(oo)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cffff7b3",
   "metadata": {},
   "source": [
    "Podemos calcular el número de condición de una matriz usando el método condition. Con la norma 2:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "06ae8368",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html>\\(\\displaystyle \\left(\\begin{array}{rrr}\n",
       "0.976001805206361 - 0.7383450038597912i & -0.4727660785915109 - 0.6697870184540242i & -0.1284011324147052 - 0.6882362291437845i \\\\\n",
       "0.8959948093261869 + 0.8563935205520357i & -0.6788834053591057 + 0.22906386020075553i & 0.8018884504104564 + 0.06945771996670302i \\\\\n",
       "0.6552261541038276 + 0.976958774093373i & -0.0609806192404454 + 0.9658891376993155i & -0.6475470630294342 + 0.5317297575490851i\n",
       "\\end{array}\\right)\\)</html>"
      ],
      "text/latex": [
       "$\\displaystyle \\left(\\begin{array}{rrr}\n",
       "0.976001805206361 - 0.7383450038597912i & -0.4727660785915109 - 0.6697870184540242i & -0.1284011324147052 - 0.6882362291437845i \\\\\n",
       "0.8959948093261869 + 0.8563935205520357i & -0.6788834053591057 + 0.22906386020075553i & 0.8018884504104564 + 0.06945771996670302i \\\\\n",
       "0.6552261541038276 + 0.976958774093373i & -0.0609806192404454 + 0.9658891376993155i & -0.6475470630294342 + 0.5317297575490851i\n",
       "\\end{array}\\right)$"
      ],
      "text/plain": [
       "[   0.976001805206361 - 0.7383450038597912*I  -0.4727660785915109 - 0.6697870184540242*I  -0.1284011324147052 - 0.6882362291437845*I]\n",
       "[  0.8959948093261869 + 0.8563935205520357*I -0.6788834053591057 + 0.22906386020075553*I  0.8018884504104564 + 0.06945771996670302*I]\n",
       "[   0.6552261541038276 + 0.976958774093373*I  -0.0609806192404454 + 0.9658891376993155*I  -0.6475470630294342 + 0.5317297575490851*I]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "A = random_matrix(CDF, 3)\n",
    "show(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "03f70460",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2.6929842465640137, 0.3204472451716942 - 3.0216633557626262*I)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.condition(2),A.det()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f78391ed",
   "metadata": {},
   "source": [
    "Las matrices de Hilbert están especialmente mal condicionadas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5d2de886",
   "metadata": {},
   "outputs": [],
   "source": [
    "n=4\n",
    "A = matrix(RDF,  [ [1/(i+j+1) for i in range(n)] for j in range(n)])\n",
    "show(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "eb865600",
   "metadata": {},
   "outputs": [],
   "source": [
    "A.condition(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5b4b9083",
   "metadata": {},
   "source": [
    "Podemos comparar el número de condición obtenido con el obtenido a partir de la definición."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "261c03fc",
   "metadata": {},
   "outputs": [],
   "source": [
    "A.norm(2)*(A.inverse()).norm(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "33d20e18",
   "metadata": {},
   "source": [
    "Si la matriz no es de doble precisión, no calcula el número de condición."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3512e8ec",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html>\\(\\displaystyle \\left(\\begin{array}{rrr}\n",
       "-1 & 2 & -1 \\\\\n",
       "-2 & 0 & 0 \\\\\n",
       "0 & 2 & \\frac{1}{2}\n",
       "\\end{array}\\right)\\)</html>"
      ],
      "text/latex": [
       "$\\displaystyle \\left(\\begin{array}{rrr}\n",
       "-1 & 2 & -1 \\\\\n",
       "-2 & 0 & 0 \\\\\n",
       "0 & 2 & \\frac{1}{2}\n",
       "\\end{array}\\right)$"
      ],
      "text/plain": [
       "[ -1   2  -1]\n",
       "[ -2   0   0]\n",
       "[  0   2 1/2]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "A = random_matrix(QQ, 3)\n",
    "show(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "351f1ef0",
   "metadata": {},
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "'sage.matrix.matrix_rational_dense.Matrix_rational_dense' object has no attribute 'condition'",
     "output_type": "error",
     "traceback": [
      "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
      "\u001b[31mAttributeError\u001b[39m                            Traceback (most recent call last)",
      "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[2]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m A.condition(Integer(\u001b[32m2\u001b[39m))\n",
      "\u001b[36mFile \u001b[39m\u001b[32msage/structure/element.pyx:494\u001b[39m, in \u001b[36msage.structure.element.Element.__getattr__\u001b[39m\u001b[34m()\u001b[39m\n\u001b[32m--> \u001b[39m\u001b[32m494\u001b[39m \u001b[33m'Could not get source, probably due dynamically evaluated source code.'\u001b[39m\n",
      "\u001b[36mFile \u001b[39m\u001b[32msage/structure/element.pyx:507\u001b[39m, in \u001b[36msage.structure.element.Element.getattr_from_category\u001b[39m\u001b[34m()\u001b[39m\n\u001b[32m--> \u001b[39m\u001b[32m507\u001b[39m \u001b[33m'Could not get source, probably due dynamically evaluated source code.'\u001b[39m\n",
      "\u001b[36mFile \u001b[39m\u001b[32msage/cpython/getattr.pyx:362\u001b[39m, in \u001b[36msage.cpython.getattr.getattr_from_other_class\u001b[39m\u001b[34m()\u001b[39m\n\u001b[32m--> \u001b[39m\u001b[32m362\u001b[39m \u001b[33m'Could not get source, probably due dynamically evaluated source code.'\u001b[39m\n",
      "\u001b[31mAttributeError\u001b[39m: 'sage.matrix.matrix_rational_dense.Matrix_rational_dense' object has no attribute 'condition'"
     ]
    }
   ],
   "source": [
    "A.condition(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "1974ac68",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3.0996846611560986"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Aunque sí podemos calcularlo con la definición\n",
    "A.norm(2)*A.inverse().norm(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dcb590bf",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-block alert-info\">\n",
    "    <strong>Ejercicio 2. </strong>\n",
    "    \n",
    "**a)** Calcula las normas 1,2 e infinito de la matriz\n",
    "$$A=\\left(\\begin{array}{rrrr} \n",
    "4       & -1    & 0      & 1 \\\\\n",
    "-1      & 4     & 0      & 0 \\\\\n",
    "1       & 0     & 5      & -1 \\\\\n",
    "-1      & 1     & 1      & 4 \\\\\n",
    "\\end{array}\n",
    "\\right)\n",
    ".$$\n",
    "\n",
    "**b)** Calcula un vector unitario con la norma 1, $u$, tal que $\\|Au\\|_1=\\|A\\|_1\\|u\\|_1$.\n",
    "\n",
    "**c)** Idem para las normas $2$ e $\\infty$.\n",
    "\n",
    "d) Calcular los autovectores unitarios (usar la orden de sage eigenvectors_right) con la norma euclídea de $A^tA$. Calcular su imagen por $A$. Comprobar que tanto los autovectores como sus imágenes son ortogonales, es decir, en ambos casos forman bases ortogonales. Calcular $\\min_{\\|u\\|_2=1} \\|Au\\|_2$. Repetir el proceso cambiando $A$ por $A^{-1}$. ¿Qué relación hay entre la $1/\\|A^{-1}\\|_2$ y  $\\min_{\\|u\\|_2=1} \\|Au\\|_2$?\n",
    "\n",
    "e) Calcular $\\min_{\\|u\\|_1=1} \\|A u\\|_1$. \n",
    "\n",
    "f) Idem para la norma infinito.\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "146fb4b9",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "a907e045",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-block alert-info\">\n",
    "    <strong>Ejercicio 3. </strong>\n",
    "    \n",
    "a) Busca cómo definir en Sage las matrices de Hilbert. Calcula la norma de la matriz de Hilbert de dimensión 5 con la norma 1 y con la norma infinito. Calcula también su número de condición con ambas normas. ¿Qué piensas que ocurrirá al resolver un sistema definido por dicha matriz? \n",
    "    \n",
    "b) Crea varias matrices aleatorias de dimensión 4. Calcula su determinante y su número de condición (con tu norma preferida). ¿Qué relación piensas que puede haber?\n",
    "    \n",
    "c) Crea muchas matrices aleatorias de dimensión 4 y representa en una gráfica el determinante y el número de condición.\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "531fa9a0",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "7f6e6de5",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-block alert-info\">\n",
    "    <strong>Ejercicio 4. </strong>    Consideramos el sistema\n",
    "\n",
    "$$\\left(\\begin{array}{rr} 1 & 1/30 \\\\ 1 & 1/31 \\end{array}\\right)x=b,$$\n",
    "\n",
    "con $b$ un vector unitario con la norma 2. Suponemos que tenemos un pequeño error en el término independiente, es decir, en lugar de $b$, tenemos $b+\\tilde b$ y sabemos que $\\|\\tilde b\\|_2/\\|b\\|_2 = 1\\%$. \n",
    "\n",
    "   **a)** Calcular el número de condición de la matriz del sistema con la norma euclídea.\n",
    "    \n",
    "   **b)** Acotar el error relativo de las soluciones.\n",
    "    \n",
    "   **c)** Encontrar $b$ y $\\tilde b$ en las condiciones anteriores para que el error sea máximo.  \n",
    "    \n",
    "   d) Idem para mínimo.\n",
    "    \n",
    "   e) Repite el ejercicio cambiando la norma 2 por la norma 1.\n",
    "    \n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "91d25857",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "2929f64c",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-block alert-info\">\n",
    "    <strong>Ejercicio 5. </strong>    Consideramos la matriz\n",
    "\n",
    "$$A=\\left(\\begin{array}{rr} 2 & 3 \\\\ 4 & 5 \\end{array}\\right)$$\n",
    "\n",
    "   a) Representa la imagen por $A$ de la bola unidad de la norma euclídea.\n",
    "    \n",
    "   b) Calcula los ejes de la elipse que has obtenido en el punto anterior y añádelos al gráfico anterior.\n",
    "    \n",
    "   c) Calcula la norma 2 de $A$. Añade al gráfico la circunferencia de centro el origen y radio $\\|A\\|_2$.\n",
    "    \n",
    "   d) Idem para la norma 2 de $A^{-1}$.\n",
    "    \n",
    "    \n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a9721e62",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e961e5b2",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "SageMath",
   "language": "python",
   "name": "sagemath"
  },
  "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.13.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
