{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "raw", "metadata": {}, "source": [ "Texto y c\u00f3digo sujeto bajo Creative Commons Attribution license, CC-BY-SA. (c) Original por Lorena A. Barba, 2013, traducido por F.J. Navarro-Brull para CAChemE.org " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[@LorenaABarba](https://twitter.com/LorenaABarba)\n", "[@CAChemEorg](https://twitter.com/cachemeorg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "12 pasos a Navier-Stokes\n", "=====\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Continuamos nuestro viaje para resolver la ecuaci\u00f3n de Navier-Stokes con el Paso 4. \u00a1Pero no continues a menos que hayas completado los pasos anteriores! De hecho, el pr\u00f3ximo paso ser\u00e1 una combinaci\u00f3n de los dos anteriores. Las maravillas de la *reutilizaci\u00f3n de c\u00f3digo*!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Paso 4: Ecuaci\u00f3n de Burgers\n", "----\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Puedes leer sobre la ecuaci\u00f3n de Burgers en la [wikipedia (ingl\u00e9s)](http://en.wikipedia.org/wiki/Burgers'_equation).\n", "\n", "La ecuaci\u00f3n de burgers con una dimensi\u00f3n espacial tiene la siguiente forma:\n", "\n", "$$\\frac{\\partial u}{\\partial t} + u \\frac{\\partial u}{\\partial x} = \\nu \\frac{\\partial ^2u}{\\partial x^2}$$\n", "\n", "Como puedes ver, es una combiniaci\u00f3n de convecci\u00f3n y difusi\u00f3n no lineal. Es sorprendente lo mucho que se puede aprender de esta peque\u00f1a y sencilla ecuaci\u00f3n.\n", "\n", "Podemos discretizarla usando los metodos que se han detallado de los Pasos [1](http://nbviewer.ipython.org/urls/bitbucket.org/franktoffel/cfd-python-class-es/raw/master/lecciones/01%2520-%2520Paso%25201.ipynb) a [3](http://nbviewer.ipython.org/urls/bitbucket.org/franktoffel/cfd-python-class-es/raw/master/lecciones/04%2520-%2520Paso%25203.ipynb). Usando diferencias hacia delante para el tiempo, hacia atr\u00e1s para el espacio y nuestro m\u00e9todo de 2\u00ba orden para la segunda derivada, se llega a:\n", "\n", "$$\\frac{u_i^{n+1}-u_i^n}{\\Delta t} + u_i^n \\frac{u_i^n - u_{i-1}^n}{\\Delta x} = \\nu \\frac{u_{i+1}^n - 2u_i^n + u_{i-1}^n}{\\Delta x^2}$$\n", "\n", "Como antes, una vez dadas las condiciones iniciales, la \u00fanica inc\u00f3gina es $u_i^{n+1}$. Despejando, haremos avanzar el tiempo de la siguiente forma:\n", "\n", "$$u_i^{n+1} = u_i^n - u_i^n \\frac{\\Delta t}{\\Delta x} (u_i^n - u_{i-1}^n) + \\nu \\frac{\\Delta t}{\\Delta x^2}(u_{i+1}^n - 2u_i^n + u_{i-1}^n)$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Condiciones iniciales y de contorno (*Initial and Boundary Conditions*)\n", "\n", "Para examinar algunas propiedades interesantes de la ecuaci\u00f3n de Burgers, es \u00fatil usar diferentes condiciones iniciales y de contorno de las que hemos estado usando hasta ahora.\n", "\n", "Nuestra condici\u00f3n inicial para este problema va a ser:\n", "\n", "\\begin{eqnarray}\n", "u &=& -\\frac{2 \\nu}{\\phi} \\frac{\\partial \\phi}{\\partial x} + 4 \\\\\\\n", "\\phi &=& \\exp \\bigg(\\frac{-x^2}{4 \\nu} \\bigg) + \\exp \\bigg(\\frac{-(x-2 \\pi)^2}{4 \\nu} \\bigg)\n", "\\end{eqnarray}\n", "\n", "Esto tiene una soluci\u00f3n anal\u00edtica, dada por:\n", "\n", "\\begin{eqnarray}\n", "u &=& -\\frac{2 \\nu}{\\phi} \\frac{\\partial \\phi}{\\partial x} + 4 \\\\\\\n", "\\phi &=& \\exp \\bigg(\\frac{-(x-4t)^2}{4 \\nu (t+1)} \\bigg) + \\exp \\bigg(\\frac{-(x-4t -2 \\pi)^2}{4 \\nu(t+1)} \\bigg)\n", "\\end{eqnarray}\n", "\n", "Nuestra condici\u00f3n de frontera ser\u00e1:\n", "\n", "$$u(0) = u(2\\pi)$$\n", "\n", "Esto se llama condici\u00f3n de frontera *peri\u00f3dica*. \u00a1Presta atenci\u00f3n! Esto dar\u00e1 un poco de dolor de cabeza si no se anda con cuidado." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Ahorrando tiempo con SymPy\n", "\n", "La condici\u00f3n inicial que estamos utilizando para la ecuaci\u00f3n de Burgers puede ser un poco compleja de evaluar a mano. La derivada $\\frac{\\partial \\phi}{\\partial x}$ no es terriblemente dif\u00edcil, pero ser\u00eda f\u00e1cil cambiar un signo u olvidar un factor de $x$ en alguna parte, as\u00ed que vamos a utilizar SymPy para ayudarnos.\n", "\n", "[SymPy](http://sympy.org/en/) es la librer\u00eda matem\u00e1tica de lenguaje simb\u00f3lico para Python. Tiene muchas de las mismas funciones matem\u00e1ticas que Mathematica con la ventaja a\u00f1adida de que podemos traducir f\u00e1cilmente sus resultados a nuestros c\u00e1lculos en Python (tambi\u00e9n es gratuita y de c\u00f3digo abierto).\n", "\n", "Comenzamos cargando la librer\u00eda SymPy junto con nuestra biblioteca favorita NumPy." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import sympy" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tambi\u00e9n vamos a decir a SymPy que queremos toda la salida de resultados presentados mediante $\\LaTeX$. \u00a1Esto har\u00e1 que nuestro Notebook se vea bonito!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sympy import init_printing\n", "init_printing(use_latex=True)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comenzaremos por la creaci\u00f3n de variables simb\u00f3licas para las tres variables en nuestra condici\u00f3n inicial y escribiremos la ecuaci\u00f3n completa para $\\phi$. Debemos conseguir una versi\u00f3n renderizada de nuestra ecuaci\u00f3n $\\phi$." ] }, { "cell_type": "code", "collapsed": false, "input": [ "x, nu, t = sympy.symbols('x nu t')\n", "phi = sympy.exp(-(x-4*t)**2/(4*nu*(t+1))) + sympy.exp(-(x-4*t-2*np.pi)**2/(4*nu*(t+1)))\n", "phi" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$e^{- \\frac{\\left(- 4 t + x - 6.28318530717959\\right)^{2}}{4 \\nu \\left(t + 1\\right)}} + e^{- \\frac{\\left(- 4 t + x\\right)^{2}}{4 \\nu \\left(t + 1\\right)}}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ " 2 2 \n", " -(-4\u22c5t + x - 6.28318530717959) -(-4\u22c5t + x) \n", " \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", " 4\u22c5\u03bd\u22c5(t + 1) 4\u22c5\u03bd\u22c5(t + 1) \n", "\u212f + \u212f " ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Es quiz\u00e1s un poco peque\u00f1a, pero se puede ver. Ahora, evaluar nuestro derivada parcial $\\frac{\\partial \\phi}{\\partial x}$ es algo trivial." ] }, { "cell_type": "code", "collapsed": false, "input": [ "phiprime = phi.diff(x)\n", "phiprime" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$- \\frac{e^{- \\frac{\\left(- 4 t + x\\right)^{2}}{4 \\nu \\left(t + 1\\right)}}}{4 \\nu \\left(t + 1\\right)} \\left(- 8 t + 2 x\\right) - \\frac{1}{4 \\nu \\left(t + 1\\right)} \\left(- 8 t + 2 x - 12.5663706143592\\right) e^{- \\frac{\\left(- 4 t + x - 6.28318530717959\\right)^{2}}{4 \\nu \\left(t + 1\\right)}}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ " 2 \n", " -(-4\u22c5t + x) -(-4\u22c5t + x - \n", " \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", " 4\u22c5\u03bd\u22c5(t + 1) 4\u22c5\u03bd\n", " (-8\u22c5t + 2\u22c5x)\u22c5\u212f (-8\u22c5t + 2\u22c5x - 12.5663706143592)\u22c5\u212f \n", "- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 - \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", " 4\u22c5\u03bd\u22c5(t + 1) 4\u22c5\u03bd\u22c5(t + 1) \n", "\n", " 2 \n", "6.28318530717959) \n", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "\u22c5(t + 1) \n", " \n", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", " " ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si quieres ver la versi\u00f3n sin renderizar, s\u00f3lo tienes que utilizar el comando de impresi\u00f3n (print) de Python." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print phiprime" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "-(-8*t + 2*x)*exp(-(-4*t + x)**2/(4*nu*(t + 1)))/(4*nu*(t + 1)) - (-8*t + 2*x - 12.5663706143592)*exp(-(-4*t + x - 6.28318530717959)**2/(4*nu*(t + 1)))/(4*nu*(t + 1))\n" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "###\u00bfAhora qu\u00e9?\n", "\n", "Ahora que ya tenemos la versi\u00f3n \"Pythonic\" de nuestra derivada, podemos terminar de escribir la ecuaci\u00f3n de condici\u00f3n inicial y luego traducirlo en una expresi\u00f3n Python utilizable. Para ello, vamos a utilizar la funci\u00f3n *lambdify*, que a partir una ecuaci\u00f3n simb\u00f3lica SymPy la convierte en una funci\u00f3n que se puede ejecutar." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sympy.utilities.lambdify import lambdify\n", "\n", "u = -2*nu*(phiprime/phi)+4\n", "u" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$- \\frac{2 \\nu}{e^{- \\frac{\\left(- 4 t + x - 6.28318530717959\\right)^{2}}{4 \\nu \\left(t + 1\\right)}} + e^{- \\frac{\\left(- 4 t + x\\right)^{2}}{4 \\nu \\left(t + 1\\right)}}} \\left(- \\frac{e^{- \\frac{\\left(- 4 t + x\\right)^{2}}{4 \\nu \\left(t + 1\\right)}}}{4 \\nu \\left(t + 1\\right)} \\left(- 8 t + 2 x\\right) - \\frac{1}{4 \\nu \\left(t + 1\\right)} \\left(- 8 t + 2 x - 12.5663706143592\\right) e^{- \\frac{\\left(- 4 t + x - 6.28318530717959\\right)^{2}}{4 \\nu \\left(t + 1\\right)}}\\right) + 4$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ " \u239b 2 \n", " \u239c -(-4\u22c5t + x) -(-4\u22c5t\n", " \u239c \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\n", " \u239c 4\u22c5\u03bd\u22c5(t + 1) \n", " \u239c (-8\u22c5t + 2\u22c5x)\u22c5\u212f (-8\u22c5t + 2\u22c5x - 12.5663706143592)\u22c5\u212f \n", " 2\u22c5\u03bd\u22c5\u239c- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 - \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", " \u239d 4\u22c5\u03bd\u22c5(t + 1) 4\u22c5\u03bd\u22c5(t + 1) \n", "- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", " 2 2\n", " -(-4\u22c5t + x - 6.28318530717959) -(-4\u22c5t + x) \n", " \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", " 4\u22c5\u03bd\u22c5(t + 1) 4\u22c5\u03bd\u22c5(t + 1)\n", " \u212f + \u212f \n", "\n", " 2 \u239e \n", " + x - 6.28318530717959) \u239f \n", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u239f \n", " 4\u22c5\u03bd\u22c5(t + 1) \u239f \n", " \u239f \n", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u239f \n", " \u23a0 \n", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 + 4\n", " \n", " \n", "\u2500 \n", " \n", " " ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Lambdify\n", "\n", "Para transfomar con lambdify la expresi\u00f3n en una funci\u00f3n que se pueda usar, decimos a lambdify qu\u00e9 variables son las de entradas (t,x,nu) y las de salida (u)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "ufunc = lambdify((t, x, nu), u)\n", "ufunc(1,4,3)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$3.4917066420644494$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "3.4917066420644494" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "###De vuelta a la ecuaci\u00f3n de Burgers\n", "\n", "Ahora que tenemos las condiciones iniciales establecidas, podemos continuar y finalizar la soluci\u00f3n del problema. Podemos representar la condici\u00f3n inicial utilizando nuestro `lambdify`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.pyplot as plt\n", "\n", "### Declaraci\u00f3n de variables\n", "nx = 101\n", "nt = 100\n", "dx = 2*np.pi/(nx-1)\n", "nu = .07\n", "dt = dx*nu\n", "\n", "x = np.linspace(0, 2*np.pi, nx)\n", "#u = np.empty(nx)\n", "un = np.empty(nx)\n", "t = 0\n", "\n", "u = np.asarray([ufunc(t, x0, nu) for x0 in x])\n", "u" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "array([ 4. , 4.06283185, 4.12566371, 4.18849556, 4.25132741,\n", " 4.31415927, 4.37699112, 4.43982297, 4.50265482, 4.56548668,\n", " 4.62831853, 4.69115038, 4.75398224, 4.81681409, 4.87964594,\n", " 4.9424778 , 5.00530965, 5.0681415 , 5.13097336, 5.19380521,\n", " 5.25663706, 5.31946891, 5.38230077, 5.44513262, 5.50796447,\n", " 5.57079633, 5.63362818, 5.69646003, 5.75929189, 5.82212374,\n", " 5.88495559, 5.94778745, 6.0106193 , 6.07345115, 6.136283 ,\n", " 6.19911486, 6.26194671, 6.32477856, 6.38761042, 6.45044227,\n", " 6.51327412, 6.57610598, 6.63893783, 6.70176967, 6.76460125,\n", " 6.82742866, 6.89018589, 6.95176632, 6.99367964, 6.72527549,\n", " 4. , 1.27472451, 1.00632036, 1.04823368, 1.10981411,\n", " 1.17257134, 1.23539875, 1.29823033, 1.36106217, 1.42389402,\n", " 1.48672588, 1.54955773, 1.61238958, 1.67522144, 1.73805329,\n", " 1.80088514, 1.863717 , 1.92654885, 1.9893807 , 2.05221255,\n", " 2.11504441, 2.17787626, 2.24070811, 2.30353997, 2.36637182,\n", " 2.42920367, 2.49203553, 2.55486738, 2.61769923, 2.68053109,\n", " 2.74336294, 2.80619479, 2.86902664, 2.9318585 , 2.99469035,\n", " 3.0575222 , 3.12035406, 3.18318591, 3.24601776, 3.30884962,\n", " 3.37168147, 3.43451332, 3.49734518, 3.56017703, 3.62300888,\n", " 3.68584073, 3.74867259, 3.81150444, 3.87433629, 3.93716815, 4. ])" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.figure(figsize=(11,7), dpi=100)\n", "plt.plot(x,u, marker='o', lw=2)\n", "plt.xlim([0,2*np.pi])\n", "plt.ylim([0,10])" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\begin{pmatrix}0, & 10\\end{pmatrix}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ "(0, 10)" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nRK5CYII=\n", "text": [ "" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Esta definitivamente no es la funci\u00f3n del sombrero que hemos estado tratando hasta ahora. Nosotros lo llamamos una \"funci\u00f3n de diente de sierra\" (*saw-tooth function*). Vamos a continuar y ver qu\u00e9 pasa.\n", "\n", "Nota: Para ejecutar este cuaderno, se supone que tienes en ejecuci\u00f3n el servidor de notebook usando: `ipython notebook --pylab inline`. Para ello, basta con poner el comando anterior en la ventana de comandos (cmd.exe o terminal si estas en windows, linux o mac)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Condiciones de contorno peri\u00f3dicas\n", "\n", "Una de las grandes diferencias entre el paso 4 y las lecciones anteriores es el uso de las condiciones de contorno *peri\u00f3dicas*. Si haces experimentos con los Pasos 1 y 2 y realizas la simulaci\u00f3n durante m\u00e1s tiempo (aumentando `nt`) te dar\u00e1s cuenta de que la onda seguir\u00e1 movi\u00e9ndose hacia la derecha hasta que ya ni siquiera aparece en la malla.\n", "\n", "Con condiciones de contorno peri\u00f3dicas, cuando un punto llega al lado derecho del cuadro, que *retorna* de vuelta a la parte izquierda del mismo.\n", "\n", "Recordemos la discretizaci\u00f3n que nos sali\u00f3 a principios de este notebook:\n", "\n", "$$u_i^{n+1} = u_i^n - u_i^n \\frac{\\Delta t}{\\Delta x} (u_i^n - u_{i-1}^n) + \\nu \\frac{\\Delta t}{\\Delta x^2}(u_{i+1}^n - 2u_i^n + u_{i-1}^n)$$\n", "\n", "Qu\u00e9 *significado* tiene $u_{i+1}^n$ cuando $i$ llega al final del borde?\n", "\n", "Piensa en ello durante un minuto antes de continuar. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "for n in range(nt):\n", " un[:]=u[:]\n", " for i in range(nx-1):\n", " u[i] = un[i] - un[i] * dt/dx *(un[i] - un[i-1]) + nu*dt/dx**2*\\\n", " (un[i+1]-2*un[i]+un[i-1])\n", " u[-1] = un[-1] - un[-1] * dt/dx * (un[-1] - un[-2]) + nu*dt/dx**2*\\\n", " (un[0]-2*un[-1]+un[-2])\n", " \n", "u_analytical = np.asarray([ufunc(nt*dt, xi, nu) for xi in x])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.figure(figsize=(11,7), dpi=100)\n", "plt.plot(x,u, marker='o', lw=2, label='Computational')\n", "plt.plot(x, u_analytical, label='Analytical')\n", "plt.xlim([0,2*np.pi])\n", "plt.ylim([0,10])\n", "plt.legend()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nYH311VfVxr1QlRszZoz+/Oc/V3uuf//++vTTT3XDDTdIkgYMGKCAgAB99NFHSklJUUREhO21GRkZ\nuu222xQSEqLg4GBNnz5dkmQ2mzVixAgFBwerY8eOuueee5Sbm+vcf5wmRhgEAAAu9/bbb+uuu+7S\nnXfeqaSkJB0/ftz23AcffKDExESdPn1aPXr0UEJCgu25IUOGaPv27Tp9+rQmTpyo8ePHV1tmvlDt\nu++++/Svf/3L9vj27duVmZmpsWPHasOGDZKkn376Sfn5+Ro/fny1aysrK9PYsWPVrVs3HTp0SEeP\nHtWECRNszyckJCgrK0s///yzMjIylJiY6NR/m6bm1dQXAAAAXM/0B+fc12aZV/el1q+++kpHjx7V\nLbfcooCAAPXp00fvvvuuZs2aJUm67bbbNHjwYEnSpEmTNHv2bNt7J02aZPt89uzZWrBggfbu3auY\nmJhqc4wbN07Tpk2T2WxWdHS03nnnHU2YMEFeXr8cdbZu3aqsrCwtWrRIHh7WOtm1114rSYqOjlZ0\ndLQkKTg4WE888YTmz59f53+D5owwCACAAdQnxDnLW2+9pbi4OAUEBEiSxo8fr7feessWBkNDQ22v\n9fX1VUFBge3rxYsX6x//+IcyMzNlMpmUl5enEydO2M3h4+OjO++8U++8847mzZun999/Xx9//PEl\nXV9GRoaioqJsQbCqnJwczZw5U1999ZXy8/NVXl6u9u3b1+n7b+4IgwAAwGXOnTunDz/8UOXl5QoL\nC5MkFRcXKzc3Vz/99NNFO3E3btyoRYsWad26derbt68kqX379rU2gkyZMkWTJ0/WtddeKz8/P119\n9dWXdI0RERE6fPiwysrK5OnpWe25Z555Rp6entq5c6fatm2rTz/91HY/obvgnkEAAOAyn376qby8\nvPTzzz9r+/bt2r59u37++Wddd911evvtty/63vz8fHl5eSk4OFglJSWaP3++8vLyan39sGHDZDKZ\n9OSTT2ry5MnVngsNDZXZbHb4viFDhigsLExPP/20CgsLVVRUpM2bN0uSCgoK1KZNGwUGBuro0aNa\ntGhRHf8Fmj/CIAAAcJm3335bDzzwgLp06aKQkBCFhIQoNDRUjz/+uN59912VlZXZVQcvfD169GiN\nHj1aPXv2VNeuXeXr66vIyMhqr6v53smTJ2vHjh265557qj2emJioKVOmqF27dlq+fHm193p6emrF\nihVKS0tTZGSkIiIi9OGHH0qS5s2bpx9++EFBQUEaN26cbr/99ha/r2BNJouLNt0xmUzs5wMAQCPh\n767VO++8ozfeeEOpqalNfSlNorbfg4v9flAZBAAAbqGwsFCvvfaapk6d2tSX0qIQBgEAQIuXlJSk\nkJAQhYWFaeLEiU19OS0Ky8QAALgB/u5CYpkYAAAAdUQYBAAAMDDCIAAAgIFxAgkAAG6gXbt2brf/\nHequXbt2dX4PDSQAAABujgYSAAAAOEQYBAAAMDDCIAAAgIERBgEAAAyMMAgAAGBghEEAAAADIwwC\nAAAYGGEQAADAwAiDAAAABkYYBAAAMDDCIAAAgIERBgEAAAyMMAgAAGBghEEAAAADIwwCAAAYGGEQ\nAADAwAiDAAAABkYYBAAAMDDCIAAAgIERBgEAAAyMMAgAAGBghEEAAAADIwwCAAAYGGEQAADAwAiD\nAAAABlbvMPjCCy+ob9++iomJ0cSJE1VcXOzM6wIAAEAjqFcYPHjwoN544w398MMP2rFjh8rKyvT+\n++87+9oAAADgYl71eVNgYKBatWqlwsJCeXp6qrCwUJ07d3b2tQEAAMDF6hUG27dvr9/97neKjIyU\nr6+v4uPjddNNN9m9LjEx0fZ5bGysYmNj63udAAAAuEQpKSlKSUm5pNeaLBaLpa4TmM1mjRs3Ths3\nblRQUJDGjx+vO+64Q5MmTaoc2GRSPYYGAACAk10sl9XrnsHvvvtO11xzjTp06CAvLy/ddttt2rx5\nc4MuEgAAAI2vXmGwd+/e2rJli86dOyeLxaI1a9aoT58+zr42AAAAuFi9wuCAAQM0efJkDR48WP37\n95ckTZ061akXBgAAANer1z2DlzQw9wwCAAA0C06/ZxAAAADugTAIAABgYIRBAAAAAyMMAgAAGBhh\nEAAAwMAIgwAAAAZGGAQAADAwwiAAAICBEQYBAAAMjDAIAABgYIRBAAAAAyMMAgAAGBhhEAAAwMAI\ngwAAAAZGGAQAADAwwiAAAICBEQYBAAAMjDAIAABgYIRBAAAAAyMMAgAAGBhhEAAAwMAIgwAAAAZG\nGAQAADAwwiAAAICBEQYBAAAMjDAIAABgYIRBAAAAAyMMAgAAGBhhEAAAwMAIgwAAAAZGGAQAADAw\nwiAAAICBEQYBAAAMjDAIAABgYIRBAAAAAyMMAgAAGBhhEAAAwMAIgwAAAAZGGAQAADAwwiAAAICB\nEQYBAAAMjDAIAABgYIRBAAAAAyMMAgAAGBhhEAAAwMAIgwAAAAZGGAQAADAwwiAAAICBEQYBAAAM\njDAIAABgYIRBAAAAAyMMAgAAGBhhEAAAwMAIgwAAAAZGGAQAADAwwiAAAICBEQYBAAAMjDAIAABg\nYIRBAAAAAyMMAgAAGBhhEAAAwMAIgwAAAAZGGAQAADAwwiAAAICBEQYBAAAMjDAIAABgYIRBAAAA\nAyMMAgAAGBhhEAAAwMDqHQbPnDmjO+64Q5dffrn69OmjLVu2OPO6AAAA0Ai86vvGmTNn6uabb9by\n5ctVWlqqs2fPOvO6AABwW6Xlpdp1bJe2Ht2qtNNp6tm+p67odIX6hvSVj5dPU18eDMZksVgsdX1T\nbm6uBg4cqPT09NoHNplUj6EBAHA72QXZSj2Uqm+OfqOtR7dqW9Y2RQRFaEjnIbqs/WXad3Kftuds\n1/6T+xXdPloDQgfomohr9NvBv5WHiTu60HAXy2X1qgweOHBAHTt21P3336/t27dr0KBBWrJkifz8\n/Kq9LjEx0fZ5bGysYmNj6zMdAAAtytmSs0o9lKrV6au1Jn2NMvIyNDxquIZ2HqrEGxI1OHywgnyC\n7N5XXFqs3cd368fsH/X8V8+rV4deGtl9ZBN8B2jpUlJSlJKSckmvrVdl8LvvvtOwYcO0efNmXXXV\nVZo1a5YCAwM1f/78yoGpDAIADKLcUq5tWduUZE5SsjlZ32V+p0HhgzSq+yiN6j5Kg8IHycujbvWX\nZd8s05ajW/Tube+66KphJBfLZfUKg9nZ2Ro2bJgOHDggSfrqq6/04osv6vPPP7+kSQEAaOmy8rOU\nbE5WkjlJq9NXK9gvWPHR8YqLjtPwqOHyb+3foPFPFp5U9NJoHZh5QO182znpqmFUTl8m7tSpkyIi\nIrRv3z717NlTa9asUd++fRt0kQAANGfFpcX66vBXSjInKcmcpIzcDI3sPlLx0fF68aYXFRkU6dT5\nOvh1UHyPeL2/8309ctUjTh0bqKpelUFJ2r59ux566CGVlJQoOjpab775poKCKu9/oDIIAGjJLBaL\n9p3cZwt/Gw9tVN+QvoqPjld8dLyu6nxVnZd+6yopLUlz1s/Rtw9/69J54P6cvkzc0EkBAGiOcoty\ntfbAWmsATEtSmaXMFv5Gdh+p9r7tG/V6ysrL1HVJV62cuFL9Q/s36txwL4RBAAAcKCsv0/dZ3ysp\nzVr9256zXddGXGsNgD3idXnw5TKZTE16jXPXz1VBSYH+FP+nJr0OtGyEQQAAKmTmZ9rC35r0NQr1\nD7VV/4ZHDZdvK9+mvsRqzKfMGvb3YToy+4hae7Zu6stBC0UYBAAYVlFpUWXjR1qSjuQd0U3db7J1\n/kYERTT1Jf6i2H/GavqQ6bq9z+1NfSlooZzeTQwAQHO0cmWqlixN0hmPXOWF7lPAFXnae263+oX0\nU7fy3vJdM0gxJ29Vrne5Os24TBFXNv8gKEkPDHxA//jxH4RBuARhEADQ4qxcmaqlS5NVXOwlb+9S\nPfDoMG3P/0F//vI/yu9zWjKVSeZ4tf3olCYPmyvLkQB98EGSTp5caBvDbE6wfV51rBkz4jRmzPCm\n+LZqdfvlt2vWqlnKzM9UeEB4U18O3AzLxACAZqtm6JsxI06SNGPWl0o/9xspOknqkSR1+laeR0NV\ntvcJyRwvHb9c0oXGj7mSLJIW2I0fHPywPD1DlJNTGRKjoxO0ZEl8swuEU1dMVfd23fX0dU839aWg\nBeKeQQBAi7NyZapmzkyS2VwR1AIyFXjlVBV32avizqelglBr8EsbLR26Xir9raS37MYJCUmUp6eU\nlZXoYJYJkt63ezQ+fq5WrXrOmd9Og205skWTP5msvY/vbfIOZ7Q83DMIAGjWHFUAX/rjFzJbRkpx\nT1orgIFHlZd+k7S7o7RinZRX/X4/f/9iFRTYjz1wYJksFouysuyf8/X11rlz9o8XFXk66Ttznqs7\nXy0vDy9tytik6yKva+rLgRshDAIAGk1ty77WCuACKXivFJ2k1e8/IMvQDKl7qpQWL614Qzp6lWTx\nlI/PBBUV2Td+9OwZoNzchMpKoqTo6Gc0ffpoSdZ7BGs+Fxjor23b7K/z/PkyJ3/nDWcymayNJNv+\nQRiEU7FMDABoFHbLvpI6df2dzoXtUm5wpLX6Z7JYw585Xkp/Vyr6xG6cK698WLm5IXbBbskSa+hb\ntmy1ioo85eNTpunTR9nu/Vu5MtXuOUl21yQ9o9atR+upp6Rvv21ejSU5BTnq/VpvHZ51WAHeAU16\nLWhZuGcQANCoHFUAly5NVvLqP0jh31mbPqKTpNCfpMOBkvkpawg80VsXGj/69p2moqLgOoe++lzr\nhbFaty5TWdkorVsnSUmSml9jyTV/v0Yv3vSihkc1rwYXNG+EQQBAo3HU+OHTd6qKI/bL0u2kVNCp\nsvp36Hp5e96v4mLHTRzTp49yWui7VBaL1KvXHO3fb9993BwaS8Z/NF53XH6H7up3V5NeB1oWGkgA\nAC5RswL4yCNxeu6FL2S23FTZ+BGQqaL0m6S0IClprZTXpdoYffvXfq/fmDHDG70SZzJJ4eFe2r/f\n/rnm0FgS5h+mrAIH3TBAPREGAQD1UlkBrGz8SF7+gDQyQzpW0fjx2d+kzMGSxVM9ekyTpeNfZM6r\nHvrmz79XkrRs2dwqFcDRTboc6+1d6vBxH5+mbywhDMLZCIMAgIuqWf178ME4FZv6a9bSpTrVp700\nrmtl48e2F2X65F1ZCu0bP6KjQyqWfR2Hvqa+F6+qGTPi7LqPIyIqO5ObUnhAuHaf2N3UlwE3QhgE\nAEj6hW1f0ufbGj+SkyZJoSelruFS2mPSllnVTvzo03e1ioqaz7JvfVy4xmXL5mrHDk9lZpapa9em\nrVZeEBYQpqx8KoNwHhpIAAAOt31p33WGzoXv1LnwjlL3NVJBmK3xo23uOgW39VJamuMmi6Zo/HCV\njAypRw/p/Hlp506pT5+mvZ4dOTs04eMJ2vXorqa9ELQodBMDAGwcVQBffTVZa1LmSJEbK7d9CciU\n0gMk87OSOa5a48cNNyTqqadG2AXIC1u/tNTgV5tHH5X+8hdpwgTpvfea9lpOFJ5Qz2U9der3p5r2\nQtCiEAYBAJJqVgAtUvAetbp8hs5H7pciT0rHYqzVv7TRUuZg+flOUmFh7Wf3OtrI2d2CoGStDkZH\nS6WlTV8dtFgs8lnoo9ync+Xj5dN0F4IWhTAIAAZUswJ4//1xWrD4M+06N9Ra+YtOrnLixy4pfaVU\n1K7aGBc77cMdQ9/FPPKI9Ne/SnffLf373017LZF/ilTq/anq2rZr014IWgzCIAC4sUtt/FCP/5VC\njkmHR1o3fK5y4kfv3tN0/rzrT/toyQ4ftt47WFoq7dolXX55013L1X+7Wq/Gv6phEcOa7iLQorDp\nNAC4KUeNH9/tq2j8GNhRuj1Eyg+3hr/1b8rz6OsqK15uN05UVMvZ9qWpREZKDzwgvf56qkaMSFav\nXk13ZnF4QLgy8zMbdU64L8IgALQQjiqAf/pTssyH5krdV9saP04FZErpgVLavVLSK1J+Z9sYvfsu\nb/HbvjSlq69O1euvJyk7e6Gys62Pmc0Jkho3MLPxNJyJMAgALYCjxo/1L1U0fjy1VMqJsVb/Kk78\nsDZ+3G83TpcuF68A4uLefz9Z0sJqj5nNC7Vs2VzCIFoswiAANDM1K4D33RenBX/8P5m9h0njHrZW\nACWdTxst/VAoffyjVNS22hi9ezev837dRXGx4z+bjX1mcVhAmDZnbG7UOeG+CIMA0ER+sfGj87fW\n837XTpTijkmHd1urf1/Prt740XmRXehrjuf9uoPmcmYxlUE4E2EQAJoAjR8tk6Mziy9UXBsTR9LB\nmdhaBgBcyFH1b8yY4brppjlau+HCiR+rrEu//tnWEz/SKk78qNL40bfvNBUVOd76hcDXuFauTNX8\n+au1daun/P3L9P77jb/VTnZBtvr/pb+OPXWsUedFy8U+gwDQBOyrfxYF9fit/GJaK8tvlRSZI+X0\nt533q8xBFz3xw53O+23piouldu2kc+eknBwpJKRx5y8rL5PPQh8VPlOoVp6tGndytEjsMwgALuao\nArh4cbLMR5+U+iy3nvjRI0m5FpNyzR2kHwZIH/+Nxo8Wyttbuu46afVqKSVFuvPOxp3f08NTHf06\nKudsjroEdvnlNwAXQRgEgAaqVgE0lUmdv9XaP/2XyqLTpGFLpMPXVTR+/E460UuXX/4HzZkzQs8+\nS+NHSzZihDUMrlvX+GFQqrxvkDCIhiIMAkAd1KwA3nlnnF78n+UyBw6Qxt8pdVsr5YerzBwvrTdJ\nh5OkUp9qY0RGlmnixOEKCqo99BH+mr8RI6z/XbeuaeanoxjOwj2DAOBAbdu+zJiRpPTDc6Wo1Iql\n37cl/wIp/dcV9/5VNn706TNNxcU0fbir0lKpQwcpL896bnFEROPO//CKhzU4bLCmDZ7WuBOjReKe\nQQCoA0eNH9+kT9O5zrtVco2/dFdIZePH/62U1/FFKi2xb/qIiOC0D3fm5SXdcIO0YoW1OjhlSuPO\nH+YfpswCzidGwxEGARjaxRs/PrKd95tr8ZDSvKXvZ0vL36/W+NGrb3vO+zWoESOaLgyGB4Trh6wf\nGndSuCXCIADDctj48cqFxo+l1saPtHhp85PSiV5q0+ZunT17m904nPdrXFXvG7RYJJOp8ebmnkE4\nC2EQgCHUrADecUecXvpLzcaPzipLi5fWe0iHV9k1fvTqxbYvqK5fPyk4WDpyREpLky67rPHm5hQS\nOAthEIBbqa3xY/r0JB3ImCNFbbSe9/vj7dKoisaP/b+SVv2peuNH1HNs+4Jf5OEh3Xij9NFH1upg\no4ZBKoNwEsIgALdRa+NH+G6VXOsvRYRIOQNsjR+tTizS+eK6N34Q/lDViBGVYXBaIzb2hvqH6vjZ\n4yorL5OfmXUoAAAgAElEQVSnh2fjTQy3w9YyAFqc2s77jY2dow3f/E7qvsbW+CGLh2T2ltJelA6M\nqNb4wXm/cIZ9+6RevaSOHaXsbGu1sLF0XNRROx/ZqVD/0MabFC0SW8sAcBt21T9TmTYffkCeb7yp\n3B5rpGto/EDjuuwyqXNn6ehRadcuKSam8eYO8w9TZn4mYRANQhgE0GzVrABOnx6nF19Mlvn4I9LA\nv1urf93WqiC/s5TWRqaU4bIc+juNH2hUJpN1qfidd6xLxY0ZBsMDwpVVkKWBGth4k8LtEAYBNLna\nmj5sFUCvc1JUqla/9pQsA9Kka/8qmUdJ+2+WVr0q5Yerf/9EJS4aoaeeovEDja9qGJw5s/HmpaMY\nzkAYBNCk7Js+pJ27nlFx4AGdDLlKGhYvRWyWcgbIkjZW+r8NUmaSZKl+w3xYWJl+85vhat2a837R\n+G680frflBTrMXVejfTXlY5iOANhEECjcVQBXLo02RoEfU9ZGz+ik5QZnSxZTktpgdL306TlH9ga\nP/r2PaIin2cdLvlKYtkXTSIqSoqOlsxmads26aqrGmfeMP8w7Tm5p3Emg9siDAJoFHYVQI9SbTr8\noIo675MeXCuF7JIOXS+Z46VN/6VW+c/qfMnrduPQ9IHmqkePVJnNyZowwUs9elR2ubtSWECY1h9c\n79I54P4IgwCczlHjx/PP12j86L5GZ3MjJHOxtO41awdwmbdtjJgrA2n6QIuxcmWqfvwxSdJCpadL\n6emS2ZwgybW3J1zoJgYagn0GAThVtQpgReOH6bJnZemeJvmbrI0f5njJHCflh6tbt2ny8HC8158k\nLVu2ukoFcBQhEM1SfPwcJScvcPD4XK1a9ZzL5j1w+oBi34rVoVmHXDYH3AP7DAJwiaoVwFatSnXj\njaP02kf/VmZIr8rGj+wrZDGPq2j8WGXX+NGzJ6d9oOUrLnb857SoyLUng4QFhCm7IFsWi0Umk8ml\nc8F9EQYB/CJHjR8Wi/Too0nKOPE7W+PHmhPjpFiTlDbBQeNHRq2NHyz7oqXz9i51+LiPT5lL5/Xx\n8pFfKz+dOndKHfw6uHQuuC/CIICLctT48dXBB1XUZbfK4z2ljsuqNX54n52r4iIaP2AsM2bEyWx2\nfI+rq13YXoYwiPoiDAKQ5Lj6Fxc3XH/4Q7LMx38rXfk361m/3deqMDdCMpdJa5fYNX706NtORUU0\nfsBYLvxez507V9u2eapDh7JGO+P6wsbT/UL6uXwuuCcaSADYV/+8zsm71/0q7Vqusq7rJT9J6aOs\n5/2a46SCMAUGTlBe3vt2Y8XHz62oANL4AeM5cEDq3l3q1EnKaqS9oO/5zz2Ki47T5AGTG2dCtEg0\nkACwqVkBfOCBOD3/QpLMeROlYa9Yq38Rm1WcfYVk9pTPl7eo6MAbksWj2jg9enDeL1BTVJTUpo2U\nnS2dOCEFB7t+zrAAtpdBwxAGATf1i+f9Vpz4kfzvGdJIs1T2b+t9f9/9VvroQ6k4SEOHJmrO0hGa\nOXMu5/0Cl8DDQ+rXT/rmG2nHjspj6lwp3D9cB3MPun4iuC3CIOCGHJ33+/22/9a59ntVGBEj3ThU\n6rhbOjRcSntQnlu+VNmxlZKqb00RFFRmC3ds/QJcmpiYxg2DYQFh+vrI166fCG6LMAi0cI4qgIsX\nV5z3G5hhPe0jOkknu6+VciWlXSatfV46fK2t8aN3350qCpjDeb+AE8TEWP+7Y0fjzHehmxioL8Ig\n0II5avxYd/h+lUbtkx77j+R33Nr4sW+s9OVS+ZU/ocLCl+zGYdsXwHkuhMGdOxtnvgvdxEB90U0M\ntBA1K4DjxsVp6bIk7T9zt7Xpo0eS1OVrKXuglHZaMr8pZV1ZrfHjyisfVm5uiMOj3wh+gHMcPy6F\nhEj+/lJurvU+QlfKL85Xpz92UsF/F3AKCWp1sVxGGASamdoaPx57LEmHDlU2fij6eamHWSoLtjZ+\npMVLB0ZIxUHq02eaios57xdoKp06STk5Unq61K2b6+fzf95fR2cfVZBPkOsnQ4vE1jJAC+Go8ePr\nb/5bRR326ny3GGlU9caPVlu/1Pls+8aPiAjO+wWaUkyMNQzu2NE4YTA8IFxZBVmEQdQLYRBoIjUr\ngI88Eqfnn69o/Ag6bFv6ze+2rtbGj559d6qojePGD5o+gKYTEyOtWWMNg7fc4vr5Ltw32Du4t+sn\ng9shDAIu5GjJd8yY4fYVwFaFSk5/QOqxT3rsY6nNcetJH3vHSV8sU4DpCeXn0/gBtBT9Kk6Ga7Qm\nEjqK0QCEQcBFHC357t2boORk6YMPk5RTfrc07I/VGj9M5vOyfPKOXePHZVdy2gfQkjT69jJ0FKMB\nCIOAEziqAC5dmlwtvMn3lA7599fSQzOkiemVJ358+6j04XKpOFB9+k5Tke8nMlsG297GaR9Ay9O3\nr2QySXv3SiUlUuvWrp2PyiAagjAINJCjCuDWrQkqKimQIjZXbvtS0fjhlxWmTqnXKP2711Sz8eOX\nln0Jf0DL4OcnRUdLaWnSnj1S//6unS/MP0w/Zv/o2kngtgiDQB3UrAA+9liVpg/J1vhxpsdeqdsK\nKXeDdcuXKo0f18fP1fTEUZo5k8YPwJ3FxFjD4I4djRAGA6gMov4Ig4ADte31V7MCmLz+v6So/dLo\nWdYKoN8J64kfe29R55985V0SqfR0x4FPYtkXcGf9+kmffNI49w2GB4RzzyDqjTAI1OBo2ffHHxN0\n/vwZnT79ZylkZ8XS7yqpyxYp20dKGyzVaPzoF7//F5d8CX+A+2rMY+m4ZxANQRiEoTmqAP7xjzUb\nP07qWMf+Uo8EKTpCKmttXfr99jHpw4/Vt8dTKioqlDmzetMHS76AsTVmR3Fbn7YqKStR4flC+bXy\nc/2EcCsNCoNlZWUaPHiwunTpohUrVjjrmoBG4agCmJKSoJLSAilik7XpIzpJCt4jHRquVoeDdH7j\nl9KpHqra+MFefwAc6dFD8vaWDh+2nlEc5MLDQUwmkzr5d1JWfpai20e7biK4pQaFwSVLlqhPnz7K\nz8931vUALlG1Ati6daluuilO//u/9o0fJT321Gj8eMHW+BFz5cPKbfdPmU/R9AHgl3l5SX36SNu2\nWZeKr73WtfNdWComDKKu6h0Gjxw5oi+++EIJCQl65ZVXnHlNQL05WvYtL5cefTRJR45UhrjVKQ4a\nP8xx0t5fq2ean8pyI+06fdnrD0Bd9etnDYM7djRCGAwIU2Z+pmsngVuqdxh84okntGjRIuXl5dX6\nmsTERNvnsbGxio2Nre90wC9ytOy7aVOCiorOqKzsz1LIjsql3y5bZMrxkWW/feNHt/j9mj6fvf4A\nNFxjNpHQUYyqUlJSlJKSckmvrVcY/PzzzxUSEqKBAwdedKKqYRBwppoVwHvvjdOiRfaNH2e7xUjR\nc6ToLlKZd7XGjz40fgBwscZsIqGjGFXVLML94Q9/qPW19QqDmzdv1meffaYvvvhCRUVFysvL0+TJ\nk/X222/XZzjAIUdLvmPGDNfKlamaPj1JBw5U2e8vOUHycNz44XM0SEX/pPEDQOOrGgYtFusRda4S\n5h+mvSf3um4CuC2TxWKxNGSADRs2aPHixXbdxCaTSQ0cGgbmaMk3PDxB118fr1WrkpWbu8D6YNCh\nyvDXbYV0pq/1vN+0eCnjGqnMW1de+bByc0Ps7gFcsoTgB8C1LBapQwfp9GnpyBGpc2fXzbUqbZVe\n+foVJd+b7LpJ0GJdLJc5ZZ9Bkyv/rw7cnqMK4NKlNZZ8JWVmLtQH/3la6pohDZtpDYG+pyTzKBo/\nADRLJpO1iWTjRmt10JVhkGVi1FeDw+ANN9ygG264wRnXAgNyVAHcvDlB584VVnxlsZ740WOV1CNJ\npi4b1Savkwq2T5M+flfKHkjjB4BmLSbGGgZ37pRGj3bdPHQTo744gQSNpmYFcMqUOL30kn0FsKBs\ntnT5WCn6fmv1r9RHShstfTNdI05cqSceHauZXybJnDXI9h4aPwA0V43VRBLsF6z84nwVlxbL28vb\ntZPBrRAG4XSOln0lacaMJKWn12j6UKHkUSp1/sYa/HqskjrsVZsT7eR7NEgn3kytaPywBr4nHh1r\nC3ss+wJoCfLyUiUl6z//8VJ2dmUznLN5mDwU6h+q7IJsRbWNcvr4cF+EQTiVo2Xf775LUEnJGRUU\nvFb5wqBDUo8omXrMl6XrP6UzXa2NH6tfljKu0XU3PWft9C1/q9YlX8IfgOZu5cpU/fWvSZIWqqBA\nSk6WzOYESa65deXCfYOEQdQFYRD15qgC6GjZ99SphVKrSdJlX1i7fm2NH3EKz7tMXp/316FdS2yv\nZ8kXgLtYujS52jZYkmQ2L9SyZXNdEwYDwth4GnVGGES9OKoArluXoNLSmo0fFdu+RKRImUes1b8q\njR/94udq+kvs9QfAPRUXO/4zW1Tk6ZL56ChGfRAG8YuqVgBbtSrVjTfG6Y03knXwYPX/t1vaarbU\nu6LxIzrZ2vhhjpe2Pq4Be8NVcLKLzOZnbK+nAgjA3Xl7lzp83MenzCXzhfnTUYy6IwzCxtGyr8Ui\nPfpokjIyKoPfmjVVGj+6bKlc+u2wVwGn2sk7I0gn/rmhWuPHwmcflETTBwBjmTEjTmZzgt3+p9On\nu2aPmfCAcG05usUlY8N9EQYhqfb9/oqKzqi0tErjR9uDUnSkPHo+p/LIf1Zp/HhJyrhW11xC4wcA\nGMWF/8174YW52rTJU76+ZS49/Yh7BlEfDT6OrtaBOY6uWXJU/bvxxuG6/vo5+uGHBfZvaDVR6npP\nRfVvleR7WjLHqfO5o/I6bN/4wRFvAGCvpERq00YqK5Py862fu8L3md/roRUPadu0ba6ZAC2Wy4+j\nQ8vgqPq3cWOCSkqksrILvwrVT/xQlw1S5tGKxo/3pOwraPwAgDpq3Vrq3dt6CsmuXdKQIa6Zh8og\n6oMw6KZqVgAnTozT4sX2276cO7dQ8v2dfPul61z4hcYPXyktXvpmhgb83FkFp2j8AICGiomxhsEd\nO1wXBkPahOjkuZMqLS+Vlwd/4nFp+E1p4ep82odk1/jhGfKTYoIHKT35nH3jxzwaPwDAGWJipPfe\nk376yXVzeHl4qYNvB+UU5KhzYGfXTQS3QhhswRwt+37/fYKKi2uc9iFJbR+WR887VN7tNqnremvj\nR9poafXLGtE7WclfPq+Vl6XS+AEALtJYZxSHB4QrqyCLMIhLRhhsIRxVABctsl/2PXlyoaQpUquz\nUteUyk2ffU8r4ESQvDNKdWzlz1JBJ0nW6t/Mx61bHLDsCwCu07+/9b87dkgWi2QyuWYe7htEXREG\nWwBHFcCUlASVlBRWeZVFCt0hRSfJo2eSysM6SVmDrPf+VTR+DI2bp+mzRmnZstdY8gWARhYRIQUF\nSSdOSDk5UqdOrpmHU0hQV4TBZqZmBfDWW+O0ZIl9BbCkZKHkd6vU/b2K6l+ydN5PSotX15z+snzd\nXwf2Lra9nqYPAGhaJpPUr5+0aZO1OuiyMEhlEHVEGGwitTV+TJ+eVO1Q8+qNH+elLt/Y9vzz6Lhd\nPjm7VfjTLCl1jnSqR8Vef3Mk0fQBAM1NTExlGBw1yjVzhPmH6accF3apwO0QBpuAo2Xfb7+1Nn4U\nFtZs/HhInr3Gq6zrb6Ru66XT3a1Lv6sXaWTvZM18fLSWHVmtIr9/0fQBAM1cYzSRhPmHaVXaKtdN\nALdDGHQxRxXAl16yX/Y9fbr2xg//E0HyzuisY5/vlc6GSqps/GDZFwBajgth0JXby1zoJgYuFWHQ\nhRxVANetS1Bpac3Gj5+s+/31XKWyThdp/PD8M8u+ANCCXQiDu3dbj6bz9HT+HNwziLribGInqFn9\ne/zxOHXuPFwTJszR/v0Ozvv1u1Xqfpdd40d3y35Z0u0bPzjvFwDcR2SklJEh7dkj9erl/PFLykrk\n/7y/iuYUycPk4fwJ0CJxNrGT1Nb0UbP6t2ZNgsrLJds/r8d564kfFUu/HiHb5ZNd0fixYa50OprG\nDwAwiJgYaxjcscM1YbC1Z2sFegfqROEJhbQJcf4EcDuEwUvkaMl3584ElZae0bFj1Zs+yssXqnXI\ndPn1N+tMh6qNH6Ol5MUaeXlSZeNH/3do/AAAA4mJkb74whoG77jDNXNcWComDOJSEAYdcFQBXLrU\nvukjM7Oi6UOSWhdYGz8qzvu1BGRqYKdrteuzcho/AAA2jdFRHB4Qrsz8TA3oNMB1k8BtEAZrcFQB\n/PrrBBUVFdZ4pbXxw7PXjyrrOlLqvFXKHCyZ46WPPtCNAz5W0qoFWtk9lcYPAIBNY20vQ0cxLpWh\nw6Cjxo+FC+0rgPn5CyXdJfmdkLqvrtz2pcRf7fNay/NAB2W/nymVBEiyVv9mTOe8XwCAvd69JS8v\nyWyWzp6V2rRx/hx0FKMuDBEG69b4UaUCWKXxw7vPep0P7KLy9NHWbV82PKvo9n/TkiXW0Lds2ctU\n/wAAv6h1a2sg3LlT2rVLGjLE+XOE+Ydp38l9zh8Ybsntw6CjZd8dO6yNH8eP2zd+mNqPkaX7X62V\nv27rpVPRkjle/XNG65m4Kfrr9ykqapMjnyFv0vQBAKiXmBhrGNyxw3VhcMOhDc4fGG7JrcLgpTZ+\nZGVVafyoeuJHj1XyaHNEvpmHVfDj76XP/yqdDVV09DOa98RDGjNmuG4dN7LRvy8AgHuJiZHee891\n9w2yTIy6cJsw6KzGj5EDPtaM6XFalrNaRe3SWPYFADidq5tILnQTA5eiRYbBujd+HJeiV1uXfqOT\nazR+ZEkl/pIqGz9o+gAAuJKrw2CYf5iyC7JlsVhkMplcMwncRosLg44qgKtXJ8hiqdH4EfG1FJ0k\n777rdD4gQuXp8dbq34ZnFd3+71UaP16i8QMA0KgiI6XAQOn4cSknRwoNde74vq185ePlo9NFp9Xe\nt71zB4fbabZhsGb1b9q0OLVpM1yPPZasQ4eqVwAtlos0fmT/Ss+Mqmj88DsmnyH/pPEDANCkTCZr\ndXDTJumnn6RRo5w/x4X7BgmD+CVNHgYvdduX5OSEis8qLrnVWWvoqzjxw7PNEfkcPayCH5+WPn9d\nOhtC4wcAoNm6EAZ37HBRGKzYeLpvSF/nDw630qRh0NGS7/btCTp//oxOnXqtxqsXyK/7VHn3Net0\n+xFS+LdS5lXWPf8++lAjBiy3Nn4cW62i9vtZ9gUANGsuv2+QjmJcokYLg44qgEuW2Dd95ORU2fal\nRuOHxbNE10TdoO8/8FL2ezR+AABaLjqK0Vw0Shh0VAHctClB587V2PalovHDq9e3Ku06WGq/XzoY\nK6WNljbM0/Ahb+rzl57TyqhUGj8AAC1aZmaqpGRt2+aluLhSzZwZ59S/ZWH+YTqce9hp48F9uTQM\nxsfP0dSpjrd9OXu2YtuXtgcqz/qtaPzoUNBanjsuV+Y3X0vlrSRZq3/TOe8XAOAGVq5MVUJCkqSF\nKi+XVq+W0tOt98Y76+9bmH+Yvjn6jVPGgntzaRhMTl5Q0fhRpQLYusB64kd0klpdnqTyVitVtu82\nafcd0uevK7rTq1W2fZlP9Q8A4HYcnY5lNi/UsmVznRcGuWcQqrxN72IaYZl4gTzC41Xe7SVrBbBK\n48fgA+P13w9M0ms/rrU2fYTvYdsXAIDbKy52/Oe3qMjTaXNc6CaGcVW/TW9hra9zbRj8zWQpOlle\nlnPyOXpKeV/Pkw7eKJX4Kzr6GSX8970aM2a4xo2NdellAADQnHh7lzp83MenzGlzXKgMcgqJMThq\n1H311YoKdNsD0pna3+vaMJgxTEpJ1I1D3tT06aO07PRqFYV9z7IvAMDQZsyIk9mcUG2pOCqq8t54\nZwhoHSBJyi/JV6B3oNPGRfNj16jbukApWQ+oJGKfNP0DyTtfWlz7+10bBr97xNb4QdMHAABWF/4e\nLls2V99+66lTp8r0m984t0hiMpls1UHCoPuoWQF88ME4Pf9Cksxnx0vXvWhtyA3/TiWZV0lpFunD\n5VJOf0ketY7p4m7iuVQAAQBw4EKRZOlSaeZM6dgx589x4b7BXsG9nD84Gl21CmCbY1L31Up+/zHp\npnSp+CPrQRxf/866LV+Jv3r3nqbz/h/KnDPgouO6NAyuWvWcK4cHAKDFi7OewqrVq6Xycsmj9gJO\nndFR3DLVrP7dc0+cSsqG6b+WvqFTXSOkkYOl9mnSgRsl82PyTF2hspMr7caJigqx3qa3bK6Skmqf\nz2SxWCyu+EZMJpNcNDQAAG7DYpGioqSMDOmHH6SBA5039qxVsxQZFKnZw2Y7b1A4jaOmD0maMSNJ\n6ekLpXbp1mXfHq9KXTOlUwFS2v2SOd7al1GxF3PfvtNUVBRc7R7U6OhntGRJ5ersxXJZk55NDACA\n0ZlM1urg3/8uJSc7NwyyvUzz5eh0tu93PKXC0N0617ubNOYya+NHWry0a57af/WdOrbx0969C+zG\n6tKlsgJYn/2ZCYMAADSxUaOsYXD1aun3v3feuOEB4frp2E/OGxD14qgC+MoryTKbF0idfqyo/iXp\nZPi3Uqa/lDa8SuOHdVugmBv26amnRmjmzAS7CmBDG3UJgwAANLGRI60Vwo0bpcJCyc/POeNyz2DT\ns6sAtjmm9Sce1vmo/dKTf5OKAysaP2ZLB2Pl5/WQCgvt/x+Bj09ZtS50Z57QRhgEAKCJBQdLgwZJ\n330npaZKo5203SDLxI2rZgVw0qQ4vbz4S5lLR0sjn7FWANubdf5grJTmJ61fKZ3pVm2M3v0ClJvr\nuPonySVb9REGAQBoBuLirGEwOdmJYZDKoEv8cuOHWeqRpOQvH5LGHJJOrbZW/5L+ZGv86NNnmoo7\n/E3mM9VD3/z590pyfvXvYugmBgCgGdiwQYqNlfr2lXbudM6YFotFvgt9dfr3p+Xbytc5gxqco8aP\n9mFP6lzozzoX3s1a/WtdIJnjJHO8vA5/oNLc/7Mbx7oX8ygtW7a6Sugb5bLQd7FcRhgEAKAZKCmR\n2reXzp6Vjh6VwsOdM263Jd20dvJadW/X3TkDGkhtjR/r1s+XQrdLPZJsJ37oqL9kfsJaAazS+HEp\n2740BraWAQCgmWvd2loZXLnS2lU8ZYpzxg3zD1NmfiZhsI4cNX6sO/GwSqP2Sb97Qypqa93vb/OT\n1saPVg+qsPC/7MZp6LYvjYEwCABAMxEXZw2DyclODIPcN/iLalYAJ06M00sOGj9KD9womdtI67+w\nb/yIqb3xwxVNH85EGAQAoJlwxdF0FyqDRudoyXfMmOFauTLVvvFj1UPS2CqNH6telY4MbXaNH87C\nPYMAADQTFosUGSkdOSJt2yZdcUXDx3x7+9v6aPdHWnH3ioYP1kI5avqIiEjQjaOv1yfb/qH8kI7W\n+/9anW12jR/OQgMJAAAtxIMPSv/4h/TSS9J/2d+CVmdnS86qy5+6aNejuxQe4KSulGbMUQVw6dJk\nJScvkEzlNRo/NktHO0vm3zbbxg9nIQwCANBCfPCBNGGC9VSSNWucM+bDKx5Wj3Y99PvrnHjWXTPk\nqAIYFD5LhWF7dD6yoxSdXNn4kRavkMJNCm3voR077M/7bakVwNoQBgEAaCFOnJA6dkyVyZSs667z\nkq9v5f1t9fV1xte67//u057H9shkMjnxapuOowrgyy8nK3XTs1LEZtt5v2qXLh3wl9LmWkPgma62\nMS4EvpoBsiVXAGvD1jIAALQQ33yTKm/vJBUXL9TGjdbHzOYESap3OBnaZag8TB7anLFZ10Ze66xL\nbTJ2FcD2aVqz4HGVd9svPbVMOtnTGvy+XCIdGaqoiMfl4XFYB6oEwaqdvlLLbPxwFiqDAAA0I/Hx\nc6z3t9k9PlerVj1X73EXbVqkvSf36m+3/K0hl9foalYAb7klTq/+zwqllV1fWf1rdbZi6XevlP6Z\nVNix2hjutuRbH1QGAQBoIYqLHf9pLirybNC49w64V5e/drleHf2q/Fv7N2gsV6jtvN/p05N04OBz\nFY0fq5T83b3Sr7Oko9usTR8f/EfKiZFksjZ9hL3aIvf6a0qEQQAAmhFv71KHj/v4lDVo3E7+nTQ8\nariW716u+664r0FjOZujxo9vds7SufCdKrkiTLo9rLLxY9Nf1Crz7zp/9mO7cVrCaR/NEcvEAAA0\nI46CUXDwM/rnPxseaj7d86le+foVpd6f2tDLrLe6NX4ESWnP2DV+uNu2L42BbmIAAFqQlStTtWzZ\namVkeGr37jL5+4/SwYPD1aFDw8Y9X3ZeXf7URRvv36ieHXo652LrwFHjh0fPisaPqBOVjR9p8dKR\nofL3u1cFBe/bjcM9gHVHGAQAoAWyWKRRo6S1a6Vp06S//rXhYz6Z/KRae7bW8yOfb/hgF1GzAjhu\nnLXxw1x+XeWmz60KqzR+rJAKg6uNceWVDys3N4QKoBMQBgEAaKF275YGDJDKyqRvv5UGDWrYeLuO\n7VLcv+J0aNYheXk0vHWgtsaPxx9P0sFDz0mdtlWEv9elsCzp6HBr5c8cX73xo5ZlX0lUAJ2AMAgA\nQAv25JPSH/8oDR0qbdokeXg0bLyhfxuqZ294VjdfdnODxnF0f2Ng+EydC9+l85GhUvRq6Vx7W/hr\nnfV3lRTYN36w7Ot6Tg+DGRkZmjx5so4dOyaTyaSpU6dqxowZlzwpAAC4dHl5Uq9eUnZ2qvr1S1aH\nDpVVuPoEpv/9/n+VbE7W8juXX9LrHVX/br55uK67bo42fzNXitxU2fgRdEg6ECiZEyRzHI0fzYTT\nw2B2drays7N1xRVXqKCgQIMGDdKnn36qyy+//JImBQAAdfPkk6n64x+TJFUNUglasiS+zkEqtyhX\nUa9Gaf/0/erYpuNFX2tX/TOVy7frVKl7a50LS5YicqTjfSuqf3HS0avl73cPjR/NjMuXiW+99VZN\nnz5dI0eOvKRJAQBA3Tj7ZJLJn0xWm9Zt9ODAB9UvpJ98vHzsKoD33x+n51/+QjuO/UbqvNW69Uv3\ntfRniLIAAAjHSURBVBV7/gXK63A3laa9Yf26Cho/mh+XnkBy8OBBbdu2TVdffbXdc4mJibbPY2Nj\nFRsb29DpAAAwpNpOJiko8HS4jHux0LVyZarS/+mvtPBN+teG/6jE/4w6eXfWyV1+Oltwn1TYQQr/\nXsnrJki/Oi6dTJKODpHSR0lrXpRyozR4cKLmvTBCs2Ytsgt98+ffK8nY5/02tZSUFKWkpFzSaxtU\nGSwoKFBsbKzmzJmjW2+9tfrAVAYBAHCa2iqDHh4Pq127EJ08ab98LMlhp2/Npo82Qb9XceABlXa4\nWer0o+R3QsocJB0dIs/jr6isyHHTx6pVz9n2RGTZt3lzyTLx+fPnNXbsWP3qV7/SrFmz6jQpAACo\nG0edu76+z+jcuVxJr9m9vlu3h1VcHKLMzMrXBwUlSDqj3Fz710tTJL1l9yhNH+7B6cvEFotFDz74\noPr06eMwCAIAAOe6ELyqLr0+/vhoPfPMOu3YYf/6AwfyJb1R7bHc3IWyhj57gYHFysuzf5zzft1f\nvSqDX331lYYPH67+/fvLZDJJkl544QWNHj26cmAqgwAAuFxty8etWk3R+fP2lb42bSbo7Fn7Tl+a\nPtwbm04DAOCmHC0fR0c/o8DAXG3bZr8cfLHQJ3Hah7siDAIA4MYcNXFI9o0ihD7jIgwCAGBAdPri\nAsIgAACAgV0slzXwqGsAAAC0ZIRBAAAAAyMMAgAAGBhhEAAAwMAIgwAAAAZGGAQAADAwwiAAAICB\nEQYBAAAMjDAIAABgYIRBAAAAAyMMAgAAGBhhEAAAwMAIgwAAAAZGGAQAADAwwiAAAICBEQYBAAAM\njDAIAABgYIRBAAAAAyMMAgAAGBhhEAAAwMAIgwAAAAZGGAQAADAwwiAAAICBEQYBAAAMjDAIAABg\nYIRBAAAAAyMMAgAAGBhhEAAAwMAIgwAAAAZGGAQAADAwwiAAAICBEQYBAAAMjDAIAABgYIRBAAAA\nAyMMAgAAGBhhEAAAwMAIgwAAAAZGGAQAADAwwiAAAICBEQYBAAAMjDAIAABgYIRBAAAAAyMMAgAA\nGBhhEAAAwMAIgwAAAAZGGAQAADAwwiAAAICBEQYBAAAMjDAIAABgYIRBAAAAAyMMAgAAGBhhEAAA\nwMAIgwAAAAZGGAQAADAwwiAAAICBEQYBAAAMjDAIAABgYIRBAAAAAyMMAv/f3v2FNLnHcRx/K3Zj\nAykwDTdQKmqzYivNGyOs6A9RJO0isRSn3UQXddltF/2hCMq66iIIwYIuSqKsJKphlOQMgqISFKZl\nYGCoK9ae7VwERhxOnHYe/a3z+7zuxvDZB7/Ofdjz7DsRERGLqQyKiIiIWExlUERERMRiKoMiIiIi\nFlMZFBEREbGYyqCIiIiIxVQGRURERCymMvg/9/DhQ9MRrKcZ5AbNITdoDrlBczAvl2aQdRns7u5m\nxYoVLFu2jFOnTrmZSVyUS39sttIMcoPmkBs0h9ygOZiXSzPIqgw6jsOhQ4fo7u7m1atXdHZ28vr1\na7eziYiIiMgsy6oM9vX1sXTpUsrLy5k3bx579+7l5s2bbmcTERERkVmWl8lkMr/7Q9evX+fu3btc\nunQJgI6ODp49e0Z7e/uPA+fluZdSRERERP6Tf6p8Bdkc7N8UvSw6poiIiIjMsaxOE5eVlRGPx2du\nx+NxvF6va6FEREREZG5kVQarqqp49+4dw8PDJJNJrl27xq5du9zOJiIiIiKzLKvTxAUFBVy4cIGt\nW7fiOA6tra34/X63s4mIiIjILMt6z+D27dt58+YNg4ODHD169Kf7tIPQvEgkQklJCatWrTIdxVrx\neJy6ujoqKytZuXIl58+fNx3JSl+/fqWmpoZgMEggEPjb/yuZO47jEAqF2Llzp+ko1iovL2f16tWE\nQiHWrVtnOo61JiYmCIfD+P1+AoEAT58+NZonq08T/4rjOCxfvpyenh7Kysqorq6ms7NT7xzOsWg0\nisfjoampiZcvX5qOY6WxsTHGxsYIBoNMTU2xdu1abty4oeeCAYlEgsLCQlKpFLW1tZw5c4ba2lrT\nsaxz9uxZ+vv7mZycpKury3QcK1VUVNDf38/ChQtNR7Fac3MzGzZsIBKJkEqlmJ6epqioyFge17+O\nTjsIc8P69etZsGCB6RhWKy0tJRgMAuDxePD7/bx//95wKjsVFhYCkEwmcRxHL4QGjIyMcPv2bdra\n2rRtwjD9/s36/Pkz0WiUSCQCfL/0zmQRhFkog6Ojo/h8vpnbXq+X0dFRtx9G5I8yPDzMwMAANTU1\npqNYKZ1OEwwGKSkpoa6ujkAgYDqSdY4cOcLp06fJz3f9ZUd+Q15eHps3b6aqqmpmV7DMraGhIYqL\ni2lpaWHNmjUcOHCARCJhNJPrz0otmxb52dTUFOFwmHPnzuHxeEzHsVJ+fj4vXrxgZGSEx48f59R3\ngtrg1q1bLFq0iFAopHelDOvt7WVgYIA7d+5w8eJFotGo6UjWSaVSxGIxDh48SCwWY/78+Zw8edJo\nJtfLoHYQivzw7ds39uzZw759+9i9e7fpONYrKipix44dPH/+3HQUqzx58oSuri4qKipoaGjgwYMH\nNDU1mY5lpcWLFwNQXFxMfX09fX19hhPZx+v14vV6qa6uBiAcDhOLxYxmcr0MagehyHeZTIbW1lYC\ngQCHDx82Hcda4+PjTExMAPDlyxfu379PKBQynMoux48fJx6PMzQ0xNWrV9m4cSNXrlwxHcs6iUSC\nyclJAKanp7l37542ThhQWlqKz+fj7du3APT09FBZWWk0U1Z7Bn95QO0gzAkNDQ08evSIT58+4fP5\nOHbsGC0tLaZjWaW3t5eOjo6ZNQ4AJ06cYNu2bYaT2eXDhw80NzeTTqdJp9Ps37+fTZs2mY5lNV1O\nZMbHjx+pr68Hvp+qbGxsZMuWLYZT2am9vZ3GxkaSySRLlizh8uXLRvO4vlpGRERERP4c+liXiIiI\niMVUBkVEREQspjIoIiIiYjGVQRERERGLqQyKiIiIWOwv/TXEjZd1F5wAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "\n", "\u00bfY ahora qu\u00e9?\n", "----\n", "\n", "Los pasos siguientes, del 5 al 12, ser\u00e1n en dos dimensiones. Pero es f\u00e1cil de ampliar las f\u00f3rmulas de diferencias finitas de 1D a las derivadas parciales en 2D o 3D. Basta con aplicar la definici\u00f3n -una derivada parcial con respecto a $x$ es la variaci\u00f3n en la direcci\u00f3n $x$ *manteniendo $y$ constante*.\n", "\n", "Antes de pasar al [Paso 5](http://nbviewer.ipython.org/urls/bitbucket.org/cfdpython/cfd-python-class/raw/master/lessons/07%2520-%2520Step%25205.ipynb), aseg\u00farate de que has completado tu propio c\u00f3digo de los Pasos 1 al 4 y has jugado con los par\u00e1metros pensando sobre lo que est\u00e1 sucediendo. Adem\u00e1s, te recomendamos tomar un ligero descanso para aprender sobre [operaciones matriciales (arrays) con NumPy](http://nbviewer.ipython.org/urls/bitbucket.org/cfdpython/cfd-python-class/raw/master/lessons/07%2520-%2520Step%25205.ipynb)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " styles = open(\"../styles/custom.css\", \"r\").read()\n", " return HTML(styles)\n", "css_styling()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 23, "text": [ "" ] } ], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "> (La celda de arriba establece el formato de este notebook)" ] } ], "metadata": {} } ] }