{ "metadata": { "name": "", "signature": "sha256:7cf591a9240964e4db513cade5897e7fba9b3c501b92ece91b4edf5a704c6970" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Taller Python Cient\u00edfico - PyConES 2014\n", "## Parte III: SciPy\n", "\n", "#### Juan Luis Cano, Kiko Correoso y \u00c1lex S\u00e1ez ([@Pybonacci](https://twitter.com/Pybonacci))\n", "#### Fran Navarro, Zuria Bauer y Daniel Domene ([@CAChemEorg](http://twitter.com/CAChemE))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"Licencia
Taller de por Pybonacci y CAChemE se distribuye bajo una Licencia Creative Commons Atribuci\u00f3n 4.0 Internacional." ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "\u00bfQu\u00e9 es SciPy?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[SciPy](http://www.scipy.org/) es un conjunto de paquetes open-source para computaci\u00f3n cient\u00edfica general (mat\u00e9maticas, ciencia e ingenier\u00eda). La mayor\u00eda hacen uso NumPy (biblioteca de Python para matrices multidimensionales), otros ofrecen interfaces a programas muy conocidos y utilizados escritos en Fortran, o C++. SciPy ofrece as\u00ed un gran n\u00famero de algoritmos cient\u00edficos de alto nivel, algunos de los temas cubiertos son:\n", "\n", "* Funciones especiales ([scipy.special](http://docs.scipy.org/doc/scipy/reference/special.html))\n", "* Integraci\u00f3n ([scipy.integrate](http://docs.scipy.org/doc/scipy/reference/integrate.html))\n", "* Estad\u00edstica ([scipy.stats](http://docs.scipy.org/doc/scipy/reference/stats.html))\n", "* Algebra lineal ([scipy.linalg](http://docs.scipy.org/doc/scipy/reference/linalg.html))\n", "* Optimizaci\u00f3n ([scipy.optimize](http://docs.scipy.org/doc/scipy/reference/optimize.html))\n", "* Interpolaci\u00f3n ([scipy.interpolate](http://docs.scipy.org/doc/scipy/reference/interpolate.html))\n", "* Transformadas de Fourier ([scipy.fftpack](http://docs.scipy.org/doc/scipy/reference/fftpack.html))\n", "* Procesamiento de se\u00f1ales ([scipy.signal](http://docs.scipy.org/doc/scipy/reference/signal.html))\n", "* Matrices dispersas ([scipy.sparse](http://docs.scipy.org/doc/scipy/reference/sparse.html))\n", "* Tratamiento de im\u00e1genes multi-dimensionales ([scipy.ndimage](http://docs.scipy.org/doc/scipy/reference/ndimage.html))\n", "* Lectura/escritura de archivos (en ingl\u00e9s, I/O) ([scipy.io](http://docs.scipy.org/doc/scipy/reference/io.html))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Antes de ponernos a programar, vale la pena comprobar si la funcionalidad que deseamos utilizar no est\u00e1 ya implementada en SciPy. Como programadores no profesionales, los cient\u00edficos a menudo tendemos a reinventar la rueda, lo que conduce a errores, c\u00f3digo no optimizado, dif\u00edcil de compartir e imposible de mantener. Por el contrario, los programas de SciPy est\u00e1n optimizados y probados, y por lo tanto deben ser utilizados cuando sea posible.\n", "\n", "Como siempre, para hacer el uso de estas funciones, __importaremos__ lo paquetes que vayamos a necesitar:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " import scipy as ...\n", "\n", "\n", "Bueno, en realidad `SciPy` nos ofrece muchas funciones y rara vez querremos usarlo todo en una misma sesi\u00f3n. __T\u00edpicamente usaremos:__\n", "\n", " from scipy import ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Debido a limitaci\u00f3n de tiempo en este taller, vamos a centrarnos solo en el paquete de integraci\u00f3n. Si quieres, puedes darle un vistazo r\u00e1pido a [Scientific Lectures: SciPy, high-level scientific computing](https://scipy-lectures.github.io/intro/scipy.html) donde puedes encontrar ejemplos m\u00e1s variados." ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Integraci\u00f3n mediante m\u00e9todos num\u00e9ricos con SciPy/Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SciPy proporciona el paquete `integrate` que proporciona algunas __t\u00e9cnicas de integraci\u00f3n tanto de funciones como de ecuaciones diferenciales__. En primer lugar import\u00e9mos el paquete y el resto de librer\u00edas que vayamos a necesitar. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "from scipy import integrate" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Cuadratura de Gauss" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como se puede ver en la [ayuda](http://docs.scipy.org/doc/scipy/reference/tutorial/integrate.html), si queremos realizar una _integraci\u00f3n num\u00e9rica_ de una funci\u00f3n de una variable, podemos utilizar el [m\u00e9todo de cuadratura de Gauss](http://es.wikipedia.org/wiki/Cuadratura_de_Gauss) [`quad`](http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.integrate.quad.html) (aunque tambi\u00e9n podemos usar `trapz`, `simps`...). La forma de acceder a ella tal y como hemos importado el paquete ser\u00eda ejecutando `integrate.quad`. Sin embargo, es m\u00e1s com\u00fan importarla del siguiete modo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from scipy.integrate import quad" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00bfQu\u00e9 es lo primero que necesitamos hacer para integrar una funci\u00f3n? Pues s\u00ed, la funci\u00f3n... definamos una:\n", "\n", "$$f(x) = x sin(x)$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def fun(x):\n", " return x * np.sin(x)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Integraremos la funci\u00f3n en el intervalo $[2, 9]$:\n", "$$ \\int_{2}^{9} x sin(x) dx$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x_inferior = 2\n", "x_superior = 9\n", "\n", "value, err = quad(fun, x_inferior, x_superior)\n", "\n", "print('El resultado es: %f con un error de %e' %(value, err))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "El resultado es: 6.870700 con un error de 2.864870e-13\n" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si lo deseamos, podemos hacer uso de lo que acabamos de aprender en la secci\u00f3n previa de este taller y representar la funci\u00f3n e intervalo de integraci\u00f3n que hemos tomado. F\u00edjate en como hemos hecho uso de $\\LaTeX$ en el t\u00edtulo del gr\u00e1fico." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Vector con valores de la variable independiente\n", "x = np.linspace(0,10,100)\n", "\n", "# Hacemos uso de la funci\u00f3n para obtener los valores\n", "# de la variable dependiente\n", "y = fun(x)\n", "\n", "# Representamos la figura\n", "plt.plot(x,y, linewidth = 2)\n", "\n", "# A\u00f1adimos un t\u00edtulo\n", "plt.title(u'$y = x sin(x)$', fontsize = 25)\n", "\n", "# Creamos el intervalo para sombrear el \u00e1rea de integraci\u00f3n\n", "x_fill = np.linspace(2,9,100)\n", "# Obtenemos los puntos sobre la curva\n", "y_fill = fun(x_fill)\n", "\n", "# Dibujamos el \u00e1rea sombreada\n", "plt.fill_between(x_fill,y_fill, color = 'gray', alpha = 0.5)\n", "\n", "# Representamos los resultados con una gradilla\n", "plt.grid()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nUZj2ZAmLpC1++QUWLvRRqVIh3bptj15QDnFrT5aiipZa3ESTeRH5+fDYY9CmjS2tVKkC995rv05d\ne62d09hJXbvu5KWXFtK9+1Z27vRy2mnw4IMBkuj8siqn996zf/zu3bdRuXLA4WhSgx6Zu9zs2ZCd\nDX/9K+zda0d6rVwJf/87VK8enX2UtWZ+JDVqFPLoo99y2WV2hN+993q4+mo/fn/Em44rrZmHRdIW\nyTaxlttr5mC7HVerZsutGzY4HU1YyifzXbvg+uvtf9sVK+yggGnTYNIkaNbM6ehK5vHAyJE/8+CD\nS0lP9zNunJfhwws5qBeVSSlbtsBXX3nx+QL07p34JZZE4fPZc2lgDwLdIqWT+YcfQrt2th7u88E9\n98CSJTB4cGz2V9GaeWn69t3O448voWrVAiZP9nH66X7XTs9ZnNbMwyraFu+/bwgEhE6dtlOtWmF0\ng3JIItTMITy0/6uvnI2jqJRM5lu3wkUXwRln2O6FvXrZeVQefNCO3kwknTrtYtSoxWRmHuTzz70M\nHernwAGno1LxMGlS6PJwiTndbSLr08fe6pG5gyZNgvbt4Y037AnOUaPsWekTToj9vqNRMy9Jq1Z5\njB6dS61aB5g508t55xVSUBCTXUWN1szDKtIWO3fCF1948XgM/folR70cEqNmDnZsiccDCxfCfpdc\n0CllkvnmzXDeefZn82Z7Tb+lS21/8WSYy6Jp0/088cRSqlXL56OPfFx2mZ+Adm5IWh99BAUFwgkn\nbCcz0+X/uZNQjRrQoYMdGb5ggdPRWEmfzI2BN9+0tfFJk+xZ6GefhRkz7GiueIp2zby4li338thj\nS6lcuZA33/Tyxz/6XdttUWvmYRVpi4kTbY082QYKJUrNHMKlFrfUzZM6ma9fD2eeCRdeCNu2waBB\n8O23tveKJ0lfebt2e/jHP5aSluZn7FgvY8bo4XmyycuDTz+1b+BEvTxcMnBb3TwpU5oxdth9+/a2\nx0qNGnaq2k8/hebNnYsrVjXz4rp23cVf/vIdALfeKnz6qfsOz7VmHlbetvjkEzvLZtu2O6hXLwkm\n6ikiUWrmcHiPFjd8A066ZL5yJZx8Mlx9te1DPmwYLF8OV13lrhnOYu3UUzdz4YVr8fuFc881rFzp\ndEQqWpK1xJJosrKgYUP7rd8Nk24lTTI/cADuv9+Ozpo5E+rVsz1WPvgAGjd2Ojor1jXz4q68ci19\n+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\nbn7mmC/kIgwAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "De forma similar, SciPy dispone de funciones de integraci\u00f3n num\u00e9rica para integrales dobles y triples ([`dblquad`](http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.integrate.dblquad.html#scipy.integrate.dblquad) y [`tplquad`](http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.integrate.tplquad.html#scipy.integrate.tplquad) , respectivamente)." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Ecuaciones diferenciales ordinarias" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para integrar EDOs vamos a usar la funci\u00f3n `odeint` del paquete `integrate`, que permite integrar sistemas del tipo:\n", "\n", "$$ \\frac{d\\mathbf{y}}{dt}=\\mathbf{f}\\left(\\mathbf{y},t\\right)$$\n", "\n", "con condiciones iniciales $\\mathbf{y}(\\mathbf{0}) = \\mathbf{y_0}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SciPy ofrece dos maneras diferentes para resolver EDOs: Una API basada en la funci\u00f3n `odeint` y otra orientada a objetos basados en la clase `ode`. Por lo general, `odeint` es m\u00e1s sencilla de utilizar, por lo que la usaremos en este taller, pero la clase `ode` ofrece un cierto nivel de control m\u00e1s preciso. \n", "\n", "Para poder utilizar `odeint`, debemos de importarlo desde el m\u00f3dulo `scipy.integrate` y definir la funci\u00f3n diferencial a integrar:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from scipy.integrate import odeint" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\\frac{dy}{dt} + y = 0$$\n", "\n", "$$\\frac{dy}{dt} = -y$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def f(y, t):\n", " return -y" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
**\u00a1Importante!**: F\u00edjate que la funci\u00f3n del sistema recibe como primer argumento $\\mathbf{y}$ (un array) y como segundo argumento el instante $t$ (un escalar). Esta convenci\u00f3n va exactamente al rev\u00e9s que en MATLAB y nos equivocamos obtendremos errores o, lo que es peor, resultados incorrectos.
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Condiciones iniciales:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "y0 = 1" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vector de tiempos donde realizamos la integraci\u00f3n:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "t = np.linspace(0, 3)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Integramos y representamos la soluci\u00f3n:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sol = odeint(f, y0, t)\n", "plt.plot(t, sol)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nEZEY+n+a08D97TlJ6AAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tal y como pod\u00edamos esperar, la resoluci\u00f3n de esta ecuaci\u00f3n diferencial devuelve una exponencial negativa.\n", "\n", "En el siguiente notebook, veremos un ejemplo aplicado de la resoluci\u00f3n de un sistema de EDOs para modelar el comportamiento de una epidemia. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Referencias\n", "\n", "* https://github.com/jrjohansson/scientific-python-lectures\n", "* https://scipy-lectures.github.io/\n", "* https://github.com/AeroPython/Curso_AeroPython\n", "* http://cacheme.org/curso-online-python-cientifico-ingenieros/" ] } ], "metadata": {} } ] }