{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Parte 4 - SciPy" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u00bfQu\u00e9 es SciPy?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Conjunto de paquetes para computaci\u00f3n cient\u00edfica general\n", "* Integraci\u00f3n, optimizaci\u00f3n, interpolaci\u00f3n, procesamiento de se\u00f1ales digitales, estad\u00edsticas...\n", "* Normalmente interfaces a programas muy utilizados escritos en Fortran, o C++" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Integraci\u00f3n num\u00e9rica" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para integraci\u00f3n num\u00e9rica e integraci\u00f3n de ecuaciones diferenciales, SciPy proporciona el paquete `integrate`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from scipy import integrate" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por ejemplo, supongamos que queremos integrar esta funci\u00f3n:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$f(x) = e^{-x^2}$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Debemos definir una funci\u00f3n en Python cuyo argumento sea la variable de integraci\u00f3n:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def f(x):\n", " return np.exp(-x ** 2)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y ahora simplemente utilizamos la funci\u00f3n `quad`, que recibe como argumentos la funci\u00f3n y los l\u00edmites de integraci\u00f3n." ] }, { "cell_type": "code", "collapsed": false, "input": [ "integrate.quad(f, 0, 5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "(0.8862269254513955, 2.3183115159980698e-14)" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Se devuelve el resultado de la integraci\u00f3n y una estimaci\u00f3n del error cometido." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Puede darse el caso en que nuestra funci\u00f3n dependa de un cierto n\u00famero de par\u00e1metros:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$f(x) = A e^{-B x^2}$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En este caso, debemos seguir respetando que el primer argumento es la variable de integraci\u00f3n, pero a partir de ah\u00ed podemos a\u00f1adir todos los argumentos que queramos:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def f(x, A, B):\n", " return A * np.exp(-B * x ** 2)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "A la hora de integrar esta funci\u00f3n, tendremos que usar el par\u00e1metro `args` para dar valores los argumentos extra de la funci\u00f3n:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "integrate.quad(f, 0, 5, args=(1.0, 1.0))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ "(0.8862269254513955, 2.3183115159980698e-14)" ] } ], "prompt_number": 9 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Ecuaciones diferenciales ordinarias (EDOs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dentro del paquete `integrate` tenemos tambi\u00e9n funciones para resolver ecuaciones diferenciales ordinarias (EDOs), como es el caso de la funci\u00f3n `odeint`. Esta funci\u00f3n puede resolver cualquier sistema del tipo:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por ejemplo, supongamos que queremos resolver la ecuaci\u00f3n diferencial:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$y' + y = 0$$\n", "\n", "$$y' = f(y)$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hemos de definir la funci\u00f3n del sistema, las condiciones iniciales y el vector de tiempos donde realizaremos la integraci\u00f3n." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def f(y, t):\n", " return -y" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "y0 = 1.0" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "t = np.linspace(0, 3)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "sol = integrate.odeint(f, y0, t)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.plot(t, sol)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y se obtiene la soluci\u00f3n esperada: un decaimiento exponencial." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para resolver ecuaciones de orden superior, habr\u00e1 que realizar una reducci\u00f3n de orden:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$y'' + y = 0$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\\mathbf{f}(\\mathbf{y}) = \\pmatrix{y \\\\ y'}' = \\pmatrix{y' \\\\ y''} = \\pmatrix{y' \\\\ -y}$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def f(y, t):\n", " return np.array([y[1], -y[0]])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "t = np.linspace(0, 10)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "y0 = np.array([1.0, 0.0])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "sol = integrate.odeint(f, y0, t)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.plot(t, sol[:, 0], label='$y$')\n", "plt.plot(t, sol[:, 1], '--k', label='$\\dot{y}$')\n", "plt.legend()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\narVEvgf6AAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 20 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Ecuaciones algebraicas no lineales" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El paquete `optimize` contiene unas cuantas funciones para optimizaci\u00f3n con y sin restricciones, minimizaci\u00f3n de funciones, m\u00faltiples algoritmos... Ahora nos vamos a concentrar en la b\u00fasqueda de ceros de funciones, utilizando la funci\u00f3n `root`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from scipy import optimize" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por ejemplo, esta ser\u00eda la funci\u00f3n necesaria para resolver la ecuaci\u00f3n de Kepler:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$M = E - e \\sin{E}$$\n", "\n", "$$F(E) = E - e \\sin{E} - M$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def F(E, e, M):\n", " return E - e * np.sin(E) - M" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "La funci\u00f3n `root` recibe como argumento la funci\u00f3n de la ecuaci\u00f3n, la condici\u00f3n inicial y posibles argumentos extra de la funci\u00f3n." ] }, { "cell_type": "code", "collapsed": false, "input": [ "sol = optimize.root(F, 0.1, args=(0.016, 0.1))\n", "sol.x" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 49, "text": [ "array([ 0.10162317])" ] } ], "prompt_number": 49 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Ajuste e interpolaci\u00f3n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El paquete `optimize` trae tambi\u00e9n funciones para hacer ajustes. Para ver este tema explicado con detalle puedes leer el art\u00edculo [Ajuste e interpolaci\u00f3n unidimensionales b\u00e1sicos con SciPy](http://pybonacci.wordpress.com/2013/08/15/ajuste-e-interpolacion-unidimensionales-basicos-en-python-con-scipy/) y el notebook incluido en los materiales del curso." ] } ], "metadata": {} } ] }