{ "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": 2, "id": "c269cee4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1, 2, 3)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v = vector(ZZ,[1,2,3])\n", "type(v) \n", "v" ] }, { "cell_type": "code", "execution_count": 4, "id": "46aff7fb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((1, 2, 3), (1.0, 2.0, 3.0))" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w = vector(RDF,[1,2,3])\n", "v,w" ] }, { "cell_type": "code", "execution_count": 5, "id": "821a514a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2.0, 4.0, 6.0)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Podemos sumarlos. Para ello convertirá los enteros en números reales.\n", "v + w" ] }, { "cell_type": "code", "execution_count": 6, "id": "b26c6141", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(v+w)" ] }, { "cell_type": "code", "execution_count": 7, "id": "81f84f71", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "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": "code", "execution_count": 9, "id": "5961fcf6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vector([x,x^2,x^3])\n", "type(vector([x,x^2,x^3]))" ] }, { "cell_type": "markdown", "id": "a73ae277", "metadata": {}, "source": [ "Veamos algunos ejemplos con matrices." ] }, { "cell_type": "code", "execution_count": 12, "id": "72af041a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\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": 13, "id": "bcf14972", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", "1 & 0 & -1 \\\\\n", "0 & 1 & 2 \\\\\n", "1 & 1 & 1\n", "\\end{array}\\right)$$" ], "text/plain": [ "[ 1 0 -1]\n", "[ 0 1 2]\n", "[ 1 1 1]" ] }, "metadata": {}, "output_type": "display_data" } ], "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": 14, "id": "812afe71", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", "2.0 & 2.0 & -4.0 \\\\\n", "3.0 & 2.0 & 3.0 \\\\\n", "2.0 & 2.0 & 3.0\n", "\\end{array}\\right) \\left(\\begin{array}{rrr}\n", "-2.0 & -1.0 & 0.0 \\\\\n", "4.0 & 2.0 & 0.0 \\\\\n", "3.0 & 3.0 & 3.0\n", "\\end{array}\\right) \\left(-4.0,\\,8.0,\\,9.0\\right) \\left(7,\\,14,\\,21\\right) \\left(\\begin{array}{rrr}\n", "-2.0 & -4.0 & 6.0 \\\\\n", "-6.0 & -2.0 & -2.0 \\\\\n", "-2.0 & -2.0 & -4.0\n", "\\end{array}\\right) \\left(\\begin{array}{rrr}\n", "-510 & -511 & -512 \\\\\n", "1022 & 1023 & 1024 \\\\\n", "512 & 512 & 512\n", "\\end{array}\\right)$$" ], "text/plain": [ "[ 2.0 2.0 -4.0]\n", "[ 3.0 2.0 3.0]\n", "[ 2.0 2.0 3.0] [-2.0 -1.0 0.0]\n", "[ 4.0 2.0 0.0]\n", "[ 3.0 3.0 3.0] (-4.0, 8.0, 9.0) (7, 14, 21) [-2.0 -4.0 6.0]\n", "[-6.0 -2.0 -2.0]\n", "[-2.0 -2.0 -4.0] [-510 -511 -512]\n", "[1022 1023 1024]\n", "[ 512 512 512]" ] }, "metadata": {}, "output_type": "display_data" } ], "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": 15, "id": "469c1bf4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-15.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Determinante\n", "A.det()" ] }, { "cell_type": "code", "execution_count": 16, "id": "6b06bab4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(-1.5556218095982448,\n", " [(-0.6412412320435307, 0.7665298768041033, -0.03523677473862972)],\n", " 1),\n", " (2.7778109047991224 + 1.3878807693997999*I,\n", " [(-0.21853271682511885 - 0.4144302768311717*I, -0.6460200641125966, -0.4929033642230452 + 0.34669200686521673*I)],\n", " 1),\n", " (2.7778109047991224 - 1.3878807693997999*I,\n", " [(-0.21853271682511885 + 0.4144302768311717*I, -0.6460200641125966, -0.4929033642230452 - 0.34669200686521673*I)],\n", " 1)]" ] }, "execution_count": 16, "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": 17, "id": "356ca15e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[-1.5556218095982448,\n", " 2.7778109047991224 + 1.3878807693997999*I,\n", " 2.7778109047991224 - 1.3878807693997999*I]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "autovalores = [l for l,v,m in A.eigenvectors_right()]\n", "autovalores" ] }, { "cell_type": "code", "execution_count": 18, "id": "e65e8fbb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(-0.6412412320435307, 0.7665298768041033, -0.03523677473862972),\n", " (-0.21853271682511885 - 0.4144302768311717*I, -0.6460200641125966, -0.4929033642230452 + 0.34669200686521673*I),\n", " (-0.21853271682511885 + 0.4144302768311717*I, -0.6460200641125966, -0.4929033642230452 - 0.34669200686521673*I)]" ] }, "execution_count": 18, "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": 20, "id": "ebc92bee", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAASIAAADWCAYAAAB1yo8NAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAhdElEQVR4nO3de1xUdfoH8M+IMIrCmBdupUkhIt4yRQFNLVe85ZaWq5sXrF1N85qiRl7TFLW8VGJqq6arqbuhZmWaFYIFut7ICyK6P1ZIJcRwAFGQ4fv743E4jALODDNz5sw879frvIovc4ZnpB6/53t5viohhABjjMmoltwBMMYYJyLGmOw4ETHGZMeJiDEmO05EjDHZcSJijMmOExFjTHaciBRECIH8/Hzw0i/maDgRKUhBQQE0Gg0KCgrkDoUxi+JExBiTHScixpjsOBEpQGxsLIKDgxESEiJ3KIxBCKCoCMjOBm7ftsx7qnjTq3Lk5+dDo9FAq9XC09NT7nCYwpWUAAcPAtevAwUFQGEh/fNR/15YCJSV0XuoVEBcHDBoUM1iqV3zj8MYU6LJk4H162v2HkIA335b80TEj2aMOSlLTL66uwMxMTV/H05EjDmpqCh6tKqJ3buBJk1qHgsnIsacVIcOwOjR5t8/dizQp49lYuHBagXhwWpmadeuAS1a0CyYKZo3B86cATw8LBMH94gUgKfvmbX4+QGzZpl+36ZNlktCAPeIFIV7RMwazp8HQkKAO3eMe/2kScDHH1s2Bu4RMeaktFrqDT37rPFJKCDAMrNkD+J1RIw5mdJS4B//AObNA27ckNpr16bvVUWlAj7/HKhXz/IxcY+IMSdy4ADQvj0wfryUhNzcqGe0b1/1906fDnTtap24OBEx5gTOnQP69gX69QNSU6X2oUOBtDRg6VL63uDBld/fqhWwaJH14uNEpAA8a8bMlZNDvZ/27WlfmV6XLkBSErBzJ+DvL7UvWwa4uhq+h4sLsGULUKeO9eLkWTMF4VkzZqy7d4GPPgIWLzbcytGsGSWboUOrXlU9fTqwcqX09ezZwPvvWzdeTkQKwomIPYoQwL//TWM+//uf1F6/PvDuu8DUqUDdutW/x61bQGAgjSG1awccP07jSNbEs2aMOYhjx4C33waSk6W2WrWAv/8dWLgQ8PY27n0aNAASE4H9+4HISOsnIYATEWOKd+UKEB0N7Nhh2N67N7BiBdC2renvGRREl61wImJMoQoKaLZr5UoaE9ILCqIE1K9fzXfX2wonIsYURqejvV5z5wK//y61N2pEj2Bjxjw882XvOBEpQGxsLGJjY6HT6eQOhcnshx+AadOAs2elNldXYMoUmt1q0EC20GqEZ80UhGfNnNeFC8CMGVSWtaJXX6XHs6eflicuS+EeEWN2LDcXWLAAWLeOHsn0OnUCVq0CunWTLTSL4pXVZkpMTMTAgQPh5+cHlUqFvXv3PvKehIQEdOzYEXXq1MFTTz2FdevWWT9QpkjFxTTgHBAAxMZKSeiJJ4B//pOm6h0lCQGciMx2+/ZttG/fHmvWrDHq9RkZGejfvz+ee+45nD59Gu+++y4mT56MuLg4K0fKlEQIOp4nOJhqSmu11F6vHu31ungRGDGC1gc5FMFqDIDYs2dPta+ZOXOmCAoKMmh78803RWhoqNE/R6vVCgBCq9WaEyazc8ePC/Hcc0JQOqJLpRLib38T4to1uaOzLkfLq3YrOTkZERERBm19+vTBiRMncO/evUrvKS4uRn5+vsHFHM9vvwGjRlGVxCNHpPbnnwdOnaLaQb6+8sVnC5yIbCQ7OxveD6yx9/b2RmlpKXJzcyu9JyYmBhqNpvxq2rSpLUJlNlJYSMXJAgNp3EcvMJBqA/34I/DMM7KFZ1OciGxI9cAyV3F/5cSD7XrR0dHQarXlV1ZWltVjZNan0wGbN1PCWbRIKtP62GO0Y/7cOWDgQOWsirYEnr63ER8fH2RnZxu05eTkoHbt2mjUqFGl96jVaqjValuEx2wkPp4WJKakSG21a1NB+jlzgIYNZQtNVpyIbCQsLAxff/21Qdv333+PTp06wVVp6/GZydLTaUHig+VYBw2i+kAtWsgTl73gRzMzFRYWIiUlBSn3/2rLyMhASkoKMjMzAdBj1ahRo8pfP27cOFy5cgXTpk3DhQsXsGnTJmzcuBFRUVFyhM9s5I8/qAZQ69aGSahDB+od7d7NSQgAT9+bKz4+XgB46IqMjBRCCBEZGSl69OhhcM/hw4dFhw4dhJubm2jevLn49NNPTfqZPH2vHMXFQqxaJcRjjxlOx/v5CfH550LodHJHaF94r5mC8F4z+ycE9XxmzAAuXZLa69YFZs6kdmscx6N0PEakALz7XhlOn6aB6MOHDdsjI6l29OOPyxKWInCPSEG4R2Sfrl2jEhxbtlCPSK97dypa1rGjfLEpBfeIGDPT7du0MXXZMqCoSGp/+mnggw+Al192rrVANcGJiDETlZUB27bRqRhXr0rtDRrQSukJE2xTcN6RcCJizASJiTQOdPKk1ObiArz1FjB/PpVrZabjRMSYES5fprPCdu82bB84EFi+3LYnXjgiXtCoAHzktHxu3aKTT4ODDZNQu3ZUP3rfPk5ClsCzZgrCs2a2c+8esH49lWm9eVNq9/Gh45dHj6ZHMmYZ/GjGWAVCUIH6qCiqhqhXpw61zZwJeHjIF5+j4kTE2H1nztBj2A8/GLaPGAEsWQJwOSjr4UTEnF52Nh1WuHGj4YLErl1pQWLnzvLF5iw4ETGndecOHckTE0PVEvX8/Wkm7JVXeEGirXAiYk6nrAzYuRN45x2gYtFLT0/qGU2aBHA9Otvi6XsF4Ol7y/nlFyAsDBg+XEpC+gWJly/TgDQnIdvj6XsF4el782VkUA/oX/8ybO/fn/aFBQfLExcj/GjGHJpWSzNeq1cDJSVSe+vWtGG1Tx/ZQmMVcCJiDqm0FPjsM9qEWvG0Ji8vOjnjjTeoaD2zD/yrYA7nwAFaD5SaKrWp1bRZ9Z13aFCa2RdORMxhnDtHg80HDxq2DxtGU/TNm8sSFjMCJyKmeDk59Aj22Wc0Na8XGkoLEsPC5IuNGYen7xWAp+8rd/cuVUcMCKANqvok1KwZsGMHkJTESUgpePpeQXj6nghB0/CzZgFXrkjtHh5UNXHKFDo1gykHP5oxRTl2DHj7bSA5WWqrVQsYMwZ47z3A21u+2Jj5+NGsBtauXQt/f3/UqVMHHTt2xJEjR6p87eHDh6FSqR660tLSbBixcl25Arz2Go37VExCvXvTOfLr1nESUjLuEZlp165dmDp1KtauXYuuXbti/fr16NevH1JTU9GsWbMq77t48aLBY1WTJk1sEa5iFRTQjNfKlUBxsdTeqhUtSOzblzemOgS5jphVus6dO4tx48YZtAUFBYl33nmn0tfrj6jOy8sz+2c605HTpaVCbNgghJeX4ZHNjRsLsXatEPfuyR0hsyR+NDNDSUkJTp48iYiICIP2iIgIJCUlVXtvhw4d4Ovri169eiE+Pr7a1xYXFyM/P9/gcgaHDgEdOgBjx9LUPEDH88yYQRtTx4/nVdGOhhORGXJzc6HT6eD9wKCEt7c3srOzK73H19cXGzZsQFxcHHbv3o2WLVuiV69eSExMrPLnxMTEQKPRlF9NHbxE4IULwIABQEQEcPas1P7qq/S95csBjUa++Jj18N8rNaB6YHBCCPFQm17Lli3RsmXL8q/DwsKQlZWFDz/8EN27d6/0nujoaEybNq386/z8fIdMRrm5VKR+3TpAp5PaQ0JobKhbN9lCYzbCicgMjRs3houLy0O9n5ycnId6SdUJDQ3Ftm3bqvy+Wq2G2oGL4xQXA598QqdiaLVS+xNPAEuXAn/9K03NM8fHv2YzuLm5oWPHjjh06JBB+6FDhxAeHm70+5w+fRq+vr6WDs/uCQF8+SXNfM2YISWhevUoKV28SIXLOAk5D+4RmWnatGkYOXIkOnXqhLCwMGzYsAGZmZkYN24cAHqsunr1KrZu3QoAWL16NZo3b47WrVujpKQE27ZtQ1xcHOLi4uT8GDZ3/Djtgv/5Z6lNpaKyHIsWAU6Ylxk4EZlt6NChuHnzJhYuXIjr16+jTZs22L9/P5588kkAwPXr15GZmVn++pKSEkRFReHq1auoW7cuWrdujW+//Rb9+/eX6yPYVFYWbb948En0hRdoHKh9e3niYvaB95opQGxsLGJjY6HT6ZCenq6ovWaFhTTb9eGHdGqGXsuW1DZgAC9IZJyIFEVJm151OmDLFmD2bDo3TK9hQ5ohGzcOcHWVLTxmZ/jRjFncTz/RONCvv0ptrq50TM+cOcBjj8kXG7NPnIiYxVy8SGfD79tn2D5oENUNatFCnriY/eNExGrs5k1g4UJg7VoqWq/37LM0EN2jh3yxMWXgRMTMVlJCyWfhQiAvT2r386Md8yNG8FogZhxORMxkQgBffSVtQtVzd6dHs6goWpzImLE4ESlAxel7uZ06RQPRCQlSm0oFREbSqujHH5cvNqZcPH2vIHJO31+9SlPxW7dSj0ivRw8aB3r2WZuGwxwM94hYtW7fpoWHy5cDRUVSe0AAnRn/0ku8IJHVHCciVqmyMuCf/6RtGdeuSe0NGgDz5wNvvUXFyhizBE5E7CEJCTQOdOqU1Fa7NiWfefOARo3ki405Jk5ErNzlyzTrtWePYfuf/0yPZhXqujFmUZyIGPLyqATHmjXAvXtSe/v2dFJGr17yxcacAy83UwBrHTl97x7w8cc08LxqlZSEfHyAjRuBkyc5CTHb4Ol7BbHU9L0QwDff0MLD9HSpvU4dWqQ4cyZQv74FAmbMSPxo5mR+/RWYPh348UfD9hEjgCVLAAeszc8UgBORk7h+HZg7F9i0yXBBYrdutCDRwk99jJmEE5GDKyqiRLN0KS1O1HvqKZoJGzyYFyQy+ck2WH3+PPD661QqNCNDrigcV1kZsH07TbnPnSslIU9PWhGdmgq88gonIWYfbJ6Izp8Hhg0D2rYFPv8c2L8f+OwzW0fh2H7+GQgNpXGf336jNhcXWpB4+TINUjvwcWlMgWyWiComoF27DMcpCgpsFYUyGTt9/3//BwwZAjz3HB3bo9e/P3DmDBAbCzRpYuVgGTOD1afvz5+nxXL/+pdh8qlo4kQ68ZNVr6rp+1u3aMbro4+oWJlemza0IDEiwvaxMmYKqw1WG5OAWM2UlgIbNtAm1Nxcqd3Li2oDvf467RFjzN5Z/D9TTkDWJwSNrUVFARcuSO1qNW1WfecdGpRmTCkslog4AdnOoEFAfLxh21//SnWi7x80y5iiWGSMqGdPw9KhpqpXj+rcsOrl5uajuFgDQAuAujxhYbROKDRU1tAYqxGjEpEQAgVVTG3duwc0bmzxuFil8gE0BZCFWrU8MWYMLVTkkzKYPfPw8IDqEQvWjEpE+tkaxhgzlTGbtM3qEYWEhOB4xYUqANLSaMtAXJzpgY4dS6t9q3rvquTn56Np06bIysoyeje6Ke8v9+uLi4tRXFxc/vX169fRuXNnhIdnICmpocFrX3mFZs8eHCNS0ud9kKP/fh/kqJ/XmB6RUYPVKpXK4A/GxcXloT+ozp2BL7+krQOLFj28aLE6bm7SLE9l7/0onp6eRt9j6vvb2+sBYOfO2jh3zhPTp0uzZnFxVNrj7beB6Gjz/zzt7fWA8/1+ne3zAmaurJ4wYUKV3wsOBnbsAM6do5XUpu5lqu69LcHU97e31wP0Z9qvH62WXrtWGqMrLqYxoxYtaH1Raan9xc+/X8uyt/jN/rzCys6fF2LYMCFUKiGoj/TwNXGiee+t1WoFAKHVai0btJ3KysoSAERWVpZB+61bQsycKYSbm+Gfa5s2Qhw8KFOwFuBsv19n+7wVWX2+paY9pOqo1WrMnz8faifZwan/nA9+Xo0GWLaMHtOGDJHaz50D+vShvWapqbaM1DKc8ffrTJ/XgK0zX2U9pOhoW0ehLGvWrBGtWrUSgYGBRv2N+fPPQoSEGPaOXFyEGD9eiJwcGwXNmAlkq1mdmkozZTdu0OkRzZvLEYWymFKzuqwM2LmTtntkZUntnp7AnDnA5MlcCoTZDy6eryDmFM8vKqITOmJiDCs0+vvTcgsujsbsAa/JdXDu7sDs2VQQ7e9/l5JORoZUu+g//5E3RsY4ETkJHx+qhHn6tOFZZb/8AnTpQtUcMzPli485N4dKRIsXL0Z4eDjc3d3RgHfRVqp9e+DQIeDrrw2PkK5Y37qwUL74ACAxMREDBw6En58fVCoV9u7dK29AVhYTE4OQkBB4eHjAy8sLL7/8Mi5evCh3WDblUImopKQEQ4YMwfjx4+UOxa6pVMCLLwJnz9JJrw3v7xa5e5cKqrVoQSe96nTyxHf79m20b98ea9askScAG0tISMCECRNw9OhRHDp0CKWlpYiIiMDtioN6jk7eSTvr2Lx5s9BoNHKHYTGmTt+b6o8/hJg2TQhXV8Mp/3bthPjhB4v+KJMBEHv27JE3CBvLyckRAERCQoLcodiMQ/WIHNWECROQmppq0uZDUzz2GNW2Tk2lc870zpwB/vQn4M9/BpzsSUFWWq0WANCwYcNHvNJxcCJi5QICaPNsQgLQsaPU/vXXVIh/8mTg5k354nMGQghMmzYN3bp1Q5s2beQOx2bsPhEtWLAAKpWq2uvEiRNyh+lQunenKf0tWwA/P2orLaWTVgICaF1SxdNCmOVMnDgRZ86cwY4dO+QOxabs/oyHiRMnYtiwYdW+pjkvy7a4WrWAUaNoweOKFbSXraiIji6aNo12/S9fDrz8Mi+ItJRJkyZh3759SExMxBNPPCF3ODZl94mocePGaMy1aGVTrx4wbx4thpw9m3pJQtACycGDqfe0cqXhoxwzjRACkyZNwp49e3D48GH4+/vLHZLN2f2jmSkyMzORkpKCzMxM6HQ6pKSkICUlBYVyL4xxAH5+wObNwIkTdFiCXmIiEBICjB4NXL1qmZ9VWFhY/rsDgIyMjPLfqyOaMGECtm3bhi+++AIeHh7Izs5GdnY27ty5I3dotiP3tJ0lRUZGCgAPXfHx8XKHViPWnr43VVmZEHv3ChEQYDjd7+4uxPz5QhQW1uz94+PjK/09RkZGWiJ8u1PZZwUgNm/eLHdoNsObXhXEnE2v1lRSAnz6KfDee0BentTu50dHYI8cySeMMOPwfybMbG5uwJQpNF40ZYp0vPW1a/SoFhICHD4sZ4RMKTgRsRpr2BBYvZpO+33pJan91Cng+efpZNpLl2QLjykAJyJmMYGBwN69wI8/As88I7Xv3Qu0bk3T/hUf4RjT40TELO6FF2h2bdMmKj8C0InAq1bRgsiPP6avGdPjRMSswsUFeP11eiSbNw+oW5fa//iDxpPatKGtIzxVwgBORIoQGxuL4OBghISEyB2KyerXp1m1ixdpFk0vPZ020/7pT8D95ULMifH0vYLY2/S9OU6coLGiI0ekNpWKek/vvw/4+soXG5MP94iYTXXqRLv7v/wSeOopahOCxpNatKBkVFQkb4zM9jgRmSEvLw8jR46ERqOBRqPByJEjcevWrWrvGT169ENVA0JDQ20TsJ1RqWgzbWoq8OGHdEAkQKeMzJ1LJWu3baMjkZhz4ERkhtdeew0pKSk4cOAADhw4gJSUFIysOABShb59++L69evl1/79+20Qrf1Sq4Hp02lB5MSJNMANAL/9RuNJXboYPsIxx8VjRCa6cOECgoODcfToUXTp0gUAcPToUYSFhSEtLQ0tK1akr2D06NG4deuWSYXgi4uLUVxcXP51fn4+mjZtqugxoupcuADMmAF8+61h+yuvUMkR/aMcczzcIzJRcnIyNBpNeRICgNDQUGg0GiQlJVV77+HDh+Hl5YXAwECMGTMGOTk51b4+Jiam/PFPo9GgadOmFvkM9qpVK+Cbb4DvvwfatpXa4+LoezNmUD0k5ng4EZkoOzsbXl5eD7V7eXkhOzu7yvv69euH7du346effsKKFStw/PhxvPDCCwY9ngdFR0dDq9WWX1kVz452YL170/lrn30GeHtTW0kJjSe1aEFF2UpL5Y2RWRYnovtMKUmrqqQkoRCi0na9oUOHYsCAAWjTpg0GDhyI7777Dunp6fj2weeQCtRqNTw9PQ0uZ+HiQsXYLl0C3n2XxpMAIDcXmDABaNcO2L+fF0Q6Cruv0GgrxpakPXPmDH7//feHvnfjxg146//6NoKvry+efPJJXOLdoNXy8AAWLwbGjqWE9MUX1H7hAjBgAPWeVqwwfJRjCiRjLSRFSk1NFQDEsWPHytuOHj0qAIi0tDSj3yc3N1eo1WqxZcsWo+/RarV2URhNTkePChEebliQrVYtIcaOFSI7W+7omLk4EZmhb9++ol27diI5OVkkJyeLtm3bihdffNHgNS1bthS7d+8WQghRUFAgpk+fLpKSkkRGRoaIj48XYWFh4vHHHxf5+flG/1xORKSsTIhdu4Ro3twwIdWvL8SSJUIUFckdITMVJyIz3Lx5UwwfPlx4eHgIDw8PMXz4cJGXl2fwGlQo9VlUVCQiIiJEkyZNhKurq2jWrJmIjIwUmZmZJv1cTkSG7twRYtkyITw8DBNSs2ZCfPEFJSymDLyOSAFiY2MRGxsLnU6H9PR0h11HZK6cHGD+fGDDBsPV2KGhdMJIWJh8sTHjcCJSEEfY9GpN588DUVHAgQOG7UOHAkuXAnz8nf3i6XvmMFq3Br77jq7gYKl91y4gKAiIjgby8+WLj1WNExFzOH37Ar/+SieMNGlCbcXF1CsKCADWr+cFkfaGExFzSLVrA+PG0YLIWbPoxBEAuHGD2p95Bjh4UNYQWQWciJhD02ioJ5SWRmNFeufPU8+pf38qR8LkxYmIOQV/f2DnTuCXX4DOnaX2776j7SJvvUW9JSYPTkQKoOSa1fYmPBxITga2bweaNaM2nY7GkwICgA8+oPEkZls8fa8gPH1vWXfu0MGQS5YAhYVSu78/sGwZ8OqrVE2SWR/3iJjTqluXpvQvXQLGjAFq3f+/ISMD+MtfgG7dgP/8R94YnQUnIub0fHxoVfbp03S8kV5SEpWrHTECyMyULz5nwImIsfvataPqkN98Qwsg9bZvp4L+c+YABQXyxefIOBExVoFKRXWOzpwB1qwBGjWi9rt3qS5SixbAP/5BA9zMcjgRMVYJV1eqBHn5Mp004upK7b//TuNJzz4L/PijvDE6Ek5ECsDT9/Jp0IBqZV+4QKeJ6J05Q+NJAwfSYklWMzx9ryA8fS+/I0foyOz75csBUH3t8eOBBQukRzlmGu4RMWaC554Djh0Dtm4FHn+c2nQ6Gk8KCKD6RyUl8saoRJyIGDNRrVp0Em16OrBwIeDuTu23btF4UnAwsHs3nzBiCk5EjJnJ3R2YO5cWRL7+urQK+7//pfGknj2BkydlDVExOBExVkN+fsCmTZR0evaU2hMTgU6dgMhI4LffZAtPETgRKQDPmilDhw7ATz8BX31F6430tm4FAgOprvbt2/LFZ8941kxBeNZMOUpKaEf/e+8BeXlSu68vbbIdNUra28a4R8SYVbi5AVOm0ILIqVOpYiQAXL9O40mdOgGHD8sZoX3hRMSYFTVsCKxaRRUhX3pJaj99Gnj+eWDQIBrsdnaciMywePFihIeHw93dHQ0aNDDqHiEEFixYAD8/P9StWxc9e/bE+fPnrRsosxuBgcDevTSG9MwzUvvevTTd//bbwB9/yBScHeBEZIaSkhIMGTIE48ePN/qe5cuXY+XKlVizZg2OHz8OHx8f9O7dGwW8ndupPP88rcrevJnGiwA6UWT1aloQ+dFHwL17soYoD5lOmHUImzdvFhqN5pGvKysrEz4+PmLp0qXlbXfv3hUajUasW7euyvvu3r0rtFpt+ZWVlcVHTjuQggIh5s0Tom5dwyOzAwOF+Oor5zoym3tENpCRkYHs7GxERESUt6nVavTo0QNJSUlV3hcTEwONRlN+NW3a1BbhMhupX59m1dLTaRZNLz2dxpN69QJSUmQLz6Y4EdlAdnY2AMDb29ug3dvbu/x7lYmOjoZWqy2/srKyrBonk8cTTwBbtgDHj9NeNr34eCo38re/AdeuyRefLXAium/BggVQqVTVXicqbrk2g+qBSuxCiIfaKlKr1fD09DS4mOPq1AlISADi4oCnn6Y2IWjVdmAgsGgRUFQkb4zWUlvuAOzFxIkTMWzYsGpf07x5c7Pe28fHBwD1jHz1I5QAcnJyHuolMeemUgGDB1OVyNhY2lSr1dKK7Hnz6LjsmBhg+HDHWhDpQB+lZho3boygoKBqrzp16pj13v7+/vDx8cGhQ4fK20pKSpCQkIDw8HBLfQTmQNRqqnt0+TIwcSLVPAKAq1dpPKlLF6qN5Cg4EZkhMzMTKSkpyMzMhE6nQ0pKClJSUlBY4XCsoKAg7NmzBwA9kk2dOhVLlizBnj17cO7cOYwePRru7u547bXX5PoYTAEaNwY++QQ4dw548UWp/cQJoHt3Onvtv/+VLz6LkXvaTokiIyMFgIeu+Pj48tcAEJs3by7/uqysTMyfP1/4+PgItVotunfvLs6ePWvSz9VqtTx97+QOHRKiXTvD6X5XVyGmTxciL0/u6MzHm14VIDY2FrGxsdDpdEhPT+dNr05Op6MFkXPmUDF/vUaNaDnA2LFSsX+l4ESkILz7nlVUUEBHY69YQccd6QUFUcH//v2Vc2Q2jxExplAeHsD77wMXLwIVhxrT0mg8KSICOHtWvvhMwYmIMYVr1oxOoz16FKg4CfvDD7TBduxYoJp1s5VKS6ODAG7etGioVeJHMwXhRzP2KEIAX34JzJwJ/O9/Unv9+kB0NO3yr1u3+vfIy6Mjtm/coGO4jx+n+krWxD0ixhyISgUMGUIHQi5bBuj/viosBGbPpvGjHTuqP2Hk/fcpCQF0kOTChTaIm3tEysE9ImaqnBw6+HH9eqCsTGrv0oUevR5cT3v5MtVHqliKxMUFSE4GrFkynXtECsDF85m5vLyAtWupZ9O3r9R+7BjQtSswdCiQkSG1z5r1cD0knY5OIqk4M2dp3CNSEO4RsZo6cACIiqLStXpublRXu0cP2uNWlago4IMPrBMXJyIF4UTELKG0FNi4kQ6H1I8FAVTgv7S06vtUKtrf1rWr5WPiRzPGnEzt2sCbb1LR/lmzpBmx6pIQQAPco0db52w2TkSMOSmNBli6FDh16tFT+nqXL9MyAEvjRMSYk4uLA+7cMf71n3xC1SMtiRORAvCsGbOWa9dovZGp3niD9rpZCg9WKwgPVjNLe+MN2slvjrFjaX2SJXCPiDEndeoU8Pnn5t+/YQNw8KBlYuFExJiTWrGi+q0exhg82HAJgLk4ETHmpDw8av4eRUWWmUXjUzwYc1Iff0wrqbOzaeC5sJD+acy/6/etqVTVr8Y2FicixpyUmxswcKDp9wlB+87y86m8SL16NY+FE5ECVKxZzZjcVCpaAGnsIkij3pOn75WDp++Zo+LBasaY7DgRMcZkx49mCiKEQEFBATw8PKBSyjkxjBmBExFjTHb8aMYYkx0nIsaY7DgRMcZkx4mIMSY7TkSMMdlxImKMyY4TEWNMdv8Pb4BQGlmPvFQAAAAASUVORK5CYII=\n", "text/plain": [ "Graphics object consisting of 3 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sum( [ arrow( (0,0) , (k.real(),k.imag()) ) for k in autovalores ] ) .show(figsize=3)" ] }, { "cell_type": "markdown", "id": "f303c70e", "metadata": {}, "source": [ "
\n", "Ejercicio 1. 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", "
" ] }, { "cell_type": "code", "execution_count": 21, "id": "c3c07893", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rr}\n", "3.0 & 1.0 \\\\\n", "2.0 & -2.0\n", "\\end{array}\\right)$$" ], "text/plain": [ "[ 3.0 1.0]\n", "[ 2.0 -2.0]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A = matrix(RDF,[[3,1],[2,-2]])\n", "show(A)" ] }, { "cell_type": "code", "execution_count": 22, "id": "a76ac8ca", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-8.0" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.det()" ] }, { "cell_type": "code", "execution_count": 28, "id": "b12be02b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(3.3722813232690143, -2.3722813232690143)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "l1,l2 = A.eigenvalues()\n", "l1,l2" ] }, { "cell_type": "code", "execution_count": 46, "id": "04c54ea6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(3.3722813232690143, [(0.9371641612794526, 0.3488887140814106)], 1),\n", " (-2.3722813232690143, [(-0.18299737893132018, 0.983113401039914)], 1)]" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.eigenvectors_right()" ] }, { "cell_type": "code", "execution_count": 47, "id": "6891a81e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.937164161279453, 0.348888714081411)" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(0.9371641612794526, 0.3488887140814106)" ] }, { "cell_type": "code", "execution_count": 40, "id": "b8ec528d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.9371641612794526, 0.3488887140814106)" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eig = A.eigenvectors_right()\n", "eig[0][1][0]" ] }, { "cell_type": "code", "execution_count": 29, "id": "6df75a16", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((0.9371641612794526, 0.3488887140814106),\n", " (-0.18299737893132018, 0.983113401039914))" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v1,v2 = [v[0] for l,v,m in A.eigenvectors_right()]\n", "v1,v2" ] }, { "cell_type": "code", "execution_count": 41, "id": "8ddcbb97", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0, 0.0)" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A*v1 - l1*v1" ] }, { "cell_type": "code", "execution_count": 43, "id": "f7b2ad75", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-5.551115123125783e-17, 0.0)" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A*v2 - l2*v2" ] }, { "cell_type": "code", "execution_count": 45, "id": "7c33edc9", "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "Graphics object consisting of 2 graphics primitives" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arrow( (0,0), v1) + arrow( (0,0), v2)" ] }, { "cell_type": "code", "execution_count": 82, "id": "98b28641", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((1, 0), (0, 1))" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "e1,e2 = matrix.identity(2)\n", "e1,e2" ] }, { "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": 54, "id": "a69d4638", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", "1 & 2 & 3 \\\\\n", "4 & 5 & -6 \\\\\n", "0 & 0 & 1\n", "\\end{array}\\right)$$" ], "text/plain": [ "[ 1 2 3]\n", "[ 4 5 -6]\n", "[ 0 0 1]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A = matrix([[1,2,3],[4,5,-6],[0,0,1]])\n", "show(A)" ] }, { "cell_type": "code", "execution_count": 53, "id": "a7c19c82", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(9.534201129544496, 9.534201129544496, 10.0, 15.0)" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "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": 67, "id": "06ae8368", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", "0.31803948759292133 & 0.6362731189316753 & 0.06351987574929852 \\\\\n", "-0.9217283411522823 & 0.3257302199434402 & 0.5699408395860324 \\\\\n", "0.9048201217416583 & -0.19433347803322953 & 0.4098664773843099\n", "\\end{array}\\right)$$" ], "text/plain": [ "[ 0.31803948759292133 0.6362731189316753 0.06351987574929852]\n", "[ -0.9217283411522823 0.3257302199434402 0.5699408395860324]\n", "[ 0.9048201217416583 -0.19433347803322953 0.4098664773843099]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A = random_matrix(RDF, 3)\n", "show(A)" ] }, { "cell_type": "code", "execution_count": 68, "id": "03f70460", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2.236711998375239, 0.6388395430405767)" ] }, "execution_count": 68, "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": 72, "id": "5d2de886", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrrr}\n", "1.0 & 0.5 & 0.3333333333333333 & 0.25 \\\\\n", "0.5 & 0.3333333333333333 & 0.25 & 0.2 \\\\\n", "0.3333333333333333 & 0.25 & 0.2 & 0.16666666666666666 \\\\\n", "0.25 & 0.2 & 0.16666666666666666 & 0.14285714285714285\n", "\\end{array}\\right)$$" ], "text/plain": [ "[ 1.0 0.5 0.3333333333333333 0.25]\n", "[ 0.5 0.3333333333333333 0.25 0.2]\n", "[ 0.3333333333333333 0.25 0.2 0.16666666666666666]\n", "[ 0.25 0.2 0.16666666666666666 0.14285714285714285]" ] }, "metadata": {}, "output_type": "display_data" } ], "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": 73, "id": "eb865600", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "15513.738738929662" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "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": 75, "id": "261c03fc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "15513.738738931197" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "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": 76, "id": "3512e8ec", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", "0 & -2 & 0 \\\\\n", "-2 & \\frac{1}{2} & 0 \\\\\n", "2 & -2 & 1\n", "\\end{array}\\right)$$" ], "text/plain": [ "[ 0 -2 0]\n", "[ -2 1/2 0]\n", "[ 2 -2 1]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A = random_matrix(QQ, 3)\n", "show(A)" ] }, { "cell_type": "code", "execution_count": 77, "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[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn [77], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mA\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcondition\u001b[49m(Integer(\u001b[38;5;241m2\u001b[39m))\n", "File \u001b[0;32m/usr/lib/python3/dist-packages/sage/structure/element.pyx:494\u001b[0m, in \u001b[0;36msage.structure.element.Element.__getattr__ (build/cythonized/sage/structure/element.c:4905)\u001b[0;34m()\u001b[0m\n\u001b[1;32m 492\u001b[0m AttributeError: 'LeftZeroSemigroup_with_category.element_class' object has no attribute 'blah_blah'\n\u001b[1;32m 493\u001b[0m \"\"\"\n\u001b[0;32m--> 494\u001b[0m return self.getattr_from_category(name)\n\u001b[1;32m 495\u001b[0m \n\u001b[1;32m 496\u001b[0m cdef getattr_from_category(self, name):\n", "File \u001b[0;32m/usr/lib/python3/dist-packages/sage/structure/element.pyx:507\u001b[0m, in \u001b[0;36msage.structure.element.Element.getattr_from_category (build/cythonized/sage/structure/element.c:5017)\u001b[0;34m()\u001b[0m\n\u001b[1;32m 505\u001b[0m else:\n\u001b[1;32m 506\u001b[0m cls = P._abstract_element_class\n\u001b[0;32m--> 507\u001b[0m return getattr_from_other_class(self, cls, name)\n\u001b[1;32m 508\u001b[0m \n\u001b[1;32m 509\u001b[0m def __dir__(self):\n", "File \u001b[0;32m/usr/lib/python3/dist-packages/sage/cpython/getattr.pyx:361\u001b[0m, in \u001b[0;36msage.cpython.getattr.getattr_from_other_class (build/cythonized/sage/cpython/getattr.c:2768)\u001b[0;34m()\u001b[0m\n\u001b[1;32m 359\u001b[0m dummy_error_message.cls = type(self)\n\u001b[1;32m 360\u001b[0m dummy_error_message.name = name\n\u001b[0;32m--> 361\u001b[0m raise AttributeError(dummy_error_message)\n\u001b[1;32m 362\u001b[0m attribute = attr\n\u001b[1;32m 363\u001b[0m # Check for a descriptor (__get__ in Python)\n", "\u001b[0;31mAttributeError\u001b[0m: 'sage.matrix.matrix_rational_dense.Matrix_rational_dense' object has no attribute 'condition'" ] } ], "source": [ "A.condition(2)" ] }, { "cell_type": "code", "execution_count": 78, "id": "1974ac68", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6.0772466998345065" ] }, "execution_count": 78, "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": [ "
\n", " Ejercicio 1. \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, forman una base. 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", "
" ] }, { "cell_type": "code", "execution_count": 9, "id": "146fb4b9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\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}\\right)$$" ], "text/plain": [ "[ 4 -1 0 1]\n", "[-1 4 0 0]\n", "[ 1 0 5 -1]\n", "[-1 1 1 4]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A = matrix([[4,-1,0,1],[-1,4,0,0],[1,0,5,-1],[-1,1,1,4]])\n", "show(A)" ] }, { "cell_type": "code", "execution_count": 10, "id": "d3eb5c10", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(7.0, 5.469890020958683, 7.0)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.norm(1),A.norm(2),A.norm(oo)" ] }, { "cell_type": "code", "execution_count": 11, "id": "2609f854", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v = vector([1,0,0,0])\n", "(A*v).norm(1)" ] }, { "cell_type": "code", "execution_count": 12, "id": "919327ad", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v = vector([1,1,1,-1])\n", "(A*v).norm(oo)" ] }, { "cell_type": "code", "execution_count": 17, "id": "76aa77dc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((1, 1.061313614664067?, -0.3040629487652186?, -0.2617200798609389?),\n", " (1, -0.2110760161194742?, -0.08523753713346103?, 3.063959508478343?),\n", " (1, -1.905561804862378?, -2.899118553128951?, -0.5383008864844724?),\n", " (1, -0.767332043682216?, 0.9149815390276303?, -0.3537822921329313?))" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B = A.transpose()*A\n", "v1,v2,v3,v4 = [b[0] for l,b,m in B.eigenvectors_right()]\n", "v1,v2,v3,v4" ] }, { "cell_type": "code", "execution_count": 21, "id": "8b6280e4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((0.6612029800113330?, 0.7017437247424805?, -0.2010473278345958?, -0.1730500967328569?),\n", " (0.3094971752943993?, -0.06532743076137235?, -0.02638077697185766?, 0.9482868130904632?),\n", " (0.2739384510137521?, -0.522006649134970?, -0.7941800457493748?, -0.1474613110228860?),\n", " (0.6260829360117611?, -0.4804134988044663?, 0.572854328350979?, -0.2214970561675562?))" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u1 = v1/v1.norm(2)\n", "u2 = v2/v2.norm(2)\n", "u3 = v3/v3.norm(2)\n", "u4 = v4/v4.norm(2)\n", "u1,u2,u3,u4" ] }, { "cell_type": "code", "execution_count": 22, "id": "2c60de91", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2.914385999284149?,\n", " 4.182675517902756?,\n", " 5.009179864781266?,\n", " 5.469890020958684?)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(A*u1).norm(2),(A*u2).norm(2),(A*u3).norm(2),(A*u4).norm(2)" ] }, { "cell_type": "code", "execution_count": null, "id": "68290af3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "a907e045", "metadata": {}, "source": [ "
\n", " Ejercicio 2. \n", " \n", "a) Busca cómo definir en Sage las matrices de Hilbert. Calcula los números de condición 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", "
" ] }, { "cell_type": "code", "execution_count": null, "id": "531fa9a0", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "7f6e6de5", "metadata": {}, "source": [ "
\n", " Ejercicio 3. 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", "
" ] }, { "cell_type": "code", "execution_count": 62, "id": "e59276c3", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rr}\n", "1 & \\frac{1}{30} \\\\\n", "1 & \\frac{1}{31}\n", "\\end{array}\\right) 1.4149738924648174$$" ], "text/plain": [ "[ 1 1/30]\n", "[ 1 1/31] 1.4149738924648174" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A = matrix([[1,1/30],[1,1/31]])\n", "show(A,A.norm(2))" ] }, { "cell_type": "markdown", "id": "8f3ff21c", "metadata": {}, "source": [ "Buscamos $x$ tal que $\\|A x\\|_2 =\\|A\\|_2\\|x\\|_2$. $b$ será $Ax$." ] }, { "cell_type": "code", "execution_count": 63, "id": "6bc5159d", "metadata": {}, "outputs": [], "source": [ "B = A.transpose()*A\n", "B.eigenvectors_right()\n", "v1 = vector([1, -30.49179447447914])\n", "v2 = vector([1, 0.03279570839417060])" ] }, { "cell_type": "code", "execution_count": 64, "id": "5e03d005", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.000759921312280353, 1.41497389246482)" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# El vector que queremos es v2\n", "(A*v1).norm(2)/v1.norm(2),(A*v2).norm(2)/v2.norm(2)" ] }, { "cell_type": "code", "execution_count": 65, "id": "9d15beb8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(1.00109319027981,\\,1.00105792607723\\right)$$" ], "text/plain": [ "(1.00109319027981, 1.00105792607723)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "b = A*v2\n", "show(b)" ] }, { "cell_type": "markdown", "id": "3e4d9a71", "metadata": {}, "source": [ "Buscamos $\\tilde b$ tal que $\\|A^{1} \\tilde b\\|_2 =\\|A^{-1}\\|_2\\|\\tilde b\\|_2$" ] }, { "cell_type": "code", "execution_count": 66, "id": "e823122b", "metadata": {}, "outputs": [], "source": [ "Binversa = A.inverse().transpose()*A.inverse()\n", "Binversa.eigenvectors_right()\n", "u1 = vector([1, 0.999964774305813])\n", "u2 = vector([1, -1.000035226935081])" ] }, { "cell_type": "code", "execution_count": 67, "id": "96045307", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.706726820420727, 1315.92571999228)" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# El vector que queremos es u2\n", "(A.inverse()*u1).norm(2)/u1.norm(2),(A.inverse()*u2).norm(2)/u2.norm(2)" ] }, { "cell_type": "code", "execution_count": 68, "id": "c4af26c9", "metadata": {}, "outputs": [], "source": [ "btilde = u2" ] }, { "cell_type": "markdown", "id": "01cbd536", "metadata": {}, "source": [ "Comprobamos:" ] }, { "cell_type": "code", "execution_count": 69, "id": "80eeaa3e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1.00000000000000, 0.0327957083941743)" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# x\n", "A\\b" ] }, { "cell_type": "code", "execution_count": 70, "id": "91d25857", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-61.0010920349875, 1860.03276104962)" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# x tilde\n", "A\\btilde" ] }, { "cell_type": "code", "execution_count": 71, "id": "a5863bcd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1860.03276104962" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# El error relativo es la norma de x tilde entre la de x\n", "(A\\btilde).norm(2)/(A\\b).norm(2)" ] }, { "cell_type": "markdown", "id": "2929f64c", "metadata": {}, "source": [ "
\n", " Ejercicio 4. 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.\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", "
" ] }, { "cell_type": "code", "execution_count": 73, "id": "a9721e62", "metadata": {}, "outputs": [], "source": [ "b(t) = [cos(t),sin(t)]" ] }, { "cell_type": "code", "execution_count": 76, "id": "e961e5b2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2*cos(t) + 3*sin(t), 4*cos(t) + 5*sin(t))" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = matrix([[2,3],[4,5]])\n", "A*vector(b(t))" ] }, { "cell_type": "code", "execution_count": 77, "id": "b01babf7", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAREAAAHWCAYAAABQeb2CAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA9TElEQVR4nO3dd3hU1dYG8DeAhGIITUQkgIKCEQufRES5YhQLTbFwRREREUEQaVJCMWCECKEJDP1SpNeAVOm9BRBpQiKIQEJJRDJJwCHlfH8sgyDJtLNn5szM+3uePEpmzp6tkMXabe0ATdM0EBE5qYCnO0BE3o1BhIh0YRAhIl0YRIhIFwYRItKFQYSIdGEQISJdGESISBcGEbJK0zSYzWZwTyLlh0GErEpLS0NwcDDS0tI83RUyKAYRItKFQYSIdGEQISJdGESISBcGEcqTyWRCaGgowsLCPN0VMrgA1hMha8xmM4KDg5GamooSJUp4ujtkQMxEiEgXBhEiP7Z+PfDgg0BoKJCe7lwbDCJEfmrBAqBRIyAjA/jlF+DUKefaYRAh8kPr1gEtWwItWgBjxsj37rvPubYYRIj8zNGjQPPmwKuvAtOnAzt2AJUrA+XKOdcegwiRH0lOBho3Bh54AJg/HyhYEFizBmjY0Pk2GUSI/ERODvDBB8D168CKFUBQEPDzzzIX8vrrzrdbSF0XicjIoqNlNWbdOiAkRL73/fcyjHn5ZefbZSZC5Ae2bAG++goYMABo0EC+l5UFzJ0LvP8+UEhHOsEgQuTjLl0C3nsPqF9fAkmu9evltVat9LXPIELkw3LnQTRNso6CBf95bdo04NFHgVq19H0Gg4iPS0xMxAcffIAyZcqgWLFiePLJJ3HgwAFPd4vcZPRoYMMGYPZsoHz5f76flATExgIdOgABAfo+gxOrPuzPP//Ec889h/DwcKxZswblypXDqVOnULJkSU93jdzg6FEgIgLo3v2feZBcU6YARYroH8oAPMXr0/r06YOdO3di+/btTrfBU7zeyWIB6tSRydP9+yVg5MrMBKpUAZo2BSZO1P9ZHM74sB9++AG1a9dG8+bNUa5cOdSqVQtTpkyx+ozFYoHZbL7ti7xPZCRw/LgMY24NIADwww8ynOnYUdGHaeSzAgMDtcDAQC0iIkI7ePCgNnHiRK1IkSLazJkz830mMjJSA3DHV2pqqht7Tnps26ZpAQGa9u23eb/+/POaVq+eus/jcMaHFS5cGLVr18auXbtufu+LL75AXFwcdu/eneczFosFFovl5q/NZjNCQkI4nPESZjPwxBNAxYqyN+TW1RhAhjZhYcCSJcBbb6n5TE6s+rD77rsPoaGht33vkUcewZIlS/J9JjAwEIGBga7uGrlI165ASgqwadOdAQQARowAqlYF3nhD3WcyiPiw5557DidPnrzte/Hx8ahcubKHekSutHy5nMqdNk0O2P3b2bPAokWy7JtXgHGaupERGc2+ffu0QoUKaYMHD9YSEhK0OXPmaMWKFdNmz55tdxupqamcE/ECf/yhaffeq2lNm2paTk7e7+neXdNKldK09HS1n80g4uNWrFih1axZUwsMDNRq1KihTZ482aHnGUS8Q6tWmlaypKYlJub9+tWrmhYUpGl9+qj/bE6sklXcJ2J8q1YBTZrIUOajj/J+z8iRQJ8+wJkzQIUKaj+fQYSsYhAxtqtX5fzLE09IMMlrC3tWlkymvvACMHOm+j5wsxmRF+vRQ6q0T5qU/xmYxYtlUrV7d9f0gaszRF7qxx9lJWbKlH+KDP2bpgFDh8rZmSeecE0/GESIvJDZDLRrJxXJ2rbN/30//ggcOgRs3Oi6vnA4Q+SFevUC/vxTshBrR/mHDAGefhoID3ddX5iJEHmZTZtkDmT8eLnqIT87dgDbtwPLlumvGWINV2fIKq7OGEt6OvDYY3KUf+NGoICVsUTjxrKke+SI9ffpxUyEyIsMGCB1UTdssB4Yfv4ZWL0amDXLtQEEYBAh8hpxcXLl5dChsu/Dmm+/lWylRQvX94vDGbKKwxljyMwEateWqx327rV+xcOvvwLVqwNjxyosPGQFMxHKk8lkgslkQnZ2tqe7QgCGDweOHZNsxNYdMcOGAffcA7Rp456+MRMhq5iJeF5CgkymfvGFBAhrEhOlDEBUFNC7t3v6x30iRAamaUD79sD99wMDB9p+/8iRQLFiwGefubxrN3E4Q2Rg06cDmzfL/bnFill/b3KyVG/v1g1wZ9LITITIoC5dAr78EvjwQ/su3B45UjaVdevm+r7dikGEyKC6dJEyhiNG2H7vH38A48YBn38OlCnj+r7disMZIgNauRJYsACYMwcoW9b2+0ePlnt3XXXc3xquzpBVXJ1xv7Q0IDQUqFlTdp3aOvfy55+ysaxdO1kKdjcOZ4gMpl8/4MoVYMIE+w7OjRkD3Lgh8yeewOEMkYHs2SNzGyNGSHZhS2qqDGXatwfKl3d17/LGTITIIDIzZUjy1FOyscwe48YB169LfRFPYSZCZBAjRwK//CJXXdpzuVRamjzzySfqK7g7gpkIkQH89hswaJAs6z75pH3PjB8vgcRd29vzw9UZsoqrM66naXJvzOHDkoncfbftZzIyZM7k7bdll6oncThD5GFLl8pSbmysfQEEkMBx9apcSOVpzETIKmYirmU2A488IrVCli+375nr1+WkbpMmwNSpru2fPTgnQuRBAwZIRjF2rP3PTJwIpKQAEREu65ZDGEQoTyaTCaGhoQgLC/N0V3zWgQOyRDtoEFCpkn3PZGRI6cPWrW2XSHQXDmfIKg5nXCM7G3jmGdlpun8/cNdd9j03fLhkIPHxMqQxAk6sEnnA+PGSiezaZX8ASU+XIs1t2hgngAAczhC5XWKinI9p316yEXuZTLLNvV8/1/XNGQwiRG7WrRtQtKhccWkvs1nqq37yifVb7zyBwxkiN1qzBli0SOqElCpl/3Njx8pwpm9f1/XNWZxYJas4sarOtWvAo48C1apJzVR778dNTZU5kJYtHVsKdhdmIkRuEhUFXLjgWAABgO++kwBklH0h/8Y5ESI3OHZMlmf79gUeesj+565elZO6HTp49qSuNQwiRC6WkyNBoGpVx0/cjhole0mMcEYmPxzOELnY9OnAjh3Apk1AYKD9z125IkGkY0fPVS2zBzMRIhdKSZGqY61aAeHhjj07cqTsbPVk1TJ7MIgQuVBEhASCmBjHnktJkQnVzz8HypVzTd9U4XCGyEX27JGj+uPGAffe69izuRdW9eypvl+qcZ8IWcV9Is7JzgbCwmQpd98++2qm5kpOln0hX3zh2K5WT2EmQuQCEyYAhw5JNuJIAAFk6FOgANCjh0u6phznRIgUu3QJ6N9frn94+mnHnr1wQYY/Xbq4/05dZzGIUJ5YlMh5PXsChQo5NxSJjpZlYG/JQgDOiZANnBNxzNatwAsvyIRq27aOPXv2rOxmjYw05kG7/DCIkFUMIvbLzARq1QJKlJDNZQUczPM/+QRYsQI4dcr+qu9GwIlVIkW++07ujTlwwPEAkpAAzJgh52u8KYAAzETIBmYi9jl/HqhRA/j4Y2DMGMefb9lShkK//goUKaK+f67ETIRIge7dJYOIinL82aNHgXnzZFnY2wIIwCBCpNu6dVKtbPZsIDjY8ee/+kquxGzTRnnX3IJBhEgHi0XOt7zwAvD++44/v3+/XJ85cyZQuLDy7rkFgwiRDsOHA7/9Bixb5li1slwDBshcSsuWyrvmNgwiRE46cwYYPFiqt4eGOv78jh3A2rXAwoWOb403Eq7OkFVcncnfG28ABw/Ksq6jy7KaJkMgs9m5JWEjYSZC5IQVK4AffpAJVWf2dWzYAGzbBqxc6d0BBODZGb8SHR2NgIAAdO3a1dNd8WrXrskx/VdeAd5+2/HnNU1usXvmGaBRI/X9czdmIn4iLi4OkydPxuOPP+7prni96GggKcnxqx9yrVgBxMUBGzc697zRMBPxA+np6WjZsiWmTJmCUo5cu0Z3SEiQ6yx79XLs6odcOTmyIhMeDrz4ovr+eQKDiB/o1KkTGjdujAYNGni6K15N04DPPgPuv9/5U7YLFwKHD8uqjq/gcMbHzZ8/HwcPHkRcXJxd77dYLLBYLDd/bTabXdU1r/PeezIEmT1bLuR2VFaWHPNv3BioW1d9/zyFmYgPO3fuHLp06YLZs2ejiJ2HMqKjoxEcHHzzKyQkxMW99A4ZGcCCBfLvzm4MmzULiI937nyNkXGfiA9btmwZ3nzzTRS8ZSdTdnY2AgICUKBAAVgsltteA/LOREJCQvx+n0i/flKB/dgxucnOUTduAA8/LMWbFy1S3z9P4nDGh7300ks4cuTIbd9r06YNatSogd69e98RQAAgMDAQgY5c0+YHEhJke3vv3s4FEACYMkUql61erbZvRsAg4sOCgoJQs2bN275XvHhxlClT5o7vU940TYom33ef8/fhZmTIEKZVK+e2xxsdgwiRFStXAmvWAEuXAsWKOdfGmDFyr+6gQWr7ZhScEyGr/PnszPXrwKOPyn6QtWud2xj255/Agw9KFuJMxTNvwEyEKB8xMVL2cM0a53eWDh0qBZz79VPbNyPhEi9RHs6cke3t3bsD1as718aFC5J9dO3q+F283oRBhCgP3bsDpUvLTXbOioqSmqlffqmuX0bE4QzRv/z4o5QsnDfP+esbTp2SZd0hQ4CSJZV2z3A4sUpW+dvEqsUCPPaYnI/ZtMn5uZAPPgA2b5YrIJzZIu9NmIkQ3WL0aOD0aVnSdTaAHD4MzJ0rV0D4egABmImQDf6UieReQNWuHTBqlPPtNG0KnDgBHD8O3HWXuv4ZFTMRor/17ClzIAMHOt/Gzp2yQW3uXP8IIACDCBEAmb+YP1/uf3HmAipAtsj37Qs88QTw7rtq+2dkDCLk9zIzgc6dgWeflQlRZ/34oxRfXrXK+4svO4JBhPyeySTzF3qubsjJASIigHr1gIYN1fbP6BhEKE8mkwkmkwnZ2dme7opLXbwo1cY6dABq1XK+nUWLgEOHgO3bfaP4siO4OkNW+frqTOvWMvyIj5cdqs7IzPznoN6qVWr75w2YiZDf2rkT+P57YPJk5wMIAMyYIYWLFi5U1jWvwkyErPLVTCQ7G6hdGyhUCNizx/m7cK9flwzk+edlWdcfMRMhvzR5ssxh6AkggEzKXroEfP21sq55HWYiZJUvZiIpKVI0+a23gKlTnW8nNVUKDjVvDkycqK5/3saPVrOJRN++sjEsOlpfOyNGyL28Awao6Ze34nCG/Mr+/ZJ9jBkD3HOP8+1cvgyMHCmb1O6/X13/vBGHM2SVLw1ncnKA556T7OHAAZlUdVaXLrJF/vRpfSs7voCZCPmN2bNlInXLFn0B5Lff5Jh/ZCQDCMBMhGzwlUzEbJZaqfXry0E7PVq1AjZskIJDxYur6Z83YyZCfuGbb2Q1JSZGXzs//wzMmQOMH88AkourM+Tz4uOlYlnfvoDe+8kjIoBq1YC2bZV0zScwEyGf162brKD06KGvna1b5Q6ahQv9p+CQPRhEyKetWiWXaC9dqq/eqabJhd61awPvvKOuf76AQYR8lsUiF0c1aAA0a6avrdhYYO9emVD1t6P+tjCIkM8aPVqWY5cv1/eDn5Ul8ymvvAK89JKy7vkMBhHKk7cXJUpKkhvoOncGQkP1tTVjBnDypFxmRXfiPhGyylv3ibRqJTVP4+P13UB37Zoc9a9f33+P+tvCTIR8zq5dsjt16lT9V1iOHSvnZKKilHTNJzETIau8LRPJzgbq1JE5kL179VVdv3IFqFoVaNkSGDdOXR99DTMR8inTp8vhul279F/b8O23Uj/V34/628Idq+Qzrl6VHaWtWgF16+pr69w5KRfQowdw771KuuezGETIZwwcCPz1l2QQKtoKCtK/y9UfcDhDPuHYMZm3GDIEqFBBX1vHj8uy7qhRgBdMA3kcJ1bJKm+YWNU04OWXgbNngSNHgMBAfe29+aYUcT5xQn9b/oCZCHm9ZcuAjRvlnIzeH/pdu6S9WbMYQOzFTISsMnomcv267Eh99FFg5Up9bWmabCozm4GDB/3rUm49mImQVxs+HEhMBNat09/W6tVyl+7q1QwgjmAmQlYZORM5exaoUUPOxwwdqq+t7GzgySeBMmWAzZt5UtcRzETIa/XsCQQHA/37629rzhzg6FEp5MwA4hgGEfJKW7ZIhbHvv5f9HHr89ZfsSn3rLdkyT45hECGvk5Ul977UrSvnWvSaMAE4f15O/ZLjGETI60yeLPtB9u3TPwGamgoMHiyFl2vUUNM/f8M5aMqTyWRCaGgowsLCPN2V2/zxh8yBtG0r9U71GjZMaoZERupvy19xdYasMtrqzOefy0awhASgXDl9bSUmSsGhbt0kGyHncDhDXuPoUZm/iInRH0AAyT6KFwd69dLflj9jECGvoGlSub1aNclG9Dp2TGqPjBoly8TkPAYR8go//CDnY1auBAoX1t9enz5AlSpAhw762/J3DCJkeBaL1PV49VWgUSP97W3dKsFo/nw1AcnfMYiQ4X33HXDmDLBihf7dpJomO13DwoDmzZV0z+8xiJChXbwIfPMN0KkT8Mgj+ttbtAiIi5PzMTxkpwaXeMkqTy/xtm0rN9glJAClSulr68YNKRtQo4b+sgH0D2YiZFgHDsgKyrhx+gMIAEyaJNdqLlumvy36BzMRsspTmYimAf/5j2xL/+knoJDOv+7MZrlD5vXXgf/9T00fSTATIUNasADYuRPYsEF/AAFke3t6OjBokP626HacWvJh0dHRCAsLQ1BQEMqVK4dmzZrh5MmTnu6WTdeuyS7SZs2Al17S315SEjBypGxvr1hRf3t0OwYRH7Z161Z06tQJe/bswfr165GVlYVXXnkFGRkZnu6aVTExwKVLUvpQhchIoFgxoHdvNe3R7Tgn4keSk5NRrlw5bN26Fc8//7xdz7h7TuTcOaB6deCLL9RcQnX8OPDYY5KJdOmivz26E+dE/EhqaioAoHTp0vm+x2KxwGKx3Py12Wx2eb9u1bu3nGXp109Ne336AJUrc3u7K3E44yc0TUP37t1Rr1491KxZM9/3RUdHIzg4+OZXSEiI2/q4cycwb57cYqe35CEAbNsmu1yHDOEdMq7E4Yyf6NSpE1atWoUdO3agopXZxbwykZCQEJcPZ3JygKefln9XUbFM06R8YnY2sHcvd6e6EoczfqBz58744YcfsG3bNqsBBAACAwMR6IG/tmfOlM1lO3ao+YFfskSCx6ZNDCCuxkzEh2mahs6dOyM2NhZbtmzBQw895HAb7phYNZuBhx8GXnwRmDtXf3uZmbK9/eGH5WpNci1mIj6sU6dOmDt3LpYvX46goCBcvHgRABAcHIyiRYt6uHf/GDJEAoneC6hyTZ4MnDoFLF2qpj2yjpmIDwvI59z89OnT8dFHH9nVhqszkVOnJGvo21dNsWSzWaqfNWkCTJumvz2yjZmID/OGvx++/BK4916p8aHC8OFAWhrw9ddq2iPbGETIYzZulBO18+bJjlK9LlwARoyQWqzc3u4+HM6QVa4azmRlAbVqycay7dvV3H/bvj2weLEMkUqW1N8e2YeZCHnE5MlScT0uTk0A+eUXYOpUyUQYQNyLmQhZ5YpM5MoVWX594w11tT2aNQN+/hk4cYK7U92NmQi53aBBUqpQ1a1zO3ZICcW5cxlAPIGZCFmlOhM5fhx4/HHZG6Li5jlNA559VjaYqdguT45jJkJuo2lSGKhKFXXH8pcuBfbskZUeBhDPYBAht1m1Cli3TpZ1VQw7MjOBiAigYUPZMk+ewSBCbnHjBtC9O9CggRRLVmHKFODXX2VZlzyHQYTcYuzYf86zqFjSTUuTCdrWrWWOhTyHo0jKk8lkQmhoKMLCwnS3dfmybEP/7DPASj0kh8TEyHUS3N7ueVydIatUrM58+qkMORISgDJl9PcpMRF46CGZnI2O1t8e6cPhDLnUoUOyk/S779QEEAD46iugeHGpn0qexyBCLqNpchiuRg11hZIPH5arNceMkXM35HkMIuQysbHA1q3A2rXAXXepabNXL6kX0r69mvZIPwYRcgmLRWqENGoEvPqqmjbXrQN+/FFWeFQFJdKPQYRcYswY4PffgZUr1bSXnS1BqV49OWxHxsEgQspdugRERQEdOwKPPKKmze+/l/mQPXvU7DMhdbjES1Y5s8Tbvj2waJG6Jd2MDCkd8J//APPn62+P1GImQkodPixLuiNHqlvSHTUKSEnhnhCjYiZCVjmSiWga8PLLwPnzwJEjaiY/L16U1ZgOHaQIMxkPMxFSZsUKOZK/YoW61ZOBA4HChdVd8E3qMYiQEjduyPUPL78MNG6sps3jx2VoFBMDlCqlpk1Sj0GElDCZ1J7SBYDevYFKlWSVh4yLQYR0S0mR07SffqrulO7mzbLHZMEC1k01Ok6sklX2TKx+/jkwa5YUCLrnHv2fmZMDhIXJvMru3dwXYnTMREiX48eBiROBb79VE0AAqdp+8KBUcWcAMT5mIpQnk8kEk8mE7OxsxMfH55uJNGwom8qOHVMz7Lh+XU791q4NLFmivz1yPQYRssracGbNGjlgt3Qp8Oabaj5v6FCgf3/JcB56SE2b5FoMImRVfkEkM1Nqm5YvD2zapGbYkZwsG8tat5YDfOQdOCdCTpk0CTh5Epg3T928RVSU/POrr9S0R+7BQs3ksD//BCIjgY8/Bp58Uk2b8fHAhAlA375A2bJq2iT3YBAhh339texQ/eYbdW326QNUqAB88YW6Nsk9OJwhh5w8CYwbJ4GkfHk1be7YIaUUZ88GihZV0ya5DydWyap/T6w2bSondE+cAIoU0d++pgHPPANkZQFxcbxP1xsxEyG7rV8vW9EXLlQTQABpa98+WeFhAPFOzETIqtxM5I8/UlG/fgmULAls26ZmRcZikfKJjz4q5QPIOzETIbvMnAkcPSpDDlVLuiYTcPYssGqVmvbIM5iJkFW5mUjp0qlo0qQEZs5U0+6VK0DVqkCLFrK0S96Lo1Cyy/XrwJAh6tobPFgmUwcOVNcmeQaDCFl1+rT8s2tX4P771bU5dqwUHbr3XjVtkudwOENWNWtmxvLlwbhwIRXly9t3ZYQtLVoA27fL6d9ixZQ0SR7EiVXK144dwPLl8u+qftj37JFqZdOmMYD4CmYilKecHNkElplpxqFDjl1elR9Nkwuo0tKk6FDBgoo6Sx7FTITy9PHH6xEX9zJCQtopa3PpUmDnTrmUmwHEdzAToTtcuwZUry51TmfMcPwazbxYLEBoqLS7erXCzpLHMROhO4waJZdyDx2qrs1x44Dff+fOVF/EJV66zcWLUnT588/VlSdMSZGCQ59+KtkI+RYGEbrNV1/JtZUDBqhr8+uvZVKVG8t8E4czdNPhw8D//ifDGVXXVp44AYwfL7tdy5VT0yYZCydWCYBkCq+8Igfijh7950Juey6vsub11yU4qao/QsbDTIQAyPUPGzbI5rLcAKLXpk0ykTp/PgOIL2MmQjevf7jvPmDjxtuP+jubiWRnywVURYoAu3bxJjtfxkyEMGWK1E6dO1fdD/v33wOHDvEuXX/ATMTPpabKhVFNm8p5ln9zJhNJTwcefhh4/nkZypBv4xKvnxsyRHaoqrz+YfhwKTr07bfq2iTjYhDxY7/9BoweDfTqJXe+qJCYCAwbJvVHqlRR0yYZG4czfuzdd+W4f3w8ULx43u9xdDjz0UdyNiYhAQgOVttfMiZOrPqpXbvkuoYZM/IPII46cEAKOo8fzwDiT5iJ+KGcHKBuXfsujLI3E9E0IDwcuHxZNpcV4l9PfsOu32pN05CWlubqvpCbLFokF0atXCkrKbeyWCywWCw3f537+242m622uWoVsHUrsHixTNSSbwgKCkKAjTV6uzKR3L+NiMi/2DMXZlcQyS8TCQsLQ1xcXJ7POPqa2WxGSEgIzp07l2enVX6Wte+7oh/OPONsP2x9VosWcRg8WIYxVave+dy/M5ELFy7g6aefxvHjx3H/v8q95z4zYQIQESFVyx591Pn/5vxec/efDaP0wwh/Ru3JROwazgQEBOTZ2YIFC+YbpZx9rUSJEm75LGvPqO6Hs313ph/W2tO0chg1qgQ6dwZq1XKsH0FBQXe8XrBgQWRllcDQocAnn8g8iz3tGf3PhlH6YZQ/o7bo2ifSqVMn5a+567Oc6YMrPkt1P6y1V67cBBQqlHetEGd/T775Rs7efP21/e0Z/c+GUfphlD+jNmkGkZqaqgHQUlNT2Q8X9OPIEU0rUEDTRo927Llz585pALRz587d8Vp8vKbddZemDR6spIv58tXfE2/vRy7D7FgNDAxEZGQkAgMD2Q8X9OPLL2UO5LPPHO/Hrf+8Ve/eQPnyQLduKnpovQ+++Hvi7f3IxX0ifmDtWqBhQyA2FmjWzLFn89snsnUr8MILwOzZQMuWSrtLXoZBxMdlZQFPPAHccw+webPjx/LzCiI5OcDTT8smtT17rG9WI9/HfYU+bupU4JdfgFmz1NX1mDNHtrhv384AQsxEfJrZLLVCGjWSMzLOtXF7JnLtmtQKqVtXdr4S8e8RHxYdLdvaBw9W1+aIEXI+hrVCKJdhg8jrr7+OSpUqoUiRIrjvvvvQqlUrJCUlue3zz5w5g7Zt2+KBBx5A0aJFUbVqVURGRuLGjRtu60OuwYMH49lnn0WxYsVQsmRJu575/Xe5+qFnT+BfG02dduGC3Ir3xRe373Z1pW3btqFp06aoUKECAgICsGzZMvd88C2io6MRFhaGoKAglCtXDs2aNcPJkyfd3o8JEybg8ccfv7nJrG7dulizZo3b+/Fvhg0i4eHhWLhwIU6ePIklS5bg1KlTeOedd9z2+SdOnEBOTg4mTZqEY8eOYdSoUZg4cSL69u3rtj7kunHjBpo3b47PHFif7ddP7o7p2VNdPwYMkMLL/fura9OWjIwMPPHEExg3bpz7PvRftm7dik6dOmHPnj1Yv349srKy8MorryAjI8Ot/ahYsSK+/fZb7N+/H/v378eLL76IN954A8eOHXNrP+7gyU0qjli+fLkWEBCg3bhxw2N9GDZsmPbAAw947POnT5+uBQcH23xfXJymAZo2ZYr+z8zd2LRjR6oWEKBpY8fqb9NZALTY2FjPdeBvly9f1gBoW7du9XRXtFKlSmlTp071aB+8YnXmypUrmDNnDp599lncpepSFCekpqaidOnSHvt8e2iabCyrWRNo00Zdu/36yYRq+/bq2vRWqampAODRPwvZ2dlYtGgRMjIyUPfWQ0seYNjhDAD07t0bxYsXR5kyZXD27FksX77cY305deoUxo4diw4dOnisD/ZYsUI2gsXEAAULqms3t00PxnBD0DQN3bt3R7169VCzZk23f/6RI0dw9913IzAwEB06dEBsbCxCPX1LujvTnsjISA2A1a+4uLib709OTtZOnjyprVu3Tnvuuee0Ro0aaTk5OW7tg6ZpWmJiolatWjWtbdu2uj5bbz9sDWdu3NC06tU17eWXNU3n/6abUlJkOPP886nK2nQWDDCc6dixo1a5cuU8zxK5g8Vi0RISErS4uDitT58+WtmyZbVjx455pC+53LpPJCUlBSkpKVbfU6VKFRTJ487F8+fPIyQkBLt27dKVvjnah6SkJISHh6NOnTqYMWMGCijaXeXM/4sZM2aga9euuHr1ap7vHz8e+Pxz4KefZJeqHiaTCSaTCSkpbyI5eQi2b09FvXrOHRVXJSAgALGxsWjm6N59RTp37oxly5Zh27ZteOCBBzzSh39r0KABqlatikmTJnmsD26dEylbtizKli3r1LO5se7Wgjmu7kNiYiLCw8Px1FNPYfr06coCiKP9sEdqKhAZKdXW9QYQQI6Gt2zZCQ8+aAYwBI8/rr9Nb6VpGjp37ozY2Fhs2bLFMAEEkL7p/ZnQy5ATq/v27cO+fftQr149lCpVCqdPn8ZXX32FqlWrum0SKSkpCS+88AIqVaqE4cOHIzk5+eZr5cuXd0sfcp09exZXrlzB2bNnkZ2djUOHDgEAqlWrhrvvvhuA7N/IyACiotR97uDBwF9/qWvPGenp6fj1119v/vq3337DoUOHULp0aVSqVMktfejUqRPmzp2L5cuXIygoCBcvXgQABAcHo2jRom7pAwD07dsXDRs2REhICNLS0jB//nxs2bIFa9eudVsf8uTRwVQ+Dh8+rIWHh2ulS5fWAgMDtSpVqmgdOnTQzp8/77Y+TJ8+Pd+5Cndr3bp1nv3YvHmzpmma9vvvmlakiKYNGKDuM0+d0rTChTUtIsKztSs2b96c539769at3daH/P4cTJ8+3W190DRN+/jjj7XKlStrhQsX1u655x7tpZde0tatW+fWPuSFZ2d8QKtWwPr1cmFUUJCaNv/7X7mbJi7OjAoVHLuLl/yLIYczZL8DB6Smx6RJ6gLIjh1yuE7lxVbku5iJeDFNA158UQ7E/fyzmgujcmuFAHI3TXq6Y9dokv9hJuLFVq4EtmyRi6NU3Tg3axZrhZBjmIl4qcxM4LHHgIoVZT5ERcGh9HTZ2v6f/wALFsj3HL3Qm/wPMxEvNXUqEB8PzJ+vrmLZsGHAlSuyXExkLyasXshslo1lH34IPPmkmjbPnpWzMT16AFWqqGmT/AODiBcaOhRISwO++UZdm336ACVLyj+JHMHhjJc5dw4YOVIyhooV1bS5axcwbx4wbZq6ZWLyH5xY9TKtW8s9Mr/+quYHPidHii5nZgL799+5IsOJVbKFmYgXOXhQlmDHj1eXMcydK/tBtm7lki45h5mIl9A04KWXpFjykSNq9oVkZADVqwPPPAMsXpz3e5iJkC3MRLzEqlVyg92KFeo2lsXEAMnJsrRL5CwmsF4gK0uqtoeHA40bq2nz3DkJHt26AQ8+eOfrJpMJoaGhCAsLU/OB5LM4nPECEycCHTvKxOf//Z+aNj/44J+Tv9ZGKRzOkC0czhhc7sayVq3UBZC9e+U+3SlTrAcQIntwOGNww4ZJIFG1sUzTgK5dpYSiyislyH8xEzGw8+fl7tvu3YGQEDVtzp8P7NkDbNqk9koJ8l+cEzGwjz4CVq+WjWUqhh3XrgE1agBPPQXExtr3DOdEyBZmIgb100/A998DJpO6eYsRI4CLF2Vpl0gVZiIGpGlAgwZAUhJw+LCaW+cSE6VWSMeOjgURZiJkCzMRA1qzRuYsli9Xd21l375SL7V/fzXtEeViEDGY7GygVy+gfn2gaVM1bcbFydBo4kQgOFhNm0S5GEQMZuZM4Ngx2cuhomJZ7pLuY48Bbdvqb4/o3xhEDOTaNWDAAODdd/+puK7XwoVSL2TDBnVnbohuxc1mBjJ6tByIGzxYTXvXrwO9ewOvvy4ngIlcgX83GURyMvDtt7J6UrWqmjZHjZJVmXXr1LRHlBdmIgYRFSVzIKpWTy5cAIYMATp3lqVdIldhEDGAX38FJkwAIiKAsmXVtNmvH1CkiMyxELkShzMG0LcvUL480KWLmvYOHJB7dMeNA0qVUtMmUX4YRDxs7165PHv6dKBoUf3taZoUGnrkEeDTT51vx2QywWQyITs7W3+nyKdx27sHaZpsKrt6Vc7KqDhVu3gx0Lw58OOPwCuv6G+P297JFmYiHrRihVycvXatmgDy119SRrFxYzUBhMgeDCIekpUlezgaNFD3Az96tNQgWbNGTXtE9mAQ8ZBp04ATJ+TeFxXb2y9ckE1qHTtKzRAid+GciAekpwMPPSRZyKxZatps00aGRwkJaldkOCdCtjAT8YCRI4ErV9TVTY2LkyXd8eO5pEvux0zEzS5dkm3tn32mpsKYpgHPPSfZzcGD6g/ZMRMhW5iJuNmgQUDhwrLBTIV584Ddu4GNG3lKlzyDf+zc6MQJYPJkYOhQNcOOjAwpYPTWW8CLL+pvj8gZPDvjRhERQMWKQKdOatobOhRISWHhZfIsZiJusmMHsGwZMHu2HIzT68wZCR49euR9ly6RuzATcQNNk52k//d/wHvvqWmzVy8ZEkVE5P36mTNn0LZtWzzwwAMoWrQoqlatisjISNy4cUNNB4j+xkzEDZYulVvnNm4ECigI21u3yqG9mTOBu+/O+z0nTpxATk4OJk2ahGrVquHo0aNo164dMjIyMHz4cP2dIPobl3hdLDMTCA2VzWWrV+tvLzsbqF1bVnh273YsKMXExGDChAk4ffq03c9wiZdsYSbiYpMnA6dOSTaiwrRpwKFDjgcQAEhNTUXp0qXVdITobwwiLmQ2y76Qjz6SKxv0unpVKpa1agU884xjz546dQpjx47FiBEjrL7PYrHAYrHc/LXZbHaip+RPOLHqQjExQFoa8PXXatqLigKuXr2BWbPuR0BAQL5f+/fvv+25pKQkvPbaa2jevDk++eQTq58RHR2N4ODgm18hISFqOk8+i3MiLpKUBFSrJhdHDRmiv72TJ4GaNYFevTLQqtU5q++tUqUKivy9jpyUlITw8HDUqVMHM2bMQAEbY6C8MpGQkBDOiVC+GERcpF07IDZW5kNUXF3ZuDFw/Djwyy/27zNJTExEeHg4nnrqKcyePRsFnah8xIlVsoVzIi5w7JhMgI4apSaArF4tX0uW2B9AkpKS8MILL6BSpUoYPnw4kpOTb75Wvnx5/Z0i+hszERdo2lQyhuPHZSlWj8xMmZStUEH2mdhbwGjGjBlo06ZNnq858lvOTIRs4cSqYlu2ACtXAtHR+gMIAJhMUmho9GjHKqB99NFH0DQtzy8ilZiJKKRpQJ068sO+Z4/+sofJybJJ7f33peCQJzATIVs4J6LQ4sVSZWzLFjV1UwcMkHZULRETuQKDiCKZmVJoqHFjuUtGr0OHZLfrqFHqrtYkcgUGEUWmTlW3vV3TZH9J9epSvZ3IyBhEFEhPl+3tH36oZnv7kiVyUnftWuCuu/S3R+RKXJ1RYNQoOdeiYu7i+nXgyy+BJk2AV1/V3x6RqzET0Sk5GRg2DPj8c6BSJf3tjRghW+bXrdPfFpE7MBPR6Ztv5B7d/CqMOSIxUfaXdOkCPPyw/vaI3IFBRIfTp4EJE4A+fYAyZfS316ePVCrr319/W0TuwuGMDgMGAPfcA3zxhf62du+WIs5Tp6o5b0PkLgwiTvrpJ7mMe/JkoFgxfW3l5EggqlVLChgZgclkgslkQnZ2tqe7QgbHbe9Oeu01ubbh6FH9N8/973/AJ5/ItRLPPaeke8pw2zvZwkzECRs3Aj/+KBvL9AaQq1dlUvaDD4wXQIjswUzEQTk5wNNPyyawXbv0n5Hp1g2YMgWIj5fj/kbDTIRsYSbioMWLgQMHZEep3gBy/DgwdiwweLAxAwiRPZiJOCAzE3jkEflasUJfW5oGvPwy8PvvMq8SGKimj6oxEyFbmIk4YMoU2RuybJn+tmJjZW5l5UrjBhAiezATsVN6OlC1KtCoETB9ur62rl+XbKZmTQkiRsZMhGxhJmKnkSOB1FQ5ratXTIycj1m/Xn9bRJ7Gbe92uHxZfvA7d9Z/yO733+V8TPfuUvqQyNsxiNhB5SG7nj2BUqXkOkwiX8DhjA2nTwMTJ0qtEL13YW/eDCxaBMyaBQQFqekfkadxYtWGli2l8HJCgr4zMllZcjamRAnZ3q6ikLM7cGKVbGEmYkXuIbspU/QfspswQW7G27/fewIIkT2YiVjx6qvA2bPAkSP6zsgkJ0uRof/+F5g0SV3/3IGZCNnCTCQfGzZIicLYWP2H7HKLDH3zjf5+ERkNM5E85B6yK1wY2LlT3/Dj4EGgdm3gu+9kidjbMBMhW5iJ5GHRIjlkt22bvgCiaRI4QkOBzz5T1z93YFEishczkX+5cUN+6ENDgR9+0NfW7NlAq1bApk1AeLia/rkbMxGyhZnIv0yZAvz2m/5DdmlpQK9eQPPm3htAiOzBHau3SE8HoqIke6hZU19bgwdL1bKYGCVdIzIsBpFbfPcd8Oef+g/ZJSTIgb0+fYDKldX0jcioOCfytz/+AB58EGjTBhg9Wl9bTZpIoaFffgGKFlXSPY/hnAjZwjmRvw0dKku7ffvqa2fVKvlassT7AwiRPTicgVxfOXasHM8vV875diwWoGtX4KWXgDffVNY9IkNjJgI5oVu8ONCjh752Ro+WlZ3ly3k+hvyH3weRhAS5PGrYMDlh66ykJFnZyd1cRuQv/H5itUUL2dqekAAUKeJ8O61ayYVW8fFAyZLKuudxnFglW/w6E/npJ2DBAslE9ASQnTv/uYzblwIIkT38OhNp2FDu09Vz1D87GwgLk/KJe/cCBXxsqpqZCNnit5nI1q3A2rVyo52eo/7/+59kNLt3+14AIbKHX2YimiaXZ2dmAvv2Ob+S8uefUrG9SRNgxgylXTQMZiJki19mIitWSOawfr2+pdgBA+TUb3S0ur4ReRu/CyLZ2XJdw4svAg0aON/OoUNSNzUmBrjvPmXdI/I6fhdE5s6Vcy179zrfRk4O0KkTUKOGd1YrsweLEpG9/GpO5MYNoHp1ubph6VLn2/n+e6B1a+8uNmQvzomQLX6ViUyeLNXbV61yvo3UVCk29O67vh9AiOzhN4uS6elSbf3DD/VtS4+MlLaGD1fXNyJv5jeZSG7BoYEDnW/jyBFg3DhgyBCgYkVlXSPyan4xJ5JbcOjjj4FRo5xrQ9OA+vXlIqqff5brJPwB50TIFr/IRFQUHJo7F9i+XfaW+EsAIbKHz8+J5BYc6tEDuOce59owm4EvvwTeeUff3hIiX+TzQSS34FD37s63MWiQBJKRI9X1i8hX+PRwJj5eDsjFxDhfcOjYMZmUjYoCQkLU9o/IF/j0xGqLFsCuXRJMnKkXommyPT4xUVZmAgPV99HoOLFKtvhsJqKi4NCCBcCWLVIywB8DCJE9fDYTadQIOH1azsk4Uy8kLU3OxtSpo2+LvLdjJkK2+OTE6s6dwJo1MqnqbMGhqCjZnObsvhIjsVgsePLJJxEQEIBDhw55ujvkY3wuiGiaHPV/4glZknXGL79I8Ojb1zeuwezVqxcqVKjg6W6Qj/K5ILJxo5Q+/OYb58oVapoc769cWfaGeLs1a9Zg3bp1GM7DPuQiPjWxmpuF1KkDNG7sXBtLlkggWrVKXwV4I7h06RLatWuHZcuWoVixYnY9Y7FYYLFYbv7abDa7qnvkI3wqE1mxQmqmDh7sXNnDjAzZlNa0qUzMejNN0/DRRx+hQ4cOqF27tt3PRUdHIzg4+OZXCDfHkA0+E0RycqTmaXi43IXrjMGDgcuX5TpMoxo4cCACAgKsfu3fvx9jx46F2WxGRESEQ+1HREQgNTX15te5c+dc9F9CvsJnlnjnzwfee09WZp591vHn4+OBmjVlMlVPuQBXS0lJQUpKitX3VKlSBS1atMCKFSsQcEtKlp2djYIFC6Jly5aYOXOmXZ/HJV6yxSeCSFYW8OijQLVqzlUt0zS5yCo+Xra5Fy2qvo/udvbs2dvmM5KSkvDqq69i8eLFqFOnDiraWRCFQYRs8YmJ1VmzJADMn+/c88uWyT26y5f7RgABgEqVKt3267vvvhsAULVqVbsDCJE9vH5OxGKRU7bvvCMFmB117RrQtatMpDZtqrx7RD7P6zORqVOBc+dkh6ozoqOBixdlWVfPRVZGV6VKFfjAyJUMyKszkWvXZFPZBx8Ajzzi+PPx8cCwYUDv3jKfQkSO8+ogYjIBKSlSgd1RmiYXUN1/P+DgKigR3cJrhzNmM/Dtt0DbtlKE2VELFwIbNshqjq9MphJ5gtdmIqNHyw7T/v0df9ZsBrp1A956y/t3phJ5mlcGkStXgBEjgI4dnbv/JTJSAomRd6YSeQuvHM4MGwZkZwN9+jj+7KFDwJgxMhTisRAi/bxux+rFizIH0q2bnHVxRE4OUK+e3Kd76BBw110u6aJP4Y5VssXrMpEhQ+TyKGdqfUyfDuzeLfVGGECI1PCqOZGzZ4FJk4CePYFSpRx7NiUF6NVLLvR+/nnX9I/IH3lVEImKkvtjunRx/NmICBnODBumvl9E/sxrgsipUzIc6dMH+Pssmd1275bt8UOGAPfe65r++RqTyYTQ0FCEhYV5uitkcF4zsdqmjdz/cuoUYGelPwBSJqB2bZkD2bMHKFjQdX30RZxYJVu8YmI1IQH4/nu5C9eRAAIA48YBhw9L2UQGECL1vGI4ExUFlC8PfPqpY88lJkrJxM8+k2yEiNQzfCZy4gQwZ45sEHP0jEuPHpK5OLqfhIjsZ/gg8vXXQIUKwCefOPbc+vVyl+6sWUDJki7pGhHB4EHk+HEpeTh+vGMXalsscsy/fn2gZUvX9Y+IDB5EBg2S8y0ff+zYczExwG+/Se1UX65WRmQEhg0iR45IzY/Jk2Wbu71On5Y5kB49gNBQ1/WPiIRh94m88w5w8CBw8qT951w0DWjSRALQL78AxYu7to/+gPtEyBZDZiKHDsmduNOmOXZQbvlyYPVqIDaWAYTIXQyZibz5pmQTJ04AhewMc2lpMnx5/HFg5UrOhajCTIRsMVwmcuCATIjOnGl/AAGkWtkff0jxZgYQIvcxXBAZOBB4+GHg/fftf+bgQeC776RaWZUqruoZEeXFUEEkLk6GIrNn25+FZGcD7dvLXbxdu7q0e0SUB0MFkchIoEYNoEUL+58ZP16GQDt3sloZkScYJojs3i1XYc6fb/9p2/PngX79gA4dgLp1Xds/IsqbYVZnXn1VTt0ePgwUsPNs8dtvA7t2yZ4Qno9Ry2QywWQyITs7G/Hx8VydoXwZIojs3g08+6zsUG3e3L5nVqwAXn9dMpd333Vt//wZl3jJFkMEkUaNgN9/l70h9mQh6ekykRoaKpvLuKTrOgwiZIvH50Ti4mQuZN48+4cxAwcCyckyqcoAQuRZHg8iUVFA9er2D2N++kmuvxw8GHjgAZd2jYjs4NEg8tNPMrcxa5Z9KzK5e0IeeQTo3t31/SMi2zwaRKKigGrV7N8XMnGiDH+4J4TIODwWRA4fltO206bZtzs1KUkuoGrfXlZyiMgYPLY689//SlYRH29fVtG8ObB9u+wJcfQKTXIeV2fIFo9kIseOAYsXy7269gSQH36Q98+dywBCZDQeyUTefx/YsQP49VfbpQ9TU2VPyBNPsE6IJzATIVvcnomcOCG7TE0m+2qnRkRIIJkwgQGEyIjcHkSGDJF7ZOyp4L5jhwSPsWOBSpVc3zcicpxbg8ipU3Kb3ejRtu+R+esvubCqbl25BpOIjMmtQWTYMKBsWftusxs8WK5/WLqUF3ETGZnbLvROSgJmzAC6dbN9p+6RI1LqsF8/3h1DZHRuW5358ktg6lQ5rRscnP/7srNlM1l6utROdeT6TFKPqzNki1uGM1euyJb1Ll2sBxBAJlFzt7YzgHjOrUWJiKxxSyYyaJAMT37/HShXLv/3nTkje0LatgXGjHF1r8gezETIFpfPiaSnS0Bo1856ANE0ORdTpoxMqhKRd3D5cGbKFMBsljkRa2bPBtatk0plQUGu7hURqeLS4YzFAjz4IPDyy7Iyk5/Ll6VGyGuvyT4SMg4OZ8gWlw5nZs0CLlwAeve2/r4uXWRL++jRruwNEbmCy4Yz2dmyuezNNyXLyM+SJXKWZs4c4J57XNUbInIVlwWRJUuAhAQ5vp+f5GTZ0t6sGfDee67qCRG5kkvmRDQNePppoEQJYOPG/N/37rvy+rFjwL33qu4FqcA5EbLFJZnI9u3A/v2y0pKfRYvksqp58xhAiLyZSzKRN96QgkNHj+ZdA+TyZdlU9vzzUrGMdUKMi5kI2aI8E4mPl2sgpkzJPzh06iRDHl4+ReT9lC/xjholqywtW+b9+sKFkn2MH89hjDusWrUKderUQdGiRVG2bFm89dZbnu4S+RilmUhKimwqi4gAihS58/VLl4COHYF33pFq7+RaS5YsQbt27TBkyBC8+OKL0DQNR44c8XS3yMcoDSITJsg/86pEpmkSQAICpL4quVZWVha6dOmCmJgYtG3b9ub3q1ev7sFekS9SNpz56y9g3Digdeu8N40tWCBVysaPt34Qj9Q4ePAgEhMTUaBAAdSqVQv33XcfGjZsiGPHjnm6a+RjlAWRhQtl1aVbtztfO3dOspP//tf+i7tJn9OnTwMABg4ciP79+2PlypUoVaoU6tevjytXruT7nMVigdlsvu2LyBplQWT8eOCVV4B/Z8vZ2cCHHwJ33/3PcIecN3DgQAQEBFj92r9/P3JycgAA/fr1w9tvv42nnnoK06dPR0BAABYtWpRv+9HR0QgODr75FRIS4q7/NPJSSuZEDh4E9u6Vu3X/bcQIYOtW2ZlaurSKT/Nvn3/+OVrYuAG9SpUqSEtLAwCE3lKkNjAwEA8++CDOnj2b77MRERHo3r37zV+bzWYGErJKSRCZMAGoWBFo0uT27x84APTvD/TqBYSHq/gkKlu2LMqWLWvzfU899RQCAwNx8uRJ1KtXDwCQmZmJM2fOoHLlyvk+FxgYiEDWpSQH6A4iV6/KCdy+fYFCt7R27ZrsFXnsMeDrr/V+CjmqRIkS6NChAyIjIxESEoLKlSsjJiYGANCcE1OkkO4gMnMmkJl5510yPXoAZ8/KUMee6zJJvZiYGBQqVAitWrXC9evXUadOHWzatAmleCs6KaT77MyTTwLVqsku1FyLFslKzIQJQIcOOntIHsWzM2SLrtWZI0eAn3+W1ZdcJ0/KPbstWkjhZSLybbqCyOzZUp39tdfk1xkZwNtvyySrtQN4ROQ7nJ4TycmRqmXvvitzHpomQ5czZ4B9+2RfCBH5PqeDyE8/AefP/7MDdcQIyUzmzuX9uUT+xOnhzNq1cj/Ms8/KlveePeUCbtZKJfIvTgeR3buB554D1q8HWrUCPvgAiIpS2TUi8gZOD2cuXwaOH5db615/HZg6lROpRP7I6UzktdfkcF2PHrJHhDulifyTrs1mmsbsw9dxsxnZomufCAMIEbn0Ll4i8n0MIpQnk8mE0NBQhIWFeborZHAuubyKfAfnRMgWZiJEpAuDCBHpwiBCRLowiBCRLpxYJas0TUNaWhqCgoIQwI1BlAcGESLShcMZItKFQYSIdGEQISJdGESISBcGESLShUGEiHRhECEiXf4fan51hKwP3GAAAAAASUVORK5CYII=\n", "text/plain": [ "Graphics object consisting of 1 graphics primitive" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "parametric_plot(A*vector(b(t)),(t,0,2*pi))" ] }, { "cell_type": "code", "execution_count": null, "id": "af0b2b39", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.5", "language": "sage", "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.11.2" } }, "nbformat": 4, "nbformat_minor": 5 }