{ "cells": [ { "cell_type": "markdown", "source": [ "**Universidad de Chile** \n", "**Facultad de Ciencias Físicas y Matemáticas** \n", "**Departamento de Ingeniería Matemática** \n", "**MA3701-1 Optimización, 2023-2** \n", "Profesor: *Jorge Amaya* \n", "Auxiliares: *Aldo Gutierrez y Manuel Torres*. \n", "\n", "# Tutorial de herramientas numéricas\n", "\n", "En el presente archivo *.ipynb* se da una introducción a las herramientas que provee Python para la resolución de problemas de *optimización*, lo que corresponde al trabajo computacional del curso. Para esto, es clave el proceso de modelamiento previo a la realización del trabajo computacional.\n", "\n", "Cualquier consulta contactar a los auxiliares del curso." ], "metadata": { "id": "vsFH_wEY8W6d" } }, { "cell_type": "markdown", "metadata": { "id": "z8AIk4IRlpP9" }, "source": [ "Comenzaremos con la libería numpy (https://numpy.org/), usada ampliamente para manejar objetos multidimensionales." ] }, { "cell_type": "markdown", "metadata": { "id": "LelSCrfav6iT", "tags": [] }, "source": [ "## Numpy" ] }, { "cell_type": "markdown", "metadata": { "id": "nJwncc6ClpQA" }, "source": [ "El paquete se importa de la siguiente manera" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "zeOAcyh5lpQC" }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": { "id": "hizBUvkRwCt0" }, "source": [ "### Vectores\n" ] }, { "cell_type": "markdown", "metadata": { "id": "0t-zLuNglpQE" }, "source": [ "Se crea un objeto vector de la siguiente manera" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "OVFXyEzFv9Hb" }, "outputs": [], "source": [ "v = np.array([1, 2, 3, 4, 5])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "gTqQw1OpwK4H", "outputId": "53cb8d95-4893-4441-f2d4-b99d0e1e44cf" }, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3, 4, 5])" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(v)" ] }, { "cell_type": "markdown", "metadata": { "id": "ygElnhTolpQH" }, "source": [ "Se puede obtener la dimensión de un objeto tipo array con el siguiente comando" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "wpTKTCamlpQJ", "outputId": "1ef1c5ca-9f5d-48cd-a907-96ba9ebae4e3" }, "outputs": [ { "data": { "text/plain": [ "(5,)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.shape" ] }, { "cell_type": "markdown", "metadata": { "id": "Mdmt6ZcjlpQK" }, "source": [ "Notar que la segunda dimensión del objeto está vacía, esto pues ayuda en ciertas operaciones en donde la librería \"adivina\" la segunda dimensión, si se quiere fijar la dimensión se utiliza el comando **reshape**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "RgcVTp8uyE5F" }, "outputs": [], "source": [ "v = v.reshape((5,1))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "P3vRxQh6bwoE", "outputId": "3415cef0-7825-454f-e3dd-679a96a198aa" }, "outputs": [ { "data": { "text/plain": [ "(5, 1)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.shape" ] }, { "cell_type": "markdown", "metadata": { "id": "_hYrj2fTy93E", "outputId": "c05e9214-0683-446b-9a3b-03fcd1af3f61" }, "source": [ "La dimensión del objeto es una tupla, sus componente se acceden de la siguiente manera" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "nJ91zV28lpQM" }, "outputs": [], "source": [ "v.shape[0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "QNaXmSVulpQM", "outputId": "ca3b8220-0e7b-4eba-b4d3-2ea187ef36b0" }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.shape[1]" ] }, { "cell_type": "markdown", "metadata": { "id": "sOfUFgDvlpQN" }, "source": [ "A continación mostramos dos maneras distintos de redimensionar el objeto" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "pTSBa9kHy6bE", "outputId": "ed82a0da-1433-435b-e5e1-0a1645ae82e9" }, "outputs": [ { "data": { "text/plain": [ "array([[1],\n", " [2],\n", " [3],\n", " [4],\n", " [5]])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.reshape(5,1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "zy5yM8AWlpQO", "outputId": "5c428647-c333-430c-f146-b374b541fea1" }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3, 4, 5]])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v.reshape(1,5)" ] }, { "cell_type": "markdown", "metadata": { "id": "9cgj_VDYF5O8" }, "source": [ "Un objeto útil en la librería es el vector de unos o de ceros, mostramos más abajo como crearlos." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "XsbgRIaVF6o0", "outputId": "a0366de9-b4f7-4eff-8301-1efb14e78c5e" }, "outputs": [ { "data": { "text/plain": [ "array([1., 1., 1., 1.])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ones(4)" ] }, { "cell_type": "markdown", "metadata": { "id": "TDsqAha5IYgW" }, "source": [ "vector de zeros" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "FXkJ5AiZIZrb", "outputId": "da86ba40-f529-46ad-b40f-336dcdc7e9f9" }, "outputs": [ { "data": { "text/plain": [ "array([0., 0., 0., 0.])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros(4)" ] }, { "cell_type": "markdown", "metadata": { "id": "rvwthekRv-K_" }, "source": [ "### Matrices" ] }, { "cell_type": "markdown", "metadata": { "id": "_741NLptlpQQ" }, "source": [ "Mostramos ahora como crear matrices con numpy" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Pj9l9Tn-vyPf" }, "outputs": [], "source": [ "M = np.array([[1,0], [0,1]])\n", "N = np.array([[0,1], [1,0]])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "0PKMUVkcxwnN", "outputId": "d3f04a45-e5d3-4c50-d4e3-112e5177671e" }, "outputs": [ { "data": { "text/plain": [ "array([[1, 0],\n", " [0, 1]])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ahTKVQiDxxDF", "outputId": "1f8646b9-3f6f-4e82-afe3-4484275c5eb2" }, "outputs": [ { "data": { "text/plain": [ "array([[0, 1],\n", " [1, 0]])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "sg_TJ-slyIa9", "outputId": "2112f74c-cd34-4603-a5d1-6785b0d7971a" }, "outputs": [ { "data": { "text/plain": [ "(2, 2)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.shape" ] }, { "cell_type": "markdown", "metadata": { "id": "cQZmE9C8CCLS" }, "source": [ "### Identidad" ] }, { "cell_type": "markdown", "metadata": { "id": "e3PwW_0dlpQR" }, "source": [ "Con el comando **eye** se crea la matriz identidad" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "NuwvBV6jCAYo", "outputId": "2e583ce9-9ccb-4b11-b178-0de0297dcd00" }, "outputs": [ { "data": { "text/plain": [ "array([[1., 0.],\n", " [0., 1.]])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.eye(2)" ] }, { "cell_type": "markdown", "metadata": { "id": "-HnOdDpUIedu" }, "source": [ "### Matriz de zeros" ] }, { "cell_type": "markdown", "metadata": { "id": "io76yiz9lpQS" }, "source": [ "Para crear una matriz de ceros se le debe entregar una *tupla* al comando **np.zeros**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ofdtNMNRIfvj", "outputId": "3efddda2-58c2-4cfd-985a-8a74d96156e3" }, "outputs": [ { "data": { "text/plain": [ "array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.]])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros((3,4))" ] }, { "cell_type": "markdown", "metadata": { "id": "fpFgryKjlpQS" }, "source": [ "Como no se le entrega una tupla, el siguiente comando falla" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "MT8R5T93lpQS", "outputId": "33ab940e-6b4e-447d-dd46-36d821cbd61a" }, "outputs": [ { "ename": "TypeError", "evalue": "Cannot interpret '4' as a data type", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_30676/4168517335.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mTypeError\u001b[0m: Cannot interpret '4' as a data type" ] } ], "source": [ "np.zeros(3,4)" ] }, { "cell_type": "markdown", "metadata": { "id": "2kLTAlW6IkX8" }, "source": [ "### Matriz de unos" ] }, { "cell_type": "markdown", "metadata": { "id": "oUIVIY5MlpQT" }, "source": [ "Para crear una matriz de unos se sigue la misma lógica" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "KDk_KaCYIg3j", "outputId": "42070037-f0f2-4d51-dbb1-cb30910d441f" }, "outputs": [ { "data": { "text/plain": [ "array([[1., 1., 1., 1.],\n", " [1., 1., 1., 1.],\n", " [1., 1., 1., 1.]])" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ones((3,4))" ] }, { "cell_type": "markdown", "metadata": { "id": "9gGfAhvswT26" }, "source": [ "### Operaciones básicas\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "dXfHdDiT01vx" }, "source": [ "Las operaciones $+, \\ -,\\ * ,\\ \\frac{\\cdot}{\\cdot}, \\ **$ entre array son coordenadas a coordenadas. Se muestran a través de ejemplos a continuación" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "sCjoGqACcUme", "outputId": "140cfc0e-1032-4e9d-ee04-c932ddf02029" }, "outputs": [ { "data": { "text/plain": [ "array([[1],\n", " [2],\n", " [3],\n", " [4],\n", " [5]])" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "iEdgy8-Xz7wF", "outputId": "e2098cef-1147-4781-8f0f-82f1c45cffff" }, "outputs": [ { "data": { "text/plain": [ "array([[ 2],\n", " [ 4],\n", " [ 6],\n", " [ 8],\n", " [10]])" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v+v" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ZNDkkaoGz8L7", "outputId": "71bf70e3-8e7a-4511-f675-5e8d891add93" }, "outputs": [ { "data": { "text/plain": [ "array([[0],\n", " [0],\n", " [0],\n", " [0],\n", " [0]])" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v-v" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3tF0PgLvz8sO", "outputId": "b3579e41-101f-4fb8-dd74-d5407adb3c09" }, "outputs": [ { "data": { "text/plain": [ "array([[ 1],\n", " [ 4],\n", " [ 9],\n", " [16],\n", " [25]])" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v*v" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "4PwX1mhblpQV", "outputId": "2f2a8a94-db61-4311-b8c0-2bab3840afed" }, "outputs": [ { "data": { "text/plain": [ "array([[55]])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.dot(np.transpose(v),v)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "a3ii_ArmwSzX", "outputId": "6a34a6d2-709c-4247-fa1e-29f01094e5b7" }, "outputs": [ { "data": { "text/plain": [ "array([[10],\n", " [20],\n", " [30],\n", " [40],\n", " [50]])" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v*10" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "qa0z2AmTw8vH", "outputId": "ef096128-1186-419d-91aa-85d9e66c4ff4" }, "outputs": [ { "data": { "text/plain": [ "array([[1.],\n", " [1.],\n", " [1.],\n", " [1.],\n", " [1.]])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v/v" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "H3PCPztB0GmT", "outputId": "17227fc4-3d42-47a3-d326-4a7f9a1e7b7b" }, "outputs": [ { "data": { "text/plain": [ "array([[ 1],\n", " [ 4],\n", " [ 27],\n", " [ 256],\n", " [3125]], dtype=int32)" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v**v" ] }, { "cell_type": "markdown", "metadata": { "id": "ujeNLi8U0B9j" }, "source": [ "También están integradas en numpy" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "IgaTLIb_w__1", "outputId": "86ecfc57-7286-4ff3-870f-1f50362ea8ce" }, "outputs": [ { "data": { "text/plain": [ "array([[ 1],\n", " [ 4],\n", " [ 9],\n", " [16],\n", " [25]])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.multiply(v,v)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "YZnkVsMilpQX", "outputId": "35344bc4-debe-4666-f7bf-57c25a26556d" }, "outputs": [ { "data": { "text/plain": [ "array([[1, 0],\n", " [0, 1]])" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M" ] }, { "cell_type": "markdown", "metadata": { "id": "ToGJydAclpQX" }, "source": [ "Siempre hay que tener cuidado con las dimensiones al operar los objetos." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 171 }, "id": "V0RDOqyfxFfK", "outputId": "ae8fabf7-d9a9-4986-e376-c88b12ac6bf1" }, "outputs": [ { "ename": "ValueError", "evalue": "matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 5 is different from 2)", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_14544/1137537165.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmatmul\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mM\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mv\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mValueError\u001b[0m: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 5 is different from 2)" ] } ], "source": [ "np.matmul(M,v)" ] }, { "cell_type": "markdown", "metadata": { "id": "n2yJs2Pmx-LX" }, "source": [ "np.multiply $\\neq$ np.matmul" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "C21fwqrf0OpD", "outputId": "9500280b-d662-4f47-c264-2fe39456ac82" }, "outputs": [ { "data": { "text/plain": [ "array([[1, 0],\n", " [0, 1]])" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "hZpO93jN0PNr", "outputId": "3f068f08-4b81-4e53-b685-7890217208d5" }, "outputs": [ { "data": { "text/plain": [ "array([[0, 1],\n", " [1, 0]])" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "FtX-WhL7xIhZ", "outputId": "4f88ae4d-b000-4125-b9c4-8f168274ac64" }, "outputs": [ { "data": { "text/plain": [ "array([[0, 0],\n", " [0, 0]])" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.multiply(M,N) #coordenada a coordenada" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "GshrY9KWxJW-", "outputId": "a94f88d5-4ff6-430b-a310-a65173dbb910" }, "outputs": [ { "data": { "text/plain": [ "array([[0, 1],\n", " [1, 0]])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.matmul(M, N) # multipilicación matricial" ] }, { "cell_type": "markdown", "metadata": { "id": "QL4uu-ZS0cPa" }, "source": [ "Transpuesta" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "NHj1ZhzBwQ1_", "outputId": "5835889e-61ec-4d55-8b9a-0d2a94460014" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 2]\n", " [3 4]]\n" ] } ], "source": [ "B = np.array([[1,2], [3,4]])\n", "print(B)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "hef6dxOezHqU", "outputId": "8258f1cd-cbd4-4b0b-c7fe-0273720698a0" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 3]\n", " [2 4]]\n" ] } ], "source": [ "B_t = np.transpose(B)\n", "print(B_t)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "T6c1t2Qsdry-", "outputId": "bea8af36-a64e-4541-99f5-5cd66ebd2f82" }, "outputs": [ { "data": { "text/plain": [ "array([[ 2.71828183],\n", " [ 7.3890561 ],\n", " [ 20.08553692],\n", " [ 54.59815003],\n", " [148.4131591 ]])" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.exp(v)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "EgJUTtBLeJFd", "outputId": "f16216ac-9d92-4ba0-9003-8ee00c9bd918" }, "outputs": [ { "data": { "text/plain": [ "array([[1. ],\n", " [1.41421356],\n", " [1.73205081],\n", " [2. ],\n", " [2.23606798]])" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.sqrt(v)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "FlwPcfIfeLZc", "outputId": "ffe99364-5610-4167-a3e6-69f1a60526da" }, "outputs": [ { "data": { "text/plain": [ "3.141592653589793" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.pi" ] }, { "cell_type": "markdown", "metadata": { "id": "QWhhwhHd0dhq" }, "source": [ "Producto punto" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "HXSj0v1X0fT_", "outputId": "d10398cc-e393-432f-c308-1c2d24701c43" }, "outputs": [ { "data": { "text/plain": [ "array([[1],\n", " [2],\n", " [3],\n", " [4],\n", " [5]])" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v" ] }, { "cell_type": "markdown", "metadata": { "id": "Wt4UsMfpeVMy" }, "source": [ "$v^\\top z = \\sum_{i=1}^n v_i z_i$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "h3dDbupS0gv6", "outputId": "744278db-5abf-4686-b910-67c82743f341" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[55]\n" ] } ], "source": [ "sum = 0\n", "for i in range(len(v)):\n", " sum+= v[i]*v[i]\n", "print(sum)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "gpXP1NmYepCV" }, "outputs": [], "source": [ "v = np.array([1, 2, 3, 4, 5])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "O7sCR5xG0bPO", "outputId": "a1bbb813-7db1-4813-ebf8-3ebc297869de" }, "outputs": [ { "data": { "text/plain": [ "55" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.dot(v,v)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "232zw4l2eyBF", "outputId": "273a1533-4942-44a4-e529-698e2397681f" }, "outputs": [ { "data": { "text/plain": [ "array([ 1, 4, 9, 16, 25])" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v*v" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "EA5l_cpa0nAa", "outputId": "539d1dc1-461e-49e9-9610-6cfbc3732c09" }, "outputs": [ { "data": { "text/plain": [ "55" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.sum(v*v)" ] }, { "cell_type": "markdown", "metadata": { "id": "OBZ9crDR0_KZ" }, "source": [ "### Acceder a arrays\n", "Otra herramiena a usar es el acceso a las compontes de los objetos" ] }, { "cell_type": "markdown", "metadata": { "id": "5kSAC8Tc1BgW" }, "source": [ "Componente i-esima de un vector" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "MT009ad91DsS", "outputId": "7b028b1b-d680-46ef-b174-c00c9e7fbc0b" }, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3, 4, 5])" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v" ] }, { "cell_type": "markdown", "metadata": { "id": "qeHh09vS1GSc" }, "source": [ "Recordemos que parten de 0" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "69_cGhZI1HuJ", "outputId": "13a3c292-82d5-4dd5-a281-88ec1ee95c53" }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v[0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "kL--Npvo1AP6", "outputId": "8882d0ae-71b1-4f4b-eadb-e988e33aa126" }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v[1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3onxhs491L-q", "outputId": "06256cef-e610-4415-a6ef-59e1e5c2f8e4" }, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v[len(v)-1]" ] }, { "cell_type": "markdown", "metadata": { "id": "HJHcU0av66FW" }, "source": [ "Componente (i,j) de una matriz" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "PhN37thO65jg", "outputId": "c0dfb653-82b8-4961-f4ca-8d45a125c09f" }, "outputs": [ { "data": { "text/plain": [ "array([[1, 0],\n", " [0, 1]])" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "BXYKb_k-6-ze", "outputId": "e60a2d56-94e5-4d60-d198-d24fb861a0d6" }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M[0,0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "toEXgh8n6_7W", "outputId": "93d24658-1850-44fb-dc3f-cb7a26633ad3" }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M[1,1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "GKrhM61x7BJf", "outputId": "7eef1b45-3b30-4789-ecfa-5cb5dc5418f0" }, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M[0,1]" ] }, { "cell_type": "markdown", "metadata": { "id": "YSKnBpXR7xDc" }, "source": [ "i-esima fila de una matriz" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "jd71y_u970Jd", "outputId": "9caf39dd-d677-4ae1-b674-30ab3b4fb7b2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 2]\n", " [3 4]]\n" ] } ], "source": [ "print(B)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "XvUwEbLt8yC5", "outputId": "7387a3d3-33aa-4b78-a229-0a50432e2c3a" }, "outputs": [ { "data": { "text/plain": [ "array([1, 2])" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B[0,:]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "TgPzfs-G83Jk", "outputId": "34c0f846-fb2d-49e8-ad10-de48678903a2" }, "outputs": [ { "data": { "text/plain": [ "array([3, 4])" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B[1,:]" ] }, { "cell_type": "markdown", "metadata": { "id": "Lp7nyVqd85NR" }, "source": [ "j-esima columna de una matriz" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wY2RFZ8m88Bz", "outputId": "9df34607-25dd-4956-c310-06f09a5ded45" }, "outputs": [ { "data": { "text/plain": [ "array([1, 3])" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B[:,0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "qz4aFYv79Etc", "outputId": "0809a489-31c1-4600-eade-c0f3560af999" }, "outputs": [ { "data": { "text/plain": [ "array([2, 4])" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B[:,1]" ] }, { "cell_type": "markdown", "metadata": { "id": "khm5MWo59IpU" }, "source": [ "### Slices\n", "Se muestra como acceder a *partes más peuqueñas* de los objetos creados." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "MJf7g5Uk9JNL", "outputId": "d6b28c91-5bb2-47c4-c118-2e1351bfb4c7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 2 3 4 5]\n" ] } ], "source": [ "print(v)" ] }, { "cell_type": "markdown", "metadata": { "id": "Cd04eLgC9NrQ" }, "source": [ " - $v[i:j]$ me da desde la $i$-esima componente del vector hasta la $(j-1)$-ésima componente del vector" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "qlamoTzb9LPc", "outputId": "ff587991-1c4c-4590-9419-3009000e967b" }, "outputs": [ { "data": { "text/plain": [ "array([2, 3])" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v[1:3]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "quiNp3oJ9Htb", "outputId": "7425617a-b4f4-4d97-de93-02c6d785d943" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1]\n", "[1 2]\n" ] } ], "source": [ "print(v[0:1])\n", "print(v[0:2])" ] }, { "cell_type": "markdown", "metadata": { "id": "HDAqegYCwezs" }, "source": [ "### Funciones útiles" ] }, { "cell_type": "markdown", "metadata": { "id": "nqSPNz8JBs3K" }, "source": [ "### Crear rangos" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "v9hTrPMXBtnH", "outputId": "e50884ee-5de7-47a5-cc4a-ff03f2d91e34" }, "outputs": [ { "data": { "text/plain": [ "array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. ,\n", " 6.5, 7. , 7.5, 8. , 8.5])" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.arange(0, 9, 0.5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "PRQyOhQHlQcv", "outputId": "8ff22eb8-f74b-4421-b4ba-6302243c8126" }, "outputs": [ { "data": { "text/plain": [ "array([0. , 0.18367347, 0.36734694, 0.55102041, 0.73469388,\n", " 0.91836735, 1.10204082, 1.28571429, 1.46938776, 1.65306122,\n", " 1.83673469, 2.02040816, 2.20408163, 2.3877551 , 2.57142857,\n", " 2.75510204, 2.93877551, 3.12244898, 3.30612245, 3.48979592,\n", " 3.67346939, 3.85714286, 4.04081633, 4.2244898 , 4.40816327,\n", " 4.59183673, 4.7755102 , 4.95918367, 5.14285714, 5.32653061,\n", " 5.51020408, 5.69387755, 5.87755102, 6.06122449, 6.24489796,\n", " 6.42857143, 6.6122449 , 6.79591837, 6.97959184, 7.16326531,\n", " 7.34693878, 7.53061224, 7.71428571, 7.89795918, 8.08163265,\n", " 8.26530612, 8.44897959, 8.63265306, 8.81632653, 9. ])" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linspace(0,9,50)" ] }, { "cell_type": "markdown", "metadata": { "id": "EiquedolJGNT" }, "source": [ "### Aleatoridad" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "5SZ8y4g3JHsy", "outputId": "9fff4db6-dd89-4428-970e-bf933b990b46" }, "outputs": [ { "data": { "text/plain": [ "array([0.15567893, 0.76759517, 0.87012548, 0.20577043, 0.62411299,\n", " 0.79361466, 0.3337418 , 0.4912953 , 0.15384769, 0.18959166])" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.uniform(0,1,10)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "itvW-rh8zPJE", "outputId": "f56e8e0b-82b6-47a0-af1c-1807bcac3177" }, "outputs": [ { "data": { "text/plain": [ "array([ 0.02284441, -0.20997655, -0.03236529, -1.07925614, 1.4220961 ,\n", " 0.4393961 , -0.30897329, -1.48896401, 0.56626378, -0.37057776])" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.normal(0,1,10)" ] }, { "cell_type": "markdown", "metadata": { "id": "HgKb4M0eKEFb" }, "source": [ "flat" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4RsagY0iKEih", "outputId": "12e7662e-d270-4772-ad1d-bd233fbc52d6" }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2],\n", " [3, 4]])" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "N7jxQ2JIKGHa", "outputId": "7317a2da-ebb0-48e4-a701-2baffe31d770" }, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3, 4])" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ndarray.flatten(B)" ] }, { "cell_type": "markdown", "metadata": { "id": "OFp-WdJhlpQv" }, "source": [ "## Problema Lineal" ] }, { "cell_type": "markdown", "metadata": { "id": "TWwC4qcAlpQw" }, "source": [ "Consideramos el siguiente problema de optimización" ] }, { "cell_type": "markdown", "metadata": { "id": "JCym2GP9lpQw" }, "source": [ "$$\n", "(PL)\n", "\\quad\n", "\\begin{array}\n", "M\\max & y+2z\\\\\n", "s.a.& 2y+3z\\leq 4 \\\\\n", "&y\\geq1\n", "\\end{array}$$\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "vr9qfDm6lvTc" }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "from matplotlib import cm" ] }, { "cell_type": "markdown", "metadata": { "id": "mNeQHTm3ff-J" }, "source": [ "Dibujemos, tenemos el conjunt factible\n", "$$\n", "\\begin{eqnarray*}\n", " 2y+3z &\\leq 4 \\\\\n", " y &\\geq&1\n", "\\end{eqnarray*}$$" ] }, { "cell_type": "markdown", "metadata": { "id": "hxA4EYyek3iq" }, "source": [ "Definimos el poliedro a través de una función binaria" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "HGfTznn0feg0" }, "outputs": [], "source": [ "def P(y, z):\n", " if 2*y + 3*z<= 4 and y>=1:\n", " return 1\n", " return 0" ] }, { "cell_type": "markdown", "metadata": { "id": "Fc5AQzQalalA" }, "source": [ "Discretizmos un rango para poder graficar" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "A1jI31CwlLa2" }, "outputs": [], "source": [ "n = 1000\n", "Y=np.linspace(-1,40,n)\n", "Z=np.linspace(-20,4,n)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 313 }, "id": "Y40eOf1Ald5V", "outputId": "e792403b-a932-4395-84d5-1d9a6f5b669e" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "W = np.zeros([n,n])\n", "for i in range(n):\n", " for j in range(n):\n", " W[i,j]=P(Y[i],Z[j])\n", "\n", "X2,Y2=np.meshgrid(Y, Z)\n", "\n", "plt.figure()\n", "plt.contourf(X2,Y2,np.transpose(W),2,alpha=0.75,cmap=cm.coolwarm)\n", "\n", "plt.plot(Y,np.zeros_like(Y),'k')\n", "plt.plot(np.zeros_like(Z),Z,'k')\n", "#plt.quiver(x_position, y_position, x_direction, y_direction)\n", "plt.xlabel(\"Eje y\")\n", "plt.ylabel(\"Eje z\")\n", "plt.title(\"Poliedro de la región factible\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "oe-gFnAFjki6" }, "source": [ "Como podemos ver graficamente, llegmaos a un optimo en un punto extremo, que coincide con la teoria vista en clases." ] }, { "cell_type": "markdown", "metadata": { "id": "1VS4ZtBS7QpH" }, "source": [ "## Scipy linprog" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "IEkOxRz-7Rp9" }, "outputs": [], "source": [ "from scipy.optimize import linprog" ] }, { "cell_type": "markdown", "metadata": { "id": "CEF2e65qSDYb" }, "source": [ "Recibe problemas de la forma\n", "$$\n", " \\begin{array}{rrclcl}\n", " \\min & c^\\top x\\\\\n", " \\textrm{s.a.} & A_{ub} x & \\leq & b_{ub} \\\\\n", " & A_{eq} x & = & b_{eq} \\\\\n", " & l \\leq & x & \\leq u\n", " \\end{array}\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "id": "gce5C1aBT7Dd" }, "source": [ "Pasamos el problema a minimizar:\n", "$$\n", "(PL)\n", "\\quad\n", "\\begin{array}\n", "\\text{-} \\min & -(y+2z)\\\\\n", "\\text{s.a.}& 2y+3z\\leq 4 \\\\\n", "&y\\geq1\n", "\\end{array}$$\n" ] }, { "cell_type": "markdown", "metadata": { "id": "VaZuPrE7IqPS" }, "source": [ "Definimos el vector de costos:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Jn9hDhzJ-FIb" }, "outputs": [], "source": [ "c = [-1, -2]" ] }, { "cell_type": "markdown", "metadata": { "id": "pGr7u6ZWJEo8" }, "source": [ "Definimos las matrices para las restricciones" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "U9zo45mAI3zJ" }, "outputs": [], "source": [ "A = [[2, 3]]\n", "b = [4]\n", "y_bound = (1, None)\n", "z_bound = (None, None)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "of9BC422lpQz", "outputId": "59182a26-0bd4-4edd-fbca-2595c0c34570" }, "outputs": [ { "data": { "text/plain": [ "[(1, None), (None, None)]" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[y_bound, z_bound]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "iMH9r61RL0sO" }, "outputs": [], "source": [ "sol = linprog(c, A_ub=A, b_ub=b, bounds=[y_bound, z_bound])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "bPOFYU1KM22V", "outputId": "d2d60fdb-3937-4c44-9a23-48ae62bd26ae" }, "outputs": [ { "data": { "text/plain": [ " con: array([], dtype=float64)\n", " fun: -2.3333333333325976\n", " message: 'Optimization terminated successfully.'\n", " nit: 4\n", " slack: array([1.44773082e-13])\n", " status: 0\n", " success: True\n", " x: array([1. , 0.66666667])" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "FdY3iLYulpQ0", "outputId": "524c2700-92f7-4b4f-ca3d-aa475acd3f90" }, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol.nit" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "4ddIjNhDlpQ0", "outputId": "48d80050-49cb-474c-81f9-4ceabce73325" }, "outputs": [ { "data": { "text/plain": [ "array([1. , 0.66666667])" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol.x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "8MMttGjsM83e", "outputId": "46b738b2-bdeb-42e6-b3ec-938118594a70" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "La solución es 2.3333333333325976\n" ] } ], "source": [ "print(\"La solución es\", -sol.fun)" ] } ], "metadata": { "colab": { "provenance": [], "toc_visible": true }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" } }, "nbformat": 4, "nbformat_minor": 0 }