{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "GPtNufGUvOY1",
    "tags": []
   },
   "source": [
    " Introducción al lenguaje python mediante jupyter.\n",
    " ---\n",
    "0. [Trucos y recomendaciones](#trucos)\n",
    "1. [Variables](#variables)\n",
    "2. [Operadores](#operadores)   \n",
    "3. [Cadenas de caracteres](#cadenacaracteres)\n",
    "4. [Controles de flujo: condicionales e iterativos](#flujo)\n",
    "    1. [Controles condicionales:; if](#Condicionales)\n",
    "    2. [Controles iterativos: for y while](#Iteraciones)\n",
    "5. [Estructuras de datos: tuplas, listas, conjuntos y diccionarios](#tipos)\n",
    "6. [Funciones](#funciones)\n",
    "7. [Bibliotecas](#bibliotecas)\n",
    "    1. [Trabajar con vectores y matrices: numpy](#numpy)\n",
    "    2. [Representación gráfica: matplotlib](#matplotlib)    \n",
    " ---\n",
    " &emsp; Esta introducción está basada en otra similar que se preparó para la asignatura \"Resistencia de Materiales\" del Grado en Ingeniería de Organización Industrial impartido por el CUD de Zaragoza, como parte del proyecto de innovación docente <b>Programación numérica mediante Python como herramienta de aprendizaje en la asignatura de Resistencia de Materiale</b> con ID=229 en la convocatoria de 2021 del programa PIIDUZ y consultable en https://github.com/universidad-zaragoza/rmat_python/tree/main/ dentro del enlace \"tema 0\". <br>\n",
    " &emsp; Las modificaciones que se han hecho: inclusión de conjuntos y diccionarios, explicaciones y comentarios, acceso a variables dentro de una función, ... son responsabilidad de los profesores de la asignatura de \"Mecánica\" del mismo Grado y Centro y se basan en documentación disponible en línea sobre <i>Python</i>:\n",
    "\n",
    " https://docs.python.org/3/tutorial/<br>\n",
    " https://www.w3schools.com/python/<br>\n",
    " https://www.programiz.com/python-programming"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "sIJfZFMLvOY7"
   },
   "source": [
    "# TRUCOS <a name=\"trucos\"></a>\n",
    "\n",
    "- En ocasiones jupyter deja de funcionar correctamente. La solución más aconsejable es ir a Kernel y seguir la secuencia: Restart, Reconnect y Shutdown. Si el problema se resuelve con Restart parar. Sino pasar a Reconnect etc.\n",
    "\n",
    "\n",
    "- Para trabajar con jupyter en una carpeta dada:\n",
    "    - Abrir una línea de comandos (ejecutable cmd.exe)\n",
    "    - Escribir: cd \"ruta completa de la carpeta donde estén los guiones\"\n",
    "    - Escribir: jupyter lab\n",
    "    - Puede ahorrarse el segundo paso si se escribe: jupyter lab --notebook-dir \"ruta completa de la carpeta donde estén los guiones\"\n",
    "\n",
    "- Para trabajr con jupyter en la carpeta por defecto:\n",
    "    - Pulsar el icono de acceso directo a jupyter-lab en el escritorio.\n",
    "    - Para cambiar la carpeta por defecto. Pulsar con el botón izquierdo sobre el icono y editar en la pestaña \"Acceso directo\", la opción \"Iniciar en:\" que contiene la ruta completa a la carpeta por defecto."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "-lXQV4x-vOY-"
   },
   "source": [
    "# Variables <a name=\"variables\"></a>\n",
    "\n",
    "&emsp; Son etiquetas que sirven para identificar en un programa las posiciones de la memoria donde se han almacenanado los datos con los que se trabajará y permiten tanto acceder a ellos como modificarlos. En el nombre de una variable, <i> Python </i> distingue entre mayúsculas y minúsculas, <i> A </i> es distinta de <i> a </i>."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 254,
     "status": "ok",
     "timestamp": 1690547857847,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "m1XwCr-CvOY-",
    "outputId": "d117b0a9-5320-4bd9-be2b-e111fa21aa3c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "42 3.1416 3.14 (3+7j) Ejemplo de cadena de caracteres  True\n",
      "<class 'int'>\n",
      "<class 'float'>\n",
      "<class 'float'>\n",
      "<class 'complex'>\n",
      "<class 'str'>\n",
      "<class 'bool'>\n"
     ]
    }
   ],
   "source": [
    "a = 42        #entero\n",
    "b = 3.1416    #real\n",
    "bexp = 3.14e0 #exponencial\n",
    "c = 3+7j      #complejo\n",
    "d = \"Ejemplo de cadena de caracteres \" # Cadena de caracteres, podría haberse definido exactamente igual con comillas simples: ' al principio y al final.\n",
    "e = True      #lógica o booleana. Sólo admite dos valores: True o False.\n",
    "\n",
    "#Imprimir por pantalla\n",
    "print (a,b,bexp,c,d,e)\n",
    "\n",
    "#Tipos de variables\n",
    "print (type(a))\n",
    "print (type(b))\n",
    "print (type(bexp))\n",
    "print (type(c))\n",
    "print (type(d))\n",
    "print (type(e))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "yhhMDzegvOZA"
   },
   "source": [
    "# Operadores <a name=\"operadores\"></a>\n",
    "\n",
    "&emsp; Realizan operaciones sobre variables."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 556,
     "status": "ok",
     "timestamp": 1690547858659,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "jzNyNyzPvOZB",
    "outputId": "38e590b1-f343-4a67-bf00-4b105f24a7d4"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a= 7.0 b= 5.0\n",
      "Operadores aritméticos\n",
      "a+b= 12.0\n",
      "a-b= 2.0\n",
      "a*b= 35.0\n",
      "a/b= 1.4\n",
      "División entera a/b= 1.0\n",
      "a^b= 16807.0\n",
      "a modulo b 2.0\n",
      "\n",
      "a= 7.0 b= 5.0\n",
      "Operadores de comparación\n",
      "a==b False\n",
      "a!=b True\n",
      "a>b True\n",
      "a<b False\n",
      "a>=b True\n",
      "a<=b False\n",
      "\n",
      "a= 7.0 b= 5.0\n",
      "Operadores lógicos\n",
      "a>b Y b>1.0 True\n",
      "a<b O b>7.0 False\n",
      "niega(anterior) True\n",
      "\n",
      "a= 7.0 b= 5.0 lista =  [1.0, 2.0, 5.0, 9.0]\n",
      "Operadores de pertenencia\n",
      "a pertenece a lista False\n",
      "b no pertenece a lista False\n"
     ]
    }
   ],
   "source": [
    "a,b=7.0,5.0\n",
    "\n",
    "# Operadores aritméticos.\n",
    "suma=a+b\n",
    "resta=a-b\n",
    "multip=a*b\n",
    "div=a/b\n",
    "div_entera=a//b\n",
    "exp=a**b\n",
    "modulo=a%b # resto de la división\n",
    "\n",
    "print('a=',a,'b=',b)\n",
    "print('Operadores aritméticos')\n",
    "print(\"a+b=\",suma)\n",
    "print(\"a-b=\",resta)\n",
    "print(\"a*b=\",multip)\n",
    "print(\"a/b=\",div)\n",
    "print(\"División entera a/b=\",div_entera)\n",
    "print(\"a^b=\",exp)\n",
    "print(\"a modulo b\", modulo)\n",
    "print(\"\")\n",
    "\n",
    "# Operadores de comparación.\n",
    "igual = a==b\n",
    "distinto = a!=b\n",
    "mayor = a>b\n",
    "menor = a<b\n",
    "mayoroigual = a>=b\n",
    "menoroigual = a<=b\n",
    "\n",
    "print('a=',a,'b=',b)\n",
    "print(\"Operadores de comparación\")\n",
    "print('a==b', igual)\n",
    "print('a!=b', distinto)\n",
    "print('a>b', mayor)\n",
    "print('a<b', menor)\n",
    "print('a>=b', mayoroigual)\n",
    "print('a<=b', menoroigual)\n",
    "print(\"\")\n",
    "\n",
    "# Operadores lógicos.\n",
    "ylogico = a>b and b>1.0\n",
    "ologico = a<b or b>7.0\n",
    "nologico = not(a<b or b>7.0)\n",
    "\n",
    "print('a=',a,'b=',b)\n",
    "print(\"Operadores lógicos\")\n",
    "print(\"a>b Y b>1.0\", ylogico)\n",
    "print(\"a<b O b>7.0\", ologico)\n",
    "print(\"niega(anterior)\", nologico)\n",
    "print(\"\")\n",
    "\n",
    "lista = [1.0, 2.0, 5.0, 9.0] # Más adelante se verá qué tipo de datos representa una lista.\n",
    "#operadorees de pertenencia.\n",
    "pertenece = a in lista\n",
    "nopertenece = b not in lista\n",
    "\n",
    "print(\"a=\", a, \"b=\", b, \"lista = \", lista)\n",
    "print(\"Operadores de pertenencia\")\n",
    "print(\"a pertenece a lista\", a in lista)\n",
    "print(\"b no pertenece a lista\", b not in lista)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "fcOPrV0kvOZF"
   },
   "source": [
    "#  Cadenas de caracteres <a name=\"cadenacaracteres\"></a>\n",
    "\n",
    "&emsp; Son una sucesión de carácteres que se pueden definir encerrándolos tanto entre comillas simples '...', como entre comillas dobles \"...\". Si se quiere representar una comilla dentro de la cadena, debe ir precedida por \\\\."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 84,
     "status": "ok",
     "timestamp": 1690547858660,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "riOFC5-XvOZG",
    "outputId": "cb9a137f-782b-48d1-b8a2-df91b77ce8ac"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hola\n",
      " \t Este es un ejemplo de cadena de caracteres \n",
      "         Es posible escribir saltos de linea sin necesidad de utilizar los códigos\n",
      "de escape\n",
      "\n",
      "\n",
      "Hola\n",
      "\t Este es un ejemplo de cadena de caracteres \n",
      "  repite  repite  repite   repite  repite  repite \n",
      "\n",
      "\n",
      "\t Para escribir comillas, se usa ' y \".\n"
     ]
    }
   ],
   "source": [
    "a= \"Hola\\n\"\n",
    "b = \"\\t Este es un ejemplo de cadena de caracteres \\n\"\n",
    "c = \"\"\"        Es posible escribir saltos de linea sin necesidad de utilizar los códigos\n",
    "de escape\"\"\"\n",
    "\n",
    "print(a,b,c)\n",
    "print('\\n') # Salto de línea mediante \\n.\n",
    "\n",
    "d= a + b #concatenación\n",
    "e = \" repite \"\n",
    "f = 3*e #repetición\n",
    "g = e*3 #equivale a lo anterior\n",
    "\n",
    "print(d,f,g)\n",
    "\n",
    "z = '\\t Para escribir comillas, se usa \\' y \\\".' # Tabulador mediante \\t.\n",
    "print('\\n')\n",
    "print(z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "GGaEuvwkvOZI"
   },
   "source": [
    "# Controles de flujo <a name=\"flujo\"></a>\n",
    "\n",
    "* Sentencias condicionales: if-elif-else\n",
    "  \n",
    "* Sentencias iterativas, bucles: for y while.\n",
    "  \n",
    "* Sintaxis: la primera línea que inicia la estructura de control (if, elif, else, for, while) termina con \":\". Las siguientes líneas que se ejecutan dentro de la estructura de control van indentadas. El código controlado termina con la primera línea que no está indentada."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "MGatVCJNO1bH"
   },
   "source": [
    "## Condiciones <a name=\"Condicionales\"> </a>\n",
    "\n",
    "* Si (if) se cumple una condición, se ejecutan las líneas que siguen al <i>if</i>. Si no se cumple, pero si se cumple otra (elif), se ejecutan las líneas después del <i>elif</i>. Si no se cumple ninguna condición previa (else), se ejecutan las líneas que vienen a continuación del <i>else</i>.\n",
    "\n",
    "* Las condiciones son variables lógicas (True si se cumplen y False si no se cumplen) que pueden ser el resultado de evaluar alguna comprobación."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 74,
     "status": "ok",
     "timestamp": 1690547858660,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "I0iRV8aKvOZK",
    "outputId": "39722975-cbf8-4660-e056-8fb3843fb617"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ejemplo 1: usos del if\n",
      "-27.0  es un número negativo.\n",
      "\n",
      "Ejemplo 2: usos del if\n",
      "(37.3+2.1j) Tipo de variable= <class 'complex'>\n",
      "(37.3+2.1j)  no es un número real\n"
     ]
    }
   ],
   "source": [
    "# Usos del if\n",
    "'''\n",
    "Ejemplo: ¿contiene la variable un número negativo?\n",
    "'''\n",
    "print(\"Ejemplo 1: usos del if\")\n",
    "a=-27.0\n",
    "if a<0.0: # Nótese el \":\" al final de la línea.\n",
    "    print(a,\" es un número negativo.\") # Línea indentada, se ejecuta si a<0.0\n",
    "elif a==0: # Nueva orden de control, se ejecuta sólo si no se ha ejecutado el primer \"if\"\n",
    "    print(a,\" es nulo.\") # Línea indentada, se ejecuta si a==0.0\n",
    "else: # Nueva orden de control, se ejecuta si no se ejecutado ningún \"if\" o \"elif\" previo\n",
    "    print(a,\" es un número positivo.\") # Línea indentada, se ejecuta si a>0.0\n",
    "\n",
    "print(\"\") # Línea no indentada, se recupera el flujo previo del programa, la estructura de control termina antes de que se ejecute esta línea.\n",
    "\n",
    "'''\n",
    "Ejemplo: utilizando la función isintance() nos preguntamos si la variable\n",
    "a contiene un número real\n",
    "'''\n",
    "print(\"Ejemplo 2: usos del if\")\n",
    "a=37.3 + 2.1j\n",
    "print(a, \"Tipo de variable=\",type(a))\n",
    "if isinstance(a,float):\n",
    "    print(a,\" es un número real\")\n",
    "else:\n",
    "    print(a,\" no es un número real\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "p5dZSmTWP84d"
   },
   "source": [
    "## Iteraciones. Bucles. <a name=\"Iteraciones\"> </a>\n",
    "\n",
    "* Bucles <i>for</i>. Para (for) todos los valores que estén en (in) una cierta secuencia, se evalúan las líneas de código que siguen donde se va asignando a una variable de control el valor correspondiente a cada uno de los elementos de la secuencia.\n",
    "\n",
    " - Así, por ejemplo: <i> for i in [1,2,3,4]:</i>, asignaría sucesivamente a la variable <i>i</i> (la variable de control en este ejemplo) los valores <i>1, 2, 3, 4</i> para ejecutar las líneas siguientes de código con el valor correspondiente de <i>i</i> en cada caso.\n",
    "\n",
    "* Bucles <i>while</i>. Mientras (while) se cumpla una condición lógica, que se evalúa al comienzo del bucle, se ejecutan las líneas de código que siguen. Hay que tener cuidado con asegurar que se pueda terminar el bucle para no que el cógido no se quede \"colgado\" ejecutándolo continuamente si la condición se cumple siempre."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 68,
     "status": "ok",
     "timestamp": 1690547858661,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "ey8oZ1xSvOZL",
    "outputId": "21e43df0-5880-4960-c9f1-e60b72904f78"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ejemplo 1: bucle for\n",
      "De los siguientes números  [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4] se comprueba cuáles son negativos\n",
      "-5  es un número negativo.\n",
      "Se estudiaba:  -5\n",
      "-4  es un número negativo.\n",
      "Se estudiaba:  -4\n",
      "-3  es un número negativo.\n",
      "Se estudiaba:  -3\n",
      "-2  es un número negativo.\n",
      "Se estudiaba:  -2\n",
      "-1  es un número negativo.\n",
      "Se estudiaba:  -1\n",
      "Se estudiaba:  0\n",
      "Se estudiaba:  1\n",
      "Se estudiaba:  2\n",
      "Se estudiaba:  3\n",
      "Se estudiaba:  4\n",
      "\n",
      "Ejemplo 2: bucle for\n",
      "-5  es un número negativo.\n",
      "-4  es un número negativo.\n",
      "-3  es un número negativo.\n",
      "-2  es un número negativo.\n",
      "-1  es un número negativo.\n",
      "\n",
      "Ejemplo 3: bucle for\n",
      "manzana\n",
      "pera\n",
      "gato\n"
     ]
    }
   ],
   "source": [
    "#Bucle for\n",
    "'''\n",
    "Ejemplo: utilizando el método range proporciona una lista de números,\n",
    "comprobamos si un número es postivo o negativo\n",
    "'''\n",
    "print(\"Ejemplo 1: bucle for\")\n",
    "\n",
    "rango=list(range(-5,5)) # Más adelante se verá qué hace el método list.\n",
    "# range(inicio, fin, paso) crea una secuencia de números (convertida a lista en el ejemplo anterior) que empiezan en inicio, se incrementan de paso en paso y termina justo\n",
    "# antes de llegar a fin. Por defecto, paso=1 (si no se indica) e inicio=0 (si no se indica).\n",
    "\n",
    "print(\"De los siguientes números \",rango,\"se comprueba cuáles son negativos\")\n",
    "for a in range(-5,5): # Nótese el \":\" al final de la línea.\n",
    "    if a<0.0: # Estructura de control anidada dentro de otra.\n",
    "        print(a,\" es un número negativo.\")  # Se ejecuta sólo si a<0.0 dentro de un bucle que barre entre -5 y +5 de 1 en uno.\n",
    "    print(\"Se estudiaba: \", a) # Se ejecuta dentro del bucle \"for\", pero no del \"if\", ni del flujo principal.\n",
    "\n",
    "'''\n",
    "Ejemplo: una forma compacta de escribir el mismo loop..\n",
    "'''\n",
    "print(\"\") # Se recupera el flujo principal del programa.\n",
    "print(\"Ejemplo 2: bucle for\")\n",
    "\n",
    "[print(a,\" es un número negativo.\") for a in range(-5,5) if(a < 0.0)]\n",
    "\n",
    "'''\n",
    "Ejemplo: Python permite bucles en cualquier objeto que sea iterable\n",
    "'''\n",
    "print(\"\")\n",
    "print(\"Ejemplo 3: bucle for\")\n",
    "\n",
    "lista = [\"manzana\",\"pera\",\"gato\"] # Más adelante se verá qué tipo de dato representa lista\n",
    "\n",
    "for palabra in lista:\n",
    "    print(palabra)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 61,
     "status": "ok",
     "timestamp": 1690547858662,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "pmA3TkTcvOZN",
    "outputId": "54fdf0bf-66ee-4ebb-c61f-d4bdf5afacb1"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ejemplo 1: bucle while\n",
      "2\n",
      "4\n",
      "6\n",
      "8\n",
      "10\n",
      "12\n",
      "14\n",
      "16\n",
      "18\n",
      "20\n",
      "\n",
      "Ejempo 2: bucle while\n",
      "2\n",
      "4\n",
      "6\n",
      "8\n",
      "10\n",
      "12\n",
      "14\n",
      "16\n",
      "18\n",
      "20\n"
     ]
    }
   ],
   "source": [
    "# Bucle while\n",
    "'''\n",
    "Ejemplo: Se representan los números pares empezando por 2 hasta llegar al número 20 (incluido).\n",
    "OJO: los bucles while producen fácilmente bucles infinitos. En el ejemplo 1, esto ocurriría si se eliminase\n",
    "la condición de salir del bucle (break) cuando el número se haga mayor que 20. En el ejemplo 2, la condición para\n",
    "terminar se incluye en la definición del bucle mediante un operador lógico.\n",
    "'''\n",
    "print(\"Ejemplo 1: bucle while\")\n",
    "\n",
    "nopar=2\n",
    "while (nopar > 0): # Nótese el \":\" al final de la línea.\n",
    "    print (nopar) # Se ejecuta con el bucle \"while\".\n",
    "    nopar = nopar + 2 # Se ejecuta con el bucle \"while\".\n",
    "    if (nopar > 20): # Estructura de control anidada dentro de otra.\n",
    "        break # Termina el proceso de ejecución del bucle \"padre\" (dentro del que estaba anidado el \"if\"; es decir, el \"while\") y se sigue con el flujo principal.\n",
    "\n",
    "print(\"\")\n",
    "print(\"Ejempo 2: bucle while\")\n",
    "nopar=2\n",
    "while (nopar > 0 and nopar <= 20): # En esta versión, la terminación del bucle viene indicada en su propia condición.\n",
    "    print (nopar)\n",
    "    nopar = nopar + 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "CVhcxZEPvOZO",
    "tags": []
   },
   "source": [
    "# Estructuras de datos en Python <a name=\"tipos\"></a>\n",
    "* Tuplas\n",
    "* Listas\n",
    "* Conjuntos\n",
    "* Diccionarios\n",
    "\n",
    "Información adicional:\n",
    "https://docs.python.org/3/tutorial/datastructures.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 56,
     "status": "ok",
     "timestamp": 1690547858664,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "3AZNMgwFvOZP",
    "outputId": "48a5122b-8a02-4256-d91f-67e347376bd5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tuplas\n",
      "(1, 1, 3, 4, 6)\n",
      "(1, 1)\n",
      "(1, 1, 3, 4, 6)\n",
      "('hola', 2, 3)\n",
      "(('hola', 2, 3), 90)\n",
      "('e', 'j', 'e', 'm', 'p', 'l', 'o')\n"
     ]
    }
   ],
   "source": [
    "# Tuplas\n",
    "'''\n",
    "Una tupla es una secuencia inmutable y ordenada de elementos que pueden estar duplicados. Pueden ser de\n",
    "de cualquier tipo (básico o no). Se pueden indexar.\n",
    "Sintaxis para declarar una tupla: especificar los elementos separados por una coma (,)\n",
    "'''\n",
    "tupla_vacia = ( )\n",
    "tupla1 = 1, 1, 3, 4 , 6,\n",
    "tupla1b = (1 , 1 , 3 , 4 , 6)\n",
    "tupla2 = \"hola\" , 2 ,3\n",
    "tupla3 = tupla2 , 90\n",
    "tupla4 = tuple (\"ejemplo\")\n",
    "\n",
    "print(\"Tuplas\")\n",
    "print(tupla1)\n",
    "print(tupla1[0:2])\n",
    "print(tupla1b)\n",
    "print(tupla2)\n",
    "print(tupla3)\n",
    "print(tupla4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 49,
     "status": "ok",
     "timestamp": 1690547858664,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "TkR4Xst-vOZQ",
    "outputId": "b9234204-d2c0-4b22-93c7-69c45ff7ab2e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Listas\n",
      "[1, 1, 3, 4, 6]\n",
      "[1, 1]\n",
      "lista2= ['hola', 2, 3]\n",
      "['hola', 2, 3, 90]\n",
      "[['hola', 2, 3, 90], 10]\n",
      "['e', 'j', 'e', 'm', 'p', 'l', 'o']\n",
      "[1, 2, 3, 4, 6]\n",
      "Métodos para definir una lista, mediante una operación sobre otra. Ejemplo con el cuadrado de lista1.\n",
      "Comprensión de listas [1, 4, 9, 16, 36]\n",
      "Bucle for [1, 4, 9, 16, 36]\n",
      "Método funcional [1, 4, 9, 16, 36]\n"
     ]
    }
   ],
   "source": [
    "# Listas\n",
    "'''\n",
    "Una lista es una secuencia mutable y ordenada de elementos que pueden estar duplicados. Pueden ser de\n",
    "cualquier tipo (básico o no). Sus elementos\n",
    "se pueden modificar a diferencia de las tuplas. Se pueden indexar.\n",
    "Sintaxis para declarar una lista: los elementos de la lista se separan usando comas.\n",
    "Se especifica que es una lista cerrando el conjunto entre corchetes [,].\n",
    "'''\n",
    "lista_vacia = []\n",
    "lista1 = [1 ,1 ,3 ,4 ,6]\n",
    "lista2 = [\"hola\" , 2 ,3]\n",
    "lista3 = lista2+[90]\n",
    "lista3b = [lista3, 10]\n",
    "lista4 = list(\"ejemplo\")\n",
    "print(\"Listas\")\n",
    "print(lista1)\n",
    "print(lista1[0:2])\n",
    "print(\"lista2=\",lista2)\n",
    "print(lista3)\n",
    "print(lista3b)\n",
    "print(lista4)\n",
    "# Se cambia un valor. Con una tupla daría error.\n",
    "lista1[1] = 2\n",
    "print(lista1)\n",
    "# Se define una lista a partir de otra, operando sobre los elementos de la primera.\n",
    "#\n",
    "print(\"Métodos para definir una lista, mediante una operación sobre otra. Ejemplo con el cuadrado de lista1.\")\n",
    "# Forma compacta. Comprensión de listas.\n",
    "lista5 = [x*x for x in lista1]\n",
    "print(\"Comprensión de listas\", lista5)\n",
    "# Bucle for actuando mediante adicción de elementos a una lista inicialmente vacía.\n",
    "lista6=[]  # Lista vacía. Se obtendrá el mismo resultado que con lista5\n",
    "for x in lista1:\n",
    "  lista6.append(x*x) # Se le añaden elementos a lista6 en cada iteración del bucle.\n",
    "print(\"Bucle for\", lista6)\n",
    "# Método funcional. Se aplica (map) la función (lambda x: x*x en este caso) a cada elemento de lista1 \n",
    "# que pasa a ser el argumento x de lambda.\n",
    "# El resultado es una secuencia que se convierte a lista.\n",
    "lista7=list(map(lambda x: x*x, lista1)) # La función lambda es una función anónima introducida \n",
    "                                        # en las reglas del cálculo matemático formal.\n",
    "print(\"Método funcional\", lista7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 43,
     "status": "ok",
     "timestamp": 1690547858665,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "F160oQF3vOZR",
    "outputId": "d5a2a696-cdc3-4f10-fc03-3230003f66d1"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Conjuntos\n",
      "{1, 3, 4, 6}\n",
      "{1, 3, 4, 6}\n",
      "{2, 3, 'hola'}\n",
      "{'este', 'ejemplo'}\n",
      "{'e', 'l', 'p', 'j', 'm', 'o'}\n",
      "{'e', 'l', 't', 'p', 'm', 'o'}\n",
      "Conjunto - Intersección con otro conjunto {'j'}\n",
      "Unión {'e', 'l', 't', 'p', 'j', 'm', 'o'}\n",
      "Intersección {'e', 'l', 'p', 'm', 'o'}\n",
      "Unión - Intersección {'t', 'j'}\n",
      "Eliminar j de conjunto4 {'e', 'l', 'p', 'm', 'o'}\n",
      "Añadir s a conjunto4 {'e', 'l', 's', 'p', 'm', 'o'}\n"
     ]
    }
   ],
   "source": [
    "# Conjuntos\n",
    "'''\n",
    "Un conjunto es una secuencia inmutable y desordenada de elementos que no se pueden repetir. Pueden ser de\n",
    "de cualquier tipo (básico o no). No se pueden indexar. Aunque no se pueden modificar sus elementos, sí que\n",
    "se pueden añadir y eliminar.\n",
    "Sintaxis para declarar un conjunto: especificar los elementos separados por una coma y encerrados por llaves {,}.\n",
    "'''\n",
    "conjunto_vacio = set() # Atención al diccionario vacío\n",
    "conjunto1 = {1, 1, 3, 4 ,6}\n",
    "conjunto1b = {1 , 3 , 4 , 6}\n",
    "conjunto2 = {\"hola\" , 2 ,3}\n",
    "conjunto3 = set((\"ejemplo\", \"este\"))\n",
    "conjunto4 = set(\"ejemplo\")\n",
    "conjunto5 = set(\"templo\")\n",
    "\n",
    "print(\"Conjuntos\")\n",
    "print(conjunto1)\n",
    "print(conjunto1b)\n",
    "print(conjunto2)\n",
    "print(conjunto3)\n",
    "print(conjunto4)\n",
    "print(conjunto5)\n",
    "print(\"Conjunto - Intersección con otro conjunto\", conjunto4 - conjunto5) # Elmentos que pertenecen a conjunto4 pero no a conjunto5.\n",
    "print(\"Unión\", conjunto4 | conjunto5) # Unión de conjunto4 y conjunto5.\n",
    "print(\"Intersección\", conjunto4 & conjunto5) # Intersección de conjunto4 y conjunto5.\n",
    "print(\"Unión - Intersección\", conjunto4 ^ conjunto5) # Unión de conjunto4 y conjunto5 menos su intersección.\n",
    "conjunto4.remove('j')\n",
    "print(\"Eliminar j de conjunto4\", conjunto4)\n",
    "conjunto4.add('s')\n",
    "print(\"Añadir s a conjunto4\", conjunto4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 38,
     "status": "ok",
     "timestamp": 1690547858666,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "nMFMMMRyvOZR",
    "outputId": "690d5af3-a7d6-4a95-ab59-5367d61db8fe"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Diccionarios\n",
      "{'rojo': 'red', 'negro': 'black', 'azul': 'blue'}\n",
      "{'rojo': 'red', 'negro': 'black', 'azul': 'blue'}\n",
      "{'rojo': 'red', 'negro': 'black', 'azul': 'blue'}\n",
      "Negro en inglés se dice  black\n",
      "{'rojo': 'rouge', 'negro': 'noir', 'azul': 'bleu'}\n",
      "Negro en francés se dice  noir\n",
      "Se ha añadido la clave amarillo.  {'rojo': 'rouge', 'negro': 'noir', 'azul': 'bleu', 'amarillo': 'jaune'}\n",
      "Se ha eliminado la clave rojo.  {'negro': 'noir', 'azul': 'bleu', 'amarillo': 'jaune'}\n",
      "Diccionario anidado.  {'cuerpos': {'j': 'jurídico', 's': 'sanidad', 'i': 'intervencion', 'm': 'música', 'e': 'eclesiástico'}, 'armas': {'if': 'infantería', 'cb': 'caballería', 'ar': 'artillería', 'ig': 'ingenieros', 'tr': 'transmisiones', 'av': 'aviet'}}\n",
      "intervencion\n"
     ]
    }
   ],
   "source": [
    "# Diccionarios\n",
    "'''\n",
    "Un diccionario es una secuencia de pares de elementos (el primero de cada par se llama clave y el segundo valor) ordenada,\n",
    "en la que los valores se pueden modificar pero las claves no y que no admiten repeticiones de las claves. Las claves funcionan\n",
    "como índices de los valores y pueden ser añadidas o eliminadas junto con su respectivo valor.\n",
    "Sintaxis para declarar un diccionario: los elementos de cada par van separados entre sí por : mientras que los distintos pares van\n",
    "separados por comas y encerrados entre llaves {:, :, :}\n",
    "'''\n",
    "diccionario_vacio={} # Atención que no sirve para declarar el conjunto vacío.\n",
    "diccionario1={'rojo':'red', 'negro':'black', 'azul':'blue'}\n",
    "diccionario2={'rojo':'red', 'negro':'noir', 'negro':'black', 'azul':'blue'}\n",
    "diccionario3=dict(rojo = 'red', negro = 'black', azul = 'blue')\n",
    "diccionario4={'j':'jurídico','s':'sanidad','i':'intervencion','m':'música','e':'eclesiástico'}\n",
    "diccionario4b={'if':'infantería','cb':'caballería','ar':'artillería','ig':'ingenieros','tr':'transmisiones','av':'aviet'}\n",
    "diccionario5={'cuerpos':diccionario4, 'armas':diccionario4b} # Diccionarios anidaddos.\n",
    "\n",
    "print(\"Diccionarios\")\n",
    "print(diccionario1)\n",
    "print(diccionario2) # Con claves repetidas, sólo se toma el último valor que aparezca para una clave dada.\n",
    "print(diccionario3)\n",
    "print(\"Negro en inglés se dice \", diccionario1['negro'])\n",
    "diccionario1['rojo'] = 'rouge' # Cambio de los valores para cada clave.\n",
    "diccionario1['negro'] = 'noir'\n",
    "diccionario1['azul'] = 'bleu'\n",
    "print(diccionario1)\n",
    "print(\"Negro en francés se dice \", diccionario1['negro'])\n",
    "diccionario1['amarillo'] = 'jaune' # Adicción de un elemento a un diccionario.\n",
    "print(\"Se ha añadido la clave amarillo. \", diccionario1)\n",
    "diccionario1.pop('rojo') # Eliminación de un elemento de un diccionario.\n",
    "print(\"Se ha eliminado la clave rojo. \", diccionario1)\n",
    "print(\"Diccionario anidado. \", diccionario5)\n",
    "print(diccionario5[\"cuerpos\"][\"i\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "FLNQhFvPvOZT"
   },
   "source": [
    "# Funciones <a name=\"funciones\"></a>\n",
    "\n",
    "* Una función es un bloque de código que solamente se ejecuta cuando se invoca.\n",
    "* A una función se le pueden pasar datos, llamados parámetros o argumentos de la función, en forma de lista separada por comas dentro de un paréntesis tras el nombre de la función.\n",
    "* Una función puede retornar datos, llamados resultado.\n",
    "* Las variables que se definan dentro de una función toman valores locales que sólo dependen de lo que ocurra dentro de ella, aun cuando su nombre coincida con el de una variable externa a la función, ésta última no se ve afectada.\n",
    "* Si se emplea dentro de una función una variable que no esté definida dentro de ella, se busca asignarle valor a partir del que tenga una variable con el mismo nombre en el código externo a la función. Sin embargo, la variable externa no se ve afectada.\n",
    "* Si se quiere modificar una variable externa dentro de una función, hay que declararla dentro de ésta como 'global'.\n",
    "* Sintaxis: comienza con 'def', sigue con el 'nombre de la función', una lista entre paréntesis de los argumentos y ':' al final del paréntesis. El código que se ejecuta en la función está indentado y la función termina al terminar la indentación."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 33,
     "status": "ok",
     "timestamp": 1690547858667,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "lffS9VWcvOZU",
    "outputId": "eb938643-8a7a-4e73-af6b-42e11c259b4a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ejemplo 1: funciones\n",
      "De los siguientes números  [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4] se comprueba cuáles son negativos\n",
      "-5  es un número negativo.\n",
      "-4  es un número negativo.\n",
      "-3  es un número negativo.\n",
      "-2  es un número negativo.\n",
      "-1  es un número negativo.\n",
      "\n",
      "Ejemplo 2: funciones\n",
      "Polinomio de grado n=2\n",
      " y coeficientes [$a_0,a_{1},..,a_{n-1},a_n$]=[1.0, 1.0, 1.0], en x=2.0 tiene un valor igual a =7.0\n",
      "\n",
      "Ejemplo 3: funciones\n",
      "Para la condición inicial (y0,v0)=( 100.0 m, 50.0 m/s)\n",
      "La altura para un cuerpo en caída libre en t= 5 (s), será de 227.5 m\n",
      "\n",
      "Ejemplo 4: funciones\n",
      "Variable a definida externamente:  3\n",
      "Variable a definida internamente:  2\n",
      "El doble de 5.0 es 10.0\n",
      "Tras ejecutar la función, a vale:  3\n",
      "\n",
      "Variable a no está definida dentro de la función, vale:  3\n",
      "El triple de 5.0 es 15.0\n",
      "Tras ejecutar la función, a vale:  3\n",
      "\n",
      "Variable a global:  4\n",
      "El cuadruple de 5.0 es 20.0\n",
      "Tras ejecutar la función, a vale:  4\n"
     ]
    }
   ],
   "source": [
    "# Funciones\n",
    "'''\n",
    "Ejemplo: encapsulamos parte del código de los ejemplos previos en una función\n",
    "'''\n",
    "print(\"Ejemplo 1: funciones\")\n",
    "\n",
    "def isnegative(x): # Nótense los :\n",
    "    if(a<0.0): #Los paréntesis no son necesarios\n",
    "       print(a,\" es un número negativo.\")\n",
    "\n",
    "rango=list(range(-5,5)) # La definición de 'isnegative' ha terminado antes de ejecutar esta línea.\n",
    "print(\"De los siguientes números \",rango,\"se comprueba cuáles son negativos\")\n",
    "for a in range(-5,5):\n",
    "   isnegative(a)\n",
    "\n",
    "\n",
    "'''\n",
    "Ejemplo: cálculo de un polinomio de grado n\n",
    "'''\n",
    "print(\"\")\n",
    "print(\"Ejemplo 2: funciones\")\n",
    "\n",
    "def polinomio(x,a):\n",
    "    result=0\n",
    "    n=len(a)-1\n",
    "    i=0\n",
    "    for factor in a:\n",
    "         result=result+factor*x**i\n",
    "         i=i+1\n",
    "    return result\n",
    "\n",
    "a=[1.0,1.0,1.0] # a_0*x**(0)+a_1*x**(1)+...a_n*x**n, donde n=len(a)\n",
    "x=2.0\n",
    "pol_x=polinomio(x,a)\n",
    "txt=\"Polinomio de grado n=\"+str(len(a)-1)+\"\\n y coeficientes [$a_0,a_{1},..,a_{n-1},a_n$]=\"+str(a)\n",
    "txt=txt+\", en x=\"+str(x)+\" tiene un valor igual a =\"+str(pol_x)\n",
    "print(txt)\n",
    "\n",
    "'''\n",
    "Ejemplo: cuerpo caída libre\n",
    "'''\n",
    "print(\"\")\n",
    "print(\"Ejemplo 3: funciones\")\n",
    "def y_t(t,y0,v0):\n",
    "    g=9.8\n",
    "    return y0+v0*t-0.5*g*t**2\n",
    "y0=100.0 #m\n",
    "v0= 50.0 #m/s\n",
    "t = 5 #s\n",
    "print(\"Para la condición inicial (y0,v0)=(\",y0,\"m,\",v0,\"m/s)\")\n",
    "print(\"La altura para un cuerpo en caída libre en t=\",t,'(s), será de',y_t(t,y0,v0), 'm')\n",
    "\n",
    "'''\n",
    "Ejemplo: duplicar un valor\n",
    "'''\n",
    "print(\"\")\n",
    "print(\"Ejemplo 4: funciones\")\n",
    "a=3\n",
    "print('Variable a definida externamente: ', a)\n",
    "\n",
    "def duplica(x):\n",
    "    a=2 # Variable a definida para su uso dentro de 'duplica'\n",
    "    result=a*x\n",
    "    print('Variable a definida internamente: ', a)\n",
    "    return result\n",
    "\n",
    "x=5.0\n",
    "y=duplica(x)\n",
    "print(\"El doble de\", x, \"es\", y)\n",
    "print(\"Tras ejecutar la función, a vale: \", a)\n",
    "\n",
    "print(\"\")\n",
    "\n",
    "def triplica(x):\n",
    "    result=a*x\n",
    "    print('Variable a no está definida dentro de la función, vale: ', a)\n",
    "    return result\n",
    "\n",
    "y=triplica(x)\n",
    "print(\"El triple de\", x, \"es\", y)\n",
    "print(\"Tras ejecutar la función, a vale: \", a)\n",
    "\n",
    "print(\"\")\n",
    "\n",
    "def cuadruplica(x):\n",
    "    global a\n",
    "    a=4\n",
    "    print('Variable a global: ', a)\n",
    "    result=a*x\n",
    "    return result\n",
    "\n",
    "y=cuadruplica(x)\n",
    "print(\"El cuadruple de\", x, \"es\", y)\n",
    "print(\"Tras ejecutar la función, a vale: \", a)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "QfKfQlYsvOZX"
   },
   "source": [
    "# Bibliotecas <a name=\"bibliotecas\"></a>\n",
    "\n",
    "&emsp; Son conjuntos de funciones que permiten desarrollar una serie de tareas específicas sin necesidad de que el usuario las tenga que programar por su cuenta."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "hVQexBSHvOZZ"
   },
   "source": [
    "## Numpy <a name=\"numpy\"></a>\n",
    "\n",
    "* Permite operar con vectores/matrices computacionales. Se trata de una estructura de datos que, en otros lenguajes es básica pero no en Python y que se podría considerar como una lista en la que el acceso directo a través del índice es especialmente rápido; pero en la que resulta costoso, en términos computacionales, añadir y suprimir elementos una vez creada. \n",
    "\n",
    "https://numpy.org/doc/stable/user/whatisnumpy.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 28,
     "status": "ok",
     "timestamp": 1690547858668,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "VnSaNZTsvOZa",
    "outputId": "903441c3-b0d5-49da-a361-a4cc3b4db85f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " Ejemplo 1: Ejemplos básicos\n",
      "Dimensión= 2 Shape= (3, 4) Tipo= int64\n",
      "[[1 2 3 4]\n",
      " [1 2 3 4]\n",
      " [1 2 3 4]]\n",
      "[[0. 0. 0. 0.]\n",
      " [0. 0. 0. 0.]\n",
      " [0. 0. 0. 0.]]\n",
      "[[1. 0. 0.]\n",
      " [0. 1. 0.]\n",
      " [0. 0. 1.]]\n",
      "\n",
      " Ejemplo 2: operaciones con vectores de tipo element-wise \n",
      "[ 0.   0.5  1.   1.5  2.   2.5  3.   3.5  4.   4.5  5.   5.5  6.   6.5\n",
      "  7.   7.5  8.   8.5  9.   9.5 10. ]\n",
      "[ 100.     101.275  100.1     96.475   90.4     81.875   70.9     57.475\n",
      "   41.6     23.275    2.5    -20.725  -46.4    -74.525 -105.1   -138.125\n",
      " -173.6   -211.525 -251.9   -294.725 -340.   ]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np # numpy es la biblioteca con la que crear y operar con vectores/matrices y en general \"tensores\"\n",
    "\n",
    "'''\n",
    "Ejemplos básicos\n",
    "'''\n",
    "print(\"\\n Ejemplo 1: Ejemplos básicos\")\n",
    "x=np.array([[1,2,3,4],[1,2,3,4],[1,2,3,4]])\n",
    "print(\"Dimensión=\",x.ndim,\"Shape=\",x.shape,\"Tipo=\",x.dtype)\n",
    "print(x)\n",
    "y=np.zeros(x.shape) # Crear una matriz con las mismas características que otra y rellenarla de ceros\n",
    "print(y)\n",
    "z=np.identity(3) # Crea una matriz identidad nxn. En el ejemplo n=3\n",
    "print(z)\n",
    "\n",
    "'''\n",
    "Ejemplos : operaciones con vectores de tipo element-wise\n",
    "'''\n",
    "print(\"\\n Ejemplo 2: operaciones con vectores de tipo element-wise \")\n",
    "tmin,tmax= 0.0,10.0 #s\n",
    "nopto=21\n",
    "t=np.linspace(tmin,tmax,nopto) #Se define un vector de dimensión (nopto,), con valores en el intervalo [tmin,tmax]\n",
    "y=np.array(t) # copia el vector, matriz, en general tensor t. Sirve para crear un vector y con las mismas dimensiones y valores que t, luego se podrá reescribir.\n",
    "\n",
    "def y_t(t,y0,v0):\n",
    "    g=9.8\n",
    "    return y0+v0*t-0.5*g*t**2\n",
    "\n",
    "y0=100.0 #m\n",
    "v0= 5.0 #m/s\n",
    "\n",
    "'''\n",
    "Python permite cálculos \"element-wise\": un cálculo elemento a elemento de un vector.\n",
    "No hay problema en sustituir en una función lo que\n",
    "en principio son escalares (el tiempo t), por un vector/matriz/.... De la misma forma,\n",
    "el resultado de la función que en principio es un escalar, puede devolver un vector/matriz/...\n",
    "'''\n",
    "y=y_t(t,y0,v0)\n",
    "print(t)\n",
    "print(y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "P_92_vMjvOZa"
   },
   "source": [
    "## Matplotlib <a name=\"matplotlib\"></a>\n",
    "\n",
    "* Es un paquete que sirve para elaborar gráficas.\n",
    "\n",
    "https://matplotlib.org/stable/index.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "executionInfo": {
     "elapsed": 1040,
     "status": "ok",
     "timestamp": 1690571100102,
     "user": {
      "displayName": "Juan Pablo Hierro Alvarez",
      "userId": "16986139430696611049"
     },
     "user_tz": -120
    },
    "id": "5HtVtPrPvOZb",
    "outputId": "53e462f0-00d7-4f96-e6a2-cca2091a3df1"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " Ejemplo 1: cuerpo en caída libre\n",
      "Para la condición inicial (y0,v0)=( 100.0 m, 5.0 m/s)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " Ejemplo 2: representación de un polinomio\n",
      "Polinomio de grado n=3 y coeficientes [a_0,a_1,...,a_n]=[20.0, -4.0, -0.4, 0.1]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAroAAALBCAYAAAC3GAIbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAACN7ElEQVR4nOzdd3gU5frG8e9mU0iA0CFAElpC70WKIBCpgoBiOYI0kUQEC6CCxwbHowhiQ0GDBrCAYBcpQihSBJHeS0JfOlJCT7I7vz/ySw6BDTXJbLk/18UFO9mdffbZTbjzzjvvWAzDMBARERER8TA+ZhcgIiIiIpITFHRFRERExCMp6IqIiIiIR1LQFRERERGPpKArIiIiIh5JQVdEREREPJKCroiIiIh4JAVdEREREfFICroiIiIi4pEUdEVERETEIynoioiI1/r000+pW7cufn5+DB8+3OxyRCSbKeiKiIjXKlmyJMOHD6dr165mlyIiOcDX7AJERERuxnvvvceqVavw8/NjxowZlC5dmt9++40KFSrc9j67dOkCwOzZs7OpSteTE30TcRca0RUREbewadMmli9fzsCBAzl58iTVq1dn4sSJZpfl8tQ38WYa0RUREbewadMmhg8fTsOGDQGIjIzEMAyTq3J96pt4M43oishtadGiBb179za7jNvmrvW7a913ym63s3XrVtq3b5+xbcuWLVSuXDnT/Zo2bYrFYnH659VXX82R2lz5PbnZvol4KgVdEQ+0bds2nnrqKSpVqkRQUBAhISF0796dw4cPu31dBw8eJE+ePDzxxBOZts+fPx8/Pz8GDRqU3WW7PVf9PMDNv5+JiYkEBwdTsmTJjPts3LiRmjVrZnrcsmXLMAzD6Z///ve/Of+CblJufS/cbN9EPJWCrogHmjhxInv27KFHjx6MHTuWRx55hB9++IEePXq4fV2lS5fmySef5JtvvmHfvn0AbN++nYcffpj27dvz3nvv5VT5bstVPw9w8+/npk2bqFWrVsbjzp49y8GDB6lateodPX9qaiqXLl3Cbrdn+ndOy63vhZzqm4jbMETE45w/f/6aba+++qrh4+NjXLx4MVueo3nz5kavXr1MqctmsxkBAQFG//79jRMnThgVKlQwateubZw7d+6m93E79bsCM/ueU27m/Xz99deNF154IeP28uXLjerVq9/xc7/xxhsGkOnPpEmTbmkfrvy9kFN9E3EXOhlNxAMFBQVl/Pv06dOkpqZSqFAhHA4Hqampt7y/lJQUzpw5c822y5cvc+LEiUzbCxcujI+P84NF2VVX6dKl6devH59//jlr167l4sWLLF68mLx58+Zo/bnN1fqeU27m/RwxYkSmxzRu3JhNmzbd8XMPHz78li4U4WrvyY16l1N9E3EbZidtEcleqampRlxcnFGnTh0jMDAw00hV0aJFM+537Ngx47777jOCgoKMihUrGvPnz89yn4sWLbpm1CurP3v27LmjusaPH2/UqVPH8PX1Nd54440sa9q7d68BGIGBgcbq1auv25PsqN8Mudn3nJIT76eZXPE9cZfeiZhBI7oiHqZnz55899139OrVi+eff56iRYvi7+/Ps88+m+mElAEDBhASEsLx48eZP38+jzzyCAkJCRQuXPiafdaqVYv4+PhM24YMGUJISAgvvvhipu0hISF3VFf6laqmTp163df51ltvAWlzLJ3VnN31myE3+55TcuL9NJMrvifu0jsRU5idtEUk+2zZssUAjA8++CDT9kOHDhlWq9UYNGiQYRiGcfbsWcPPz884cOBAxn2aN29uTJw48aaf61bmJd5sXVeKiYnJcgRw9OjRhsViMT755BMjMDDQ6Nu3703Xnc4b5ujeat/HjBljPProo8bjjz9uBAcHG1WqVDESExOzpe6cfj/NlFPvyc28H+7eO5Gc5hoT0UQkW9hsNgAiIiIytqWkpPDkk09it9szlhRKSEggX758hIaGZtyvRo0abNmyxdS6bsYvv/zCsGHDePPNNxkwYADR0dF89dVX7NmzJ9vrvtKFCxfYvn37NfMwb+U+N7OP7HSrfTfjClpmvZ9muZX35Ebvh7f1TuR2KOiKeJDatWsTFBTEc889x8cff8zo0aOpW7cuBw8eBMhYZujcuXMEBwdnemxwcDDnzp0zta4bWbNmDd27d6d79+688sorALz00kv4+PhkHL7NKX///TdVqlThk08+ue373Mw+stOt9v3KK2hZrdYcv4KWme+nWW7lPbne++GNvRO5HQq6Ih6kePHifPfdd/j7+/PSSy8xZcoUhgwZwgMPPICvr2/G2pn58uUjKSkp02OTkpLIly+fqXVdj81m4/7776dOnTp8/vnnGdtLlSrFE088oZEsJ26l77l95TFvfT9v9j253vvh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xmOKFCmS6TWIiIiIZ1HQzQYlS6b9cSZPHqhbN/O2CRPSwrHdDlarwQcfXKR9+zxcfWGqYsXS/mQ3Pz+/TLctFkumbRaLBUi71OzNOnfuHDExMTz77LPXfC08PDzj33nz5s30tRUrVtC9e3dGjBhB27ZtKVCgANOmTeO999676edO1717d5599lk+/vhjpk6dSo0aNTIFeBEREfEuCrom6NsX2raFxEQoX94gODgZyGN2WTf0119/ZYTWU6dOsXPnzoyR2rp167J161YiIiJuaZ/Lly+nTJkyvPLKKxnb9u3bl+k+/v7+2O32G+6rc+fOREdH8/vvvzN16lR69uyZ8bUqVaqQmprKypUradKkCQD//PMPO3bsoGrVqrdUs4iIiLgHnYxmktBQaNEi7W938Z///IcFCxawefNmevfuTdGiRTPW5x06dCjLly9n4MCBrF+/noSEBH799ddrTka7WmRkJPv372fatGns2rWLsWPH8vPPP2e6T9myZdmzZw/r16/nxIkTXL582em+8ubNS5cuXXjttdfYtm0bjz32WKbn6dy5M/369WPZsmVs2LCBxx9/nNKlS9O5c2cAfv75ZypXrnwHHRIRERFXoqArN+2dd97hueeeo169ehw5coTffvstYx3cmjVrsnjxYnbu3EmzZs2oU6cOr7/+OqVKlbruPjt16sSgQYMYOHAgtWvXZvny5RmrMaTr2rUr7dq1o2XLlhQrVoxvv/02y/11796dDRs20KxZs0xTJgAmTZpEvXr16NixI40bN8YwDGbPnp0xbePMmTPs2LHjdlojIiIiLshtpy688847vPzyyzz33HMZS1FdunSJIUOGMG3aNC5fvkzbtm0ZP358xslV3ip93VlIWxP3anv37r1mm3HFMl3pmjZtes3auVdq0KAB8+bNy/Lrzp4HYPTo0YwePTrTtmeffZakpCQAAgIC+OGHH26qxvbt2zvdDlCoUCG++uqrLOvr3bs3vXv3zvLrIiIi4l7cckR31apVxMbGZlo9AGDQoEH89ttvfP/99yxevJhDhw7x4IMPmlSliIiIiOez2WDTpqLYbGZXci23C7rnzp2je/fufP755xRKX8OLtMPOcXFxvP/++0RFRVGvXj0mTZrE8uXL+euvv0ysWERERMQzxcVB5QoGb75Wn4gIX+LizK4oM7ebujBgwAA6dOhAq1at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",
      "text/plain": [
       "<Figure size 800x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "'''\n",
    "Ejemplo 1: representación gráfica de una función\n",
    "'''\n",
    "print(\"\\n Ejemplo 1: cuerpo en caída libre\")\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "tmin,tmax= 0.0,10.0 #s\n",
    "nopto=101\n",
    "t=np.linspace(tmin,tmax,nopto) #Se define un vector de dimensión (nopto,), con valores en el intervalo [tmin,tmax]\n",
    "y=np.array(t) # copia el vector, matriz, en general tensor t.\n",
    "\n",
    "g=9.80665 # Estándar para la Tierra. Calculada a una latitud de 45º.\n",
    "\n",
    "def y_t(t,y0,v0):\n",
    "    return y0+v0*t-0.5*g*t**2\n",
    "\n",
    "y0=100.0 #m\n",
    "v0= 5.0 #m/s\n",
    "y=y_t(t,y0,v0)\n",
    "\n",
    "g=1.625 # Estándar para la Luna.\n",
    "y2=y_t(t,y0,v0)\n",
    "\n",
    "g=3.72076 # Estándar para Marte.\n",
    "y3=y_t(t,y0,v0)\n",
    "\n",
    "print(\"Para la condición inicial (y0,v0)=(\",y0,\"m,\",v0,\"m/s)\")\n",
    "\n",
    "'''\n",
    "Elementos esenciales en una representación gráfica\n",
    "'''\n",
    "# Se llama a las bibliotecas necesarias\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "txt=\"Tierra\"\n",
    "txt2=\"Luna\"\n",
    "txt3=\"Marte\"\n",
    "\n",
    "fig,ax = plt.subplots(figsize=(5,5))\n",
    "ax.grid()\n",
    "ax.plot(t,y, color=\"blue\", linewidth=1,linestyle='-',marker=\".\",markersize=4, markevery=5, label=txt)\n",
    "ax.plot(t,y2, color='green', linewidth=1,linestyle='-',marker=\"v\",markersize=4, markevery=5, label=txt2)\n",
    "ax.plot(t,y3, color='red', linewidth=1,linestyle='-',marker=\"+\",markersize=4, markevery=5, label=txt3)\n",
    "ax.set_ylabel(\"y(m)\")\n",
    "ax.set_xlabel(\"t(s)\")\n",
    "ax.set_title(\"Caída libre y(t)\")\n",
    "ax.legend()\n",
    "plt.show()\n",
    "\n",
    "'''\n",
    "Ejemplo 2: representación gráfica de una función\n",
    "'''\n",
    "print(\"\\n Ejemplo 2: representación de un polinomio\")\n",
    "#\n",
    "# El polinomio es b_0 + b_1*x + b_2*x**2 + ... + b_n*x**n\n",
    "# Se tiene una lista de (n+1) parámetros en b y un valor de la abscisa en x.\n",
    "#\n",
    "# Versión imperativa.\n",
    "#\n",
    "def polinomio(x,b):\n",
    "    resultado = 0.0\n",
    "    n=len(b)-1\n",
    "    i=0\n",
    "    for factor in b:\n",
    "        resultado = resultado + factor*x**i\n",
    "        i=i+1\n",
    "    return resultado\n",
    "#\n",
    "# Versión recursiva terminal.\n",
    "#\n",
    "def polinomio_2(x,b):\n",
    "    n=len(b)-1\n",
    "    return polinomio_rt(b[n], x, b, n)\n",
    "    \n",
    "# Función auxiliar recursiva terminal.        \n",
    "def polinomio_rt(r,x,b,p):\n",
    "    if (p == 0):\n",
    "        return r\n",
    "    else:\n",
    "        return polinomio_rt(b[p-1] + r*x, x, b, p-1)\n",
    "\n",
    "# Se llaman las bibliotecas necesarias.\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "# Se definen los coeficientes del polinomio, se emplearán como variable de entorno\n",
    "a=[20.0,-4.0,-0.4,0.1] # a_0 + a_1*x + a_2*x**2 + ... + a_n*x**n, donde n=len(a)-1\n",
    "txt=\"Polinomio de grado n=\"+str(len(a)-1)+\" y coeficientes \"\n",
    "txtl=txt+\"[a_0,a_1,...,a_n]=\"+str(a)\n",
    "print(txtl)\n",
    "xmin,xmax,nopto=-10.0,10.0,101 # Límites del intervalo donde se define el polinomio y número de muestras\n",
    "'''\n",
    "Para cada valor asignado al vector x mediante el método np.linspace,\n",
    "la función polinomio calcula su valor de modo imperativo.\n",
    "'''\n",
    "x=np.linspace(xmin,xmax,nopto) # Se define un vector de dimensión (nopto,), con valores en el intervalo [xmin,xmax]\n",
    "y1=[polinomio(z,a) for z in x] # a se lee del entorno, z representa cada valor de x\n",
    "'''\n",
    "La forma equivalente utilizando una versión recursiva terminal de la función polinomio.\n",
    "'''\n",
    "y2=[polinomio_2(z,a) for z in x] # a se lee del entorno, z representa cada valor de x\n",
    "'''\n",
    "Elementos esenciales en una representación gráfica\n",
    "'''\n",
    "fig,ax = plt.subplots(figsize=(8,8))\n",
    "ax.grid()\n",
    "ax.plot(x,y1, color=\"blue\", linewidth=1,linestyle='--',marker=\".\",markersize=6,label=\"Imperativo.\")\n",
    "ax.plot(x,y2, color=\"red\", linewidth=1,linestyle='-',label=\"Recursivo terminal.\")\n",
    "ax.set_title(\"$a_0+a_{1} x+...+a_{n-1} x^{n-1}+a_n x^n$\")\n",
    "ax.set_ylabel(\"y\")\n",
    "ax.set_xlabel(\"x\")\n",
    "ax.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "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.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
