{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Symbolic Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In standard mathematics we routinely write down abstract variables or concepts and manipulate them without ever assigning specific values to them. An example would be the quadratic equation\n", "\n", "$$ a x^2 + b x + c = 0 $$\n", "\n", "and its roots $x_{\\pm}$: we can write down the solutions of the equation and discuss the existence, within the real numbers, of the roots, without specifying the particular values of the parameters $a, b$ and $c$.\n", "\n", "In a standard computer programming language, we can write *functions* that encapsulate the solutions of the equation, but calling those functions requires us to specify values of the parameters. In general, the value of a variable must be given before the variable can be used.\n", "\n", "However, there *do* exist *Computer Algebra Systems* that can perform manipulations in the \"standard\" mathematical form. Through the university you will have access to Wolfram Mathematica and Maple, which are commercial packages providing a huge range of mathematical tools. There are also freely available packages, such as SageMath and `sympy`. These are not always easy to use, as all CAS have their own formal languages that rarely perfectly match your expectations.\n", "\n", "Here we will briefly look at `sympy`, which is a pure Python CAS. `sympy` is not suitable for complex calculations, as it's far slower than the alternatives. However, it does interface very cleanly with Python, so can be used inside Python code, especially to avoid entering lengthy expressions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# sympy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setting up" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Setting up `sympy` is straightforward:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import sympy\n", "sympy.init_printing()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "The standard `import` command is used. The `init_printing` command looks at your system to find the clearest way of displaying the output; this isn't necessary, but is helpful for understanding the results." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To do *anything* in `sympy` we have to explicitly tell it if something is a variable, and what name it has. There are two commands that do this. To declare a single variable, use" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x = sympy.Symbol('x')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To declare multiple variables at once, use" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "y, z0 = sympy.symbols(('y', 'z_0'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the \"name\" of the variable does not need to match the symbol with which it is displayed. We have used this with `z0` above:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABIAAAAMBAMAAACdPPCPAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMARN3vMmYQu3aZIqtU\nic3QRwAsAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAZklEQVQIHWNgYFQWcGUAg/SOmQUMvb1AdgLD\ncgbWCzwbgEyWMgYmAYZvQJY0A0O+A4MNAwNI3H8BgyoDw0kGhg3+CQwaDCyqV5sEgGIWDJwMwQ9B\n6j6CjYTpBXI4JoDNAwnfvJkAADBRFs6uZjB6AAAAAElFTkSuQmCC\n", "text/latex": [ "$$z_{0}$$" ], "text/plain": [ "z₀" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once we have variables, we can define new variables by operating on old ones:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a=x + y. b=y*z_0.\n" ] } ], "source": [ "a = x + y\n", "b = y * z0\n", "print(\"a={}. b={}.\".format(a, b))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADAAAAARBAMAAABp3DInAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAu0lEQVQYGWNgIAJwKeBQRKyEkLKrGsQMmA6h\nSwwsDxkYE9ibOCaADYdJJKxjYPrAwCbA9pHLAVmCZcFNBu4NDIwMnBtAwmwzZ854OXOmAQNQ5BED\nvwJQCEyA5GBGsX5kOH8AyAcTyBK8Exj0gMoE9BmYBEDicB3cBgybGRjiF+xncAeLwyV4N7B+Z2AQ\nVhK6XoAqwWim+wUiAiVhljMwAG1BBowOEJ4lg3wAsjic3c6wCc5GYQTpHmBgAABmTiJzFz7aNwAA\nAABJRU5ErkJggg==\n", "text/latex": [ "$$x + y$$" ], "text/plain": [ "x + y" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition to variables, we can also define general functions. There is only one option for this:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "f = sympy.Function('f')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## In-built functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have seen already that mathematical functions can be found in different packages. For example, the $\\sin$ function appears in `math` as `math.sin`, acting on a single number. It also appears in `numpy` as `numpy.sin`, where it can act on vectors and arrays in one go. `sympy` re-implements many mathematical functions, for example as `sympy.sin`, which can act on abstract (`sympy`) variables.\n", "\n", "Whenever using `sympy` we should use `sympy` functions, as these can be manipulated and simplified. For example:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "c = sympy.sin(x)**2 + sympy.cos(x)**2" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJ4AAAAZBAMAAAAyHoooAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMnZUZs0Qu91E7yKJ\nmaurDqYVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACRElEQVQ4EY2UPWgUQRiG3/Uu6523YBTSJkss\njfHQIpImR8BOQYsFRZAlIDYiFopgQEMsRNJcKUEwESxExCvEaEC8xkJi4ArRJkIEFUQsIiEhmrh+\n8/NtZvb2mCzczvfzvO/OzO4NYF7Bp49m6oqd+AK+uTzMvhOfQl/DFDhiJ34Xb+oOD7O9A3wkNgXO\n2IlPSotKTTkVXavPx72HPJGgJaM5zn9ykD92wL1Nxk+q4BznFzjIH114uVnuJmVRzZKiIFRGBT2q\njO8dcQZ6jg7FFJfSbfNnVCvfrxNe2adUeJYkInqpUxrOqjDfLw/3DoyemvuHnqf7B0O2OUTB2OCr\nASp8VjX285cWq7jU/w5ClotfBCZwHrgTVv4ycBXwm8XJEimO237zVe+JN4XdoZRp3sKnY4S4CdwA\nVtnvNr2IOFgr0DYes/0iFFZKTXgrUqZ5Cy+tH4Twuwb8Zr/HND90XRFpH/2CKDrzKIqWqbolSlVg\nU8ooEZeF+2+TlvC7bvsBe0PBCj+69P6VxSNH6sC6lMmW9NvGX6C4kfWjBZBTt7jfE7fUL53flpSp\nHiz8CPA160cbXIgPY1fc9j4i6uxpobwhZdrPwodjjIvFmutdBB5Ub+E58UtKw9/LfA0L3iy6mlKm\n/Sz8/uiJem/yvTf5MvRnWQO0yMv9Yx9qlJ5WJfbzfw008Pr9DwiZpsWeZHDu6HH7/1aZUCX2y4Aq\nbcczWPt54DcyiJm242ZXxONccJxXGnPi6XmakvyA3NGJ7/i8V/YG/h/xYKmJCV3AuwAAAABJRU5E\nrkJggg==\n", "text/latex": [ "$$\\sin^{2}{\\left (x \\right )} + \\cos^{2}{\\left (x \\right )}$$" ], "text/plain": [ " 2 2 \n", "sin (x) + cos (x)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPBAMAAAArJJMAAAAAHlBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAACGjDitAAAACXRSTlMAVO8Qq5l2zWYZcMvdAAAACXBIWXMAAA7EAAAOxAGV\nKw4bAAAAHUlEQVQIHWNgAANGZQYGk5DJQDYbqQSr03QPsBkAJYgIYEZbtZEAAAAASUVORK5CYII=\n", "text/latex": [ "$$1$$" ], "text/plain": [ "1" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.simplify()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note the steps taken here. `c` is an object, something that `sympy` has created. Once created it can be manipulated and simplified, using the methods on the object. It is useful to use tab completion to look at the available commands. For example," ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "d = sympy.cosh(x)**2 - sympy.sinh(x)**2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now type `d.` and then tab, to inspect all the available methods. As before, we could do" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPBAMAAAArJJMAAAAAHlBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAACGjDitAAAACXRSTlMAVO8Qq5l2zWYZcMvdAAAACXBIWXMAAA7EAAAOxAGV\nKw4bAAAAHUlEQVQIHWNgAANGZQYGk5DJQDYbqQSr03QPsBkAJYgIYEZbtZEAAAAASUVORK5CYII=\n", "text/latex": [ "$$1$$" ], "text/plain": [ "1" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.simplify()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "but there are many other options." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solving equations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us go back to our quadratic equation and check the solution. To define an *equation* we use the `sympy.Eq` function:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAALwAAAAyBAMAAAAU3awwAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhCZRN0iZrur\nzXa0OFAHAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADmklEQVRYCe2YTUhUURSAj+/55k8dg5IKkWY1\niyBU2tSmDAxqEfOECCJ/pogWZThFi3ZORFEQMquSWvhW0aaaTUIrjWiRhAr9bZyaJFyF2ZiJmk33\nnHvfzJvhzvtRgxZe8Nx7/r6578yd854PduVzwIYWRblB40GCQM35H7C1/TCuL93eIDRiQis6Tsfb\nW2EbLiBEl0DLjRCDNzjlkMAPpe2paoO9v8wb/F2Kn6CrKQsqqp29C0XFzaqvjaLM3a865IQ94vsN\nK14TF1PxQ7zih+L/FN8zuomnCsjEZnFkVRG2/6o4vherY4W93i+sJItQiowed28BBdNwaodFL1u+\nXie+ju1vqoxpUbvWiX/I8uctPLY8YFGVLCqlxan2cDdhtzV/Wf+04rUtiK9PowTRkEOLpLkRwSSA\nwv6sw4qHj+ipow8x8YEkRd+NftFxcYc0uQjHWfL4TAt0f7s3neUxJl6Z/QpwDm3qMnnE7ptTqPl3\nwmectSaUFUaNwSr7XlvSIqGBwCQPEvjgdcgAPCbbBBE5XtlOpg4DLvB4GxloATioQ07RlQWVGIWv\ntioCLwH2UXItIQmvTelk6tNhoAjuuoXjHUC+OJi3KgFwEbScBnVpCt6TyVzLZPCosnw2YmSF1iyb\nOf4mxzeC9pP7bCTiP4CfHc16BNAQxWkkReCPZJnGi+Ojhx0tB+ocRdgJLM4y+NjRjLWZcRzP8nFc\nJekrFgfgdIrZtHmomdxPTpmIDutoxq92EToMVf8OYbIUas9Oi2p+tc1tGMx3D/wIfIJHoxFmlJ4c\nJVU7iRlKHGAMhqG/ZQTM5iaK0wvaWYAzGOX/g9LEhxdR6Zw+Op7AhezcB1LVS+jzJwFOzBjQOdt9\n3kADGwKv7H7CFHYY2DXOoTTxLppCIBGkPYDkWVfgiRhM4lRPV2ritV/kshcq7zTY0srGSYsua2mO\nT2mYH8gSpSZFUyWx5oYc5UR2O7Ebz8nZM0qTODludh+KUwYUzotQS6c13Ax5b7wMV0pJdpqH3fPe\nWP127zM7YKnPA573xqp8np/lUk4FzQO+0BsroGRmD3hrb5ShZDZP+GJvlKFkNg94a2+UoWQ2D3hr\nb5ShZLaeOFnd/KysvVGGktlK/3UDu2cDWbqTLRahCLF7GNGdErz5+c3KbMgQi3tLd4jWVniAufsw\nv3k5ZLl2DzaYePHC5ekr17nOgWoT1RpfuJivi944Z7mOOGZQKHtd9Be+uw4jQeoQ6QAAAABJRU5E\nrkJggg==\n", "text/latex": [ "$$\\left [ \\left \\{ a : - \\frac{1}{x^{2}} \\left(b x + c\\right)\\right \\}\\right ]$$" ], "text/plain": [ "⎡⎧ -(b⋅x + c) ⎫⎤\n", "⎢⎪a: ───────────⎪⎥\n", "⎢⎨ 2 ⎬⎥\n", "⎢⎪ x ⎪⎥\n", "⎣⎩ ⎭⎦" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a, b, c, x = sympy.symbols(('a', 'b', 'c', 'x'))\n", "quadratic_equation = sympy.Eq(a*x**2+b*x+c, 0)\n", "sympy.solve(quadratic_equation)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What happened here? `sympy` is not smart enough to know that we wanted to solve for `x`! Instead, it solved for the first variable it encountered. Let us try again:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n2d97/wsKDVkvv1rNcAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left [ \\frac{1}{2 a} \\left(- b + \\sqrt{- 4 a c + b^{2}}\\right), \\quad - \\frac{1}{2 a} \\left(b + \\sqrt{- 4 a c + b^{2}}\\right)\\right ]$$" ], "text/plain": [ "⎡ _____________ ⎛ _____________⎞ ⎤\n", "⎢ ╱ 2 ⎜ ╱ 2 ⎟ ⎥\n", "⎢-b + ╲╱ -4⋅a⋅c + b -⎝b + ╲╱ -4⋅a⋅c + b ⎠ ⎥\n", "⎢─────────────────────, ────────────────────────⎥\n", "⎣ 2⋅a 2⋅a ⎦" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.solve(quadratic_equation, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is our expectation: multiple solutions, returned as a list. We can access and manipulate these results:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "roots = sympy.solve(quadratic_equation, x)\n", "xplus, xminus = sympy.symbols(('x_{+}', 'x_{-}'))\n", "xplus = roots[0]\n", "xminus = roots[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can substitute in specific values for the parameters to find solutions:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFYAAAAWBAMAAACoIHaoAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMlTvq5l2Zoki\nRLvZ+6rzAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABOklEQVQoFY2RsUrDUBSG/zSGJPYKwQ7FqRAd\nhSo+gH0DM7o2gnNEcHBpEMS6uTo1sy5dBNEl6gt0chP7BIK6VFTivefatOEGcg/k8N///zj3JAGq\nig0yUVUY5fZICyPoUR/FqT5rbOizTqDPNgDWf+sA9hh5Wd1czos7oIn6L2eT3G6evf9r6yI3AbHu\nAbA/Z3HplrJuAuwBvU4BVtkXnpv8aXuVrBty7lLO2/ZWzqWirsx9GIwAvi6vpW8Mn0nJprBojbE4\npNCMWHACLG+JWpu+W933V0PfjwTi/MD0iO3DwBcp2dS5bIJrytwYsKafSTgqi563SewuWFqL5BVk\nlLA7N7GIFmK4aSuQqwujbG4tpFlP97eHeGUJYaI5Rx/H8jD7x9aEnHaWfcK+kmmxz1isFxP1ZKSq\nR84fnlVKBHESW7oAAAAASUVORK5CYII=\n", "text/latex": [ "$$-1 + \\sqrt{2} i$$" ], "text/plain": [ " ___ \n", "-1 + ╲╱ 2 ⋅ⅈ" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xplus_solution = xplus.subs([(a,1), (b,2), (c,3)])\n", "xplus_solution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have a list of substitutions. Each substitution is given by a tuple, containing the variable to be replaced, and the expression replacing it. We do not have to substitute in numbers, as here, but could use other variables:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQkAAAAqBAMAAABSCbN7AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMlTvq5l2ZiK7\niUTiBfEGAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEgUlEQVRYCc1WW2gcVRj+Zje73fsuFRpENOta\nFFFMwEsp1XTRF0EhCyJVVJJWEaxRVwVD6oNbfDBCYhcfagUvg4LoQ3FrQSUvCb6ItA+LiNQbLBQU\nfDH1CrZ1/f8zc66z2RjJhhzYmf/7vv//55szs+cMsPVGYv8W8DT80rkt4ALpLegi42/CzAxHr2HP\nxavRhI1nCuVIT8tFYXNe1df6u9hRjeiDIGK+29WaixlXtXF3YwaykX+E6WLovH1VB2WXHeJ/w8jd\nmi5i9b59t3X6yusQJ0pOsuliqeWINvwogPn5wza/fhRrOjWmixcdzYGvBPg7POMI64aZKbsk9dyv\nhxTzmIp6BV45YPdgou+cLfYqllxGlGb/kTh6zv4e5QwmVQvAOJY6Bi3COzWxxjv8vMh8Que7UWbF\nZSx8iUKTJRWGwa2aiIm71diJtgvc55mmxuyK+234rYK7VRQG6WnNvK9DINE0Ecd5wbzt0hrHl3XM\nke3CUx7zDTsPWLxeM3t02MuFN8X6ZMvMsuJiw4KOi7QvVetuBdnWLrLKLCvRucANzE/U+NhzFJtM\nf3rmaCmQ7bmIE5ldeHk/Cu1CNUiQx0yLXAgNSDeIVT2Ui7NPDvlB+hyfRkIQUNZRSIXHMRqyyoXH\nxOv0+7EVW8Ht9z4Y2gzzcCnIhdCAnA/oHtKF98WxeaS/aVPFO1wV3DBHkbHkE7XDx3yoSBfZ25gY\nA7yDSC3jqW43TJCnNrkINCBeM3soF6A/8HHso4p7uKrYxvYbeexEUW+RKyyJh3WkhN0MvqxUbqlU\nruHw56vpkKH7SJ1DvMkMD9mFHn6VXEgt2QHCHvlK5aoDlUpdpN9dwjiKJboKQ/cVFCnBYcKn8zQ8\nuXjJucAkCXFqkFzGSBWRcTnIRTLU2IXuIecChTr3TdbWdsFPxLuIxAqCoVwkx4CHiBtpYzLUzNO+\nmZk/Z6VGT8TooVzQs6DvhrgPnOVSyl5tjDTJxR/IlR8IMpSLNC37V3JtDZ8lWr3Kp5VGb6fRQ7pI\nNLBtKHie4u0Ur2CvRuKVAa7Fu/XQqHLhXQC1AWLNzK58z9oLSuMlTfeQLu44/sE4zUWS7nOBG/RZ\nL5J10offvGu2w4nm2nmkJXYHb/arT94KNPv4ffeQ1ApjZg/popE50KH3otgBdnLpLxTIkZ07XZUx\nnXNlA1Co5gJL7Z9sqQ9afQUX/5Fgbf2wpDsMI29u9PkpLXF0mYK5letUvFZgre9ey0g/xutFsJt9\nbdBPA48aMBH5NJZi4S9+WP9t5MwLWyX5hcO0zAhqlyE8DLxQ1dj7W8dOtNdIcyQX0iLZb5xi0brS\naMlygc9XLX9jVSUqLEYpzWTETCXOa4ajvSW9AeI9WxscSpWt3oWLxgbIK8/mjKRvXSdeNzfRdNkS\nBweO2q3n1AYo+EdsdWDooNU53TA3wPALxMoYCHDm/D5kTxibKG0GA7mq2/Rja0kZaiB9wthE4d3k\nFgwCezdbXU/+cOZZYwMk7aTl0kreOMCfpsYY7XZ/MzdR+pCuGvKgwiu48b/2ZVTw8TqViQAAAABJ\nRU5ErkJggg==\n", "text/latex": [ "$$- \\frac{1}{2 a} \\left(a + \\sqrt{a^{2} - 4 a \\left(a + z_{0}\\right)}\\right)$$" ], "text/plain": [ " ⎛ ___________________⎞ \n", " ⎜ ╱ 2 ⎟ \n", "-⎝a + ╲╱ a - 4⋅a⋅(a + z₀) ⎠ \n", "──────────────────────────────\n", " 2⋅a " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xminus_solution = xminus.subs([(b,a), (c,a+z0)])\n", "xminus_solution" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPcAAAAqBAMAAACdAtCRAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMlTvq5l2ZiK7\niUTiBfEGAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEgUlEQVRYCc1WXYgbVRT+Jtlkk0yyO7TQIv5s\nXMQiSg2oXVstzWPRh0QEfxDZFVSwrhp8WVcfDPjQFbZuUKgWXTsoFPHFqKDLVtlUBB/60FBEltLi\ngFDBl+76i211PefOT86dmU3VTmkP5OZ833d+MpM79wxw5dgD1mX7LcYLL1++5sDBK6Z5wb50/8Hm\nmNLalb8eE5AUNVSOVpLNhx6L6skxb0ZLyeabqlE9OSZlR2rJ5lMRVSPm1i7GYK5q1RiI5gPnIqok\nzI5E/8OPXptonmr0rTjo9JUvLNYiT7VovtTuW+CTvuq/EFOtcJBo/kpY0/FrOvzvqDARytn73Bbb\np57yndhvoxylF6NULFNQ99T8O1ZUpPnr+hopuXpEpi1onjoZ5VXgbhn+kgLPSEr3Cys6DqGNIUww\n1cYCMmejAjN3S3qDAs9LSvdzFR0/rMMTOmT0AT2pdfwihSApPynpUovRQUnpfrqj46COoo3QT2Py\nLuC0Y/ws04KkxVskbUwwGm9LTvOHmxpEUEfReVtXCZnq9+i3PUjqas2xlbNr9UgNnxhusWfue9Ub\nL0EdFZD2w/h7YXm/BeSb7G/s+piRn1RoU/Ohbc49TJLN8DJi8xprrnS6nVpxZb8ODMYHRM7Q07iV\nYNGm5cs7LXiYI/ykq0DNrzkw08H8PPPv8eJeHnsRW7KJMvYg13Elv465k3HFJdW6ycYsOek6o9Kz\n8DAjP6nLzS18gUI30yD+fhaHu9hwG9sNgJhRLKl/JLeKdIvA8dHRbaOjW5j/6UZaCl1a/Mw5C9sJ\nZh1agCctD4ukTJWbY+AI0g54mtU4MryrmPOsZpOT7WCkSt9k/kVg3KartBTnLpMw+EDi5oeBY3UP\ns+glXQvV/Ef6n6t4gvgLNVe3faSLcS5CFjTPVoBHXU6txl/IrJDHt33NwrH7PMyil/Tg1NTv0+Ab\nXmtjB/E/sEjF17ORFut1fJVpq5CgeZ7O5OtFlvEbiuVH3A03Cez62MMcEiSBlIeABs3R7cSrDacu\nTxQSLm0HOjFbhbGSSwZ1jPPINEUgbsL7DQouEfkhMn/6mEOCJJzHwI4Tbzh05Tyw9rHY5znPNkg3\npr/9/F0OlHXm2nSKC9s8f++0Q49xhT4zsw48zBFB85NrL+ZwaCv/5zzMaH8DZxxePVuY/dp36btY\nFoDcoA6WurRzYoyO17D1kjzF3e3uYfiR1Qs3Gvje6cHSRM9n7+oAFlduDnzp0GAJWy/JU/JN3nbu\nYPlORA9ayE70cCb6dumJQ39QfowV2zFkmFpeput1R+qY0OgRGhQvEMZZoenurqqOPWR2YukY8ihz\nWoPUqtYc38RkudQ76yiL6/BhuqBuUeaczqdXxRg7pGuJo1xZL3mmi94YowPmklrW1suPyTGWL+ti\n0mi/XjDXhD/GWHhcV5NGe/SCb2ljzD2A9YgEUejG0ol9WIwxOtgT7BUp9Zna8gG9G3hbjDEYtwdS\n8o5xh1bT3Hlqb0WMMeBT/cdp0RcL1Btfr0iK3qMqYozRq2u1pybtXccF/wGL00NZdTkP2wAAAABJ\nRU5ErkJggg==\n", "text/latex": [ "$$- \\frac{1}{2 a} \\left(a + \\sqrt{- a \\left(3 a + 4 z_{0}\\right)}\\right)$$" ], "text/plain": [ " ⎛ _________________⎞ \n", "-⎝a + ╲╱ -a⋅(3⋅a + 4⋅z₀) ⎠ \n", "───────────────────────────\n", " 2⋅a " ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xminus_solution.simplify()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use similar syntax to solve *systems* of equations, such as\n", "\n", "$$ \\begin{aligned} x + 2 y &= 0, \\\\ xy & = z_0. \\end{aligned} $$" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhgAAAA/BAMAAABQnKyEAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMARM1UEHbdIu8yibtm\nq5lTG27OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJcUlEQVR4Ab1cTYwjxRV+tttu22OPzQVxIeMQ\nxM9pRlopnMK0QKwSoWjmskmEoh0TbRBCwFoRAiQkPCxigSQSPuUSlLESRYrQamcO4RBxWF+IIi5r\nJJRbMhbkBGLXwBLC306qq+rVj7uqurq3PX1wVb2f731+Vd1dr9syrB0d9YAe1W3WHsNnaeYOcsqt\nLlL7HQ62cnT0GaydONFl4+8XGSMF602nvtJ3qgtVrvAlUDpxgiQDocNXsXcM7Q/5BJhDPTsyy5ch\nDV4QqC/KZNR4ioRumZ3Syy70X7qURetuGSCikow/ouzG2+FRfDhx3ndomz2HMqMqncqqiCaTEX6S\nMYzD/F2Hjqu2Nuw2w65dl1WTTiX4DDFlMlYOUHbDbdhLh2ju2m3esquyanyo/AVBZTI2Ryi74XbV\nMesIHnyOvURb+TIhyi3wobK1zeFlMm7LHTDheBLCK2+l5XY/SvhxQbln02SX+1BpXuO4IhmNb7JH\nsnl8AD+GZtolaDixue9ZNTYPu9yHSohfXSSjPbcjZtQEfXgP4JUUL/v8H6Z4ZlD7UcGTQiRja5oh\nhtu0OYHzAIcp50n1CwtK8K1FkUPsR2VnwKBFMi53c8Qyu5wEWI9SkxF8ZfaGVtoJZvEzif2obI2Z\nr0jGJRNWPtnPqdvZKMX7Lot+ZW5R5BD7USnvMmiRjE9zhEq6lOL11Y/lJdvEx0p67I+wp7ednj7O\nOcpApcnv5ZiMdO5enH5Gvgh7ElCbpjmsbZst1sZmeUZpBiolvufBZKTeCb2ohA+Q871GTa+kOmwd\nmE32u2Z5NmkWKsHXDBuTUcaNhxoy3InrLXfBpdoDxLDvxKLqTFcYRrVdg5CIyMVXHiFlMJcC714W\nKo8yVExGp2+I0s4+R1cHcCZGuhfCgQFRFbUt99b/akbZKaB7BiqHjCsmY3iAGEr7K6UPwCaJzhR+\naHo6GM5aY9JpzKAqkzFEe9HOiU0TN37UUXyEfM0yQQ4KiJSByv6EOmEyNmeIobQfKH0Ar3XSvlaL\niNfTb1z8p3Q2l9Et8/2mcl06AuSggO4ZqFweUydMxs42YsiW7GXVQ58kVaP0G1/dG4/Wj47kag97\nioHslsw7zapazuahgBEyUFmbUidMxtUJYsiWlL9q9alPkjTTe3fdro/JyFJGh+atzap69hDX5z/6\nm0D0o4Dm/lSGPeqDybjURQjZkr2sUn0uTJI003uG843gGI//GaUr6m78JARTEPdaTwoI60+ls0t9\nMBnrA4SQ7QVQq0/L/Epz1isngWzzab5nl9WbzAVoR1Df5UE8KSAlfyqdOfXBZLwWIYRo43k4L6tP\n2/wKe1vHOp+GmASjrux4iGu9D22+W4bcFJCajQqPickwzFJ1olWfZJ3kO5oEx3icTS4iYsdniXoQ\nCmQ3KJKRmwKGt1GpsdVoScZNxL3GIHj1qSa19Gj3dcRPb9X5vPmFxkR4uJMhKdT4WslPAUPaqDiT\nUT1H3E9RCKzg4nWCx4OnrhzAQw/hMKVlZTQ1Ct48/RFU/zymA1gfsVb/5CtDoYCVW34KGMFGpcxO\nRL4yAv00eWqnyytxiKtPOUkMNYLnoDWuEE3KIctoZhhAeEBqlx+wkekOBrA1p1qFwhNEkJsCC0Ue\nKZBvBH0ckSpKpcLvYJgMdpu775H4uJswOiDflnqS6hMnKbgj1v5iRHbbf4VaF5QrHQ8ittu0A4Bl\ntMCF30fwMHQiam9Jxi4DExRWZxkoiEiZqBiTwWiQz9UvgG6rafWpTBI3uJWkawQvCnNLRymjuUVp\nCsGXUN+gQ3cyBIXTxDg3BWTmprKQDP00gfA6q8RZ9SkmiUPHJ8jeAB7HSNZWlNFoQU6QBsnzhI4t\nyZhTpaBQmcEz6lJlWm8KzFx5uIAClYqeDFhIBhxGZ2IvVn2KSeJApPyY7kXg8a4cy2juSL5Yu3EN\n+Pv+9S4Xa424tXIKfwD4qbJUM1NAcBeV8ifUynJrhb0/zWI9qz7FOqEu0Hj8wk+6ZGW8BIG5vGBm\n8Scvo1Hwu3fefpisjPo2FdC7SQJCJINRCB974+M+eX6AS5VBSQpbPSZJ/XRR0e8miZVRPhfF8Lz6\n5JMUS8ixCv/4bnzNIOl8JKIS6wcvo1E/a53rkmtGhy2Js6NYvgghksEolMmVsE/MbBRqZ2IQj8NF\npabdWmFxa6w/VeDrRA3J7iaVgSpjfbXS5WW0ZiTuJmzTtQghtuOeFO7RwPWBWvG6qCxsuvg+U2Ld\nKbsAfJ2oouosvoY1VRHvK5UugKGMPo37jNeowyIE7jcB/CiMDRS4SK14nVTqc+qB14xLdMnacPVJ\nYlYXL0YADxg83lPfsxrK6OaH/2Fe7KK9CLHCluwisI1CsL1oKcdqxQvgoMJPTUzG1Q2JYehpk6To\nJ0ofu+dlpUvW1ADFiTZgz8ImC4pV8UMaXWGh0NKttJFa8TqpbPWpHybD9NhPA/YfrKe/Z6VgDe3J\nr8DXHvsJaa6OWvE6AfYOqBqTsTl2WmdUJq5AJn/Twid2FfNzYhOCh0xegVzG/AzCZOxNXcYZdVjp\nut2q3xj1jW+N4pxCrHjd7jsTqsdkeO9d3KhMm/6eNbZbNV8pE7swn4hWmyesGlVxdURHmIzaXFXe\nYP+Kl3/ZEvKsl7efUVzxehzrzAaTYZkmD6Ckicd71tip00+6xhI+TWZlRmlc8Xoc/B0PJqNiPoE9\ngJImHu9ZY6e9WdI1lmxOzPIc0gqteFMdG9eZCSYjLO6y1dDes9qZ7GyYdcOpWZ5DyireVMcq39pg\nMuKXAgUd+ntWO+ihRUW2SgUdvOJNRWvzq5dIxv4g1cfTQHvP6vD5jUXXZM/tLdosYqx403zqB8xC\nJGM4TnMpWI+/HUrAhoXuuhLwBgH+oEoko9w3WC1T1E4+T+bh7lhmWBP2YcSkIhkt8xbI5FuMrDOz\n4Vwe2TRLkvObCXnCvcYjHPfitH/lznhJX9oCK9aBTMZ+ZLFdkvg2K674lb/VolhFucfxZDLq42JD\npKCVHKflr1N8C1av4Wkpk9GyXtAKjs3gajM77OXIrluC5knElMmAx1B2LO1mZA9TG9t1xWsqYhUo\nySBvQo7x+K0jFnm1coxHfYLBlGS0+ig8hrY9dQX5u0tZtO5fAlBJBvxbSJffcX/d9mz5DDCCsgZI\nMsQfA5Q30GDpbfiyO8T33Ooitc/yqwP9Y4D7xR8DBKMigzix0n5Y/iOnd6HKZzga+WOAe/4PUwT3\nz3GFOWgAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left [ \\left ( - \\sqrt{2} \\sqrt{- z_{0}}, \\quad \\frac{\\sqrt{2}}{2} \\sqrt{- z_{0}}\\right ), \\quad \\left ( \\sqrt{2} \\sqrt{- z_{0}}, \\quad - \\frac{\\sqrt{2}}{2} \\sqrt{- z_{0}}\\right )\\right ]$$" ], "text/plain": [ "⎡⎛ ___ _____⎞ ⎛ ___ _____ ⎞⎤\n", "⎢⎜ ___ _____ ╲╱ 2 ⋅╲╱ -z₀ ⎟ ⎜ ___ _____ -╲╱ 2 ⋅╲╱ -z₀ ⎟⎥\n", "⎢⎜-╲╱ 2 ⋅╲╱ -z₀ , ─────────────⎟, ⎜╲╱ 2 ⋅╲╱ -z₀ , ───────────────⎟⎥\n", "⎣⎝ 2 ⎠ ⎝ 2 ⎠⎦" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eq1 = sympy.Eq(x+2*y, 0)\n", "eq2 = sympy.Eq(x*y, z0)\n", "sympy.solve([eq1, eq2], [x, y])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Differentiation and integration" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Differentiation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is a standard function for differentiation, `diff`:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAARAAAAAUBAMAAAC3wn+EAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADYUlEQVRIDZ2WX0hTcRTHv+vuutvcdGRBCtWQ\nwLcwhD1Z7iGEoPBGoVA+zCAIkVyDUDBqT0URZJBSQWCPkaVSlLEHl2F7aNUqeiiiBj0EJSXzb1Gs\nc+79/XbndPPSgePvnO/5nc+Ov/tju0Apc6RXVKVU4QPY7ZnsytstJQly1DYE88rA3riVVqH5kZUZ\nUZXMOyhgt2U2QK1wLS1jtYStdAzqoJUZ0ZjMj1DAbstsgI4B14uxKvxAYHmRJdNccYDdsI9iLbLY\nAd0AuoNF+t10BwoGYck0tR9gN2yNQeyAJvSCQTYGBRyooahgEJaEjdPKzrbGIDZBI7qa7Lh0mnj7\nPj13NIWcj7cnuxg/SU6DtCV7gXOR6adCan+2OREHaillZxODSI5aF0kZbc4X06NUtgfSFtGGb/E7\ndNL1cKM8BHcjtvEj2E0egPMWlLg2j3seU1LDFcNuwn+nlJ1NDCI4qE45rxhtB4EhKtsDuUM4hbP6\na0AbgAdKCEo/KtPUf5c8AHcYzrmyIXRSxpJLd817ac4PlLKziUEEBzF454y2CzriVLYHouPVcZ9x\nGGn0QaFBRlEZp/QaeQAtKWBxXb85CEkqyuupgBbh6IvFbsdiDykVHDXDJW5zzz6h0B7I4+etf/gP\n2iYyUGiQ+vxBPkeBWcecepM2GEizaA1CsjgRwdGYZrSpfVm/6AqYSnHQGzh8dPa0HQ4dP6OKNYh5\novyvZRyJRJB2GIeMFiO8SCk7mxzE5OROJLMJFUtUtgNy+uHxvfPMYArwxlGWVqxBzDu23g9tyRsl\nHhlJXv0VPPqql1Vw6I7Aa7TRgCfMLnrGpUE1PZFO7a8yw79B3gEoPnou8tFEiNEA51WUh7XxPT7K\nQNLlVBO2UlgnnGXzRCQH1WmcNNre69hJZTugiWz2t9o1NfmD9mtnXvY6uxcOdS/sbxqknA6+OduB\nDT3HgYnsL78ptSbbd6QpfCCcFjGI5EA9mvAZbeenv0apbB/EsJVmfZ9DSalbhmmHJTmG6FKRGybv\niEgLF6trLVBhp5lbv3B4S8oXckta9qN3YHWAVK2utUCyo2Dl52va4SCwi8OcxK8A7LYs14X/A+Xe\ngqD2JCNB/sycxGyLz6USluv6T5B8ncv7CCnJN7y8UolQduVtkZIA/QNzXD11A2h55wAAAABJRU5E\nrkJggg==\n", "text/latex": [ "$$2 x \\sin{\\left (\\log{\\left (x \\right )} \\right )} + x \\cos{\\left (\\log{\\left (x \\right )} \\right )}$$" ], "text/plain": [ "2⋅x⋅sin(log(x)) + x⋅cos(log(x))" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expression = x**2*sympy.sin(sympy.log(x))\n", "sympy.diff(expression, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A parameter can control how many times to differentiate:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAASgAAAAqBAMAAADyltuVAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWYiRInd\nuzLEnmxuAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFAElEQVRYCe1XXWhcRRT+NjfZzd1/FESlJS21\nKn2QJcSKRGlQ0EaLrj+VSkGutF2VRcyDEPqj3ZemFhWviFK0wVX8eVDMoiZqI7q+tAb/NhKqFYpL\nCRVFmqRp/Ulp13Nm7sxcdzebPCV5yIHvzjnfOTPn7JnZnbvA0pTAmqVXV8f900uvKASXi5rnrix3\nap6NWj5T823UcqeWOzXvDswzsOWWvzfKUDs315SDtQGKOkAuRmOpk0JRrS6g4Fuk3+ivDY96Rvxq\nw9ql+O0FY7Jmlzy7mdZkNJZ+jO+uitBZu8mhYGJ2atVOoy0nrfh5zSLkor3LmKwRJcXqARiNZSes\nq6oidNYbyKGgY1rTWg1OIVHUllb2AbEubQmFKE+GaGSwBBwx1Dw4xdj/WZM1QpMUdEzU1Wp4HTbU\n+dQjtUUR5Uk7jQyW2YriFFVFmazWKuq1B15EyCGliFFtn31a03axpiimPAnlaTMJLAFHDDUPTlFV\nlC/rLvIqqKk7lMKj9Q094g/39fSfxW9rT213yAxS82n7rKFsHuE7t2RKkrIy3e/QvrWQl8Giirp+\n+B4ZfuryR5jnFFRUZ+Yw8NZg3+MetX77q1kH2EymAqlCflYKjfbn99HzZqCIJ4HvHPtfMmM5UdSf\nLo5hIBXNOZLqxHPOUfo690hQoCrKXo2TLodbJUSZ5xRjiI8g5oSn8XVQUlah9UiUZu8nU4FUIV8p\nRYwf5oE3U3D4k/0I/ENkNCmKoh5OlDehuehRH+HL1BVUCNkMFq9ToR60lTn8jzXgAsApxhAtIH6R\npm/yqEgqMh1wgRVkS1SEsHsdbdqeb0mOlslqor8T0QuPiXb/BPzFVJ6Lik8BicK9siimUniKnIhP\nSiDS27vnmt7eLmBDmigR/sMxSipSUFETSeB8yypZFGdFqMTeCR/YZiG3EttFjBazPqmkuVMn/EUF\nZqio0uvldlpa1CmdpiiivU4NOKSK8M6953htTjGGtjxwwb5orVYUEg6r9YrybV9iWhT1ElpnfEXJ\n7RMfPf3K0Be8DlO0F6yGixKse0XpTj2Ywgt54uX2cafO2dlsmRhB0XFg9X0f2GbxHfQmOph0tC8D\nNvqK8g76WmAgf6Wcw9SlwUlsq3vQ6UwhyeFvOGimSO+gN6URngnkySahrIHUEwimzCHfLz3iOWj0\n1hzaHOCSFI7z3nnbF0nTmSrhZBm78e4Hv3M4UeGp2CRfqi0FCaa9TtnXIuJyOP3fjbnEc4oTiF+H\nUCG86zQzTA0kf8VBUrf6wC4W7p6Stzf/Qup7fc/mxyu3jlfuWnmmS2xO/O6zrr314zxClQq1gPfM\num3bjmdIDZUlSFVFoeOBz8Dh4U8fPcw8pRivdOPl4TuAvZUzaUl1ZNZvyZH6tA+kCjE/+IqpHkcM\nMYobVzhkGuoQWQwWr1PS8D19KWJJ68Uj5DIU3w4Keo65GjVVpezTdqBEh4gAQ/FlzGCxXDlWP30p\nVpLveYKh1GXMo5HjRq2viXMhXNb3dLySpGqKX1sYjcWkuKkMjHKwptRrC49G+o1aX9NvdHR9DWUf\n4iBNcXW6wvrTiTUprOHMYJnjNMXVKbBDinoxVXbtyN+RKlHUAeIZjaVOCkWpV2Ee4V3RjRdbYK+6\nohc4beN06opuHLXAXnVFL3DaudIlnLkiFsEvr+hFSDx7SnVFzx6xCB51RS9C6tlTqit69oiF9/wH\n3sx3bS/twOUAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\frac{1}{x} \\left(- 3 \\sin{\\left (\\log{\\left (x \\right )} \\right )} + \\cos{\\left (\\log{\\left (x \\right )} \\right )}\\right)$$" ], "text/plain": [ "-3⋅sin(log(x)) + cos(log(x))\n", "────────────────────────────\n", " x " ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.diff(expression, x, 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Partial differentiation with respect to multiple variables can also be performed by increasing the number of arguments:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n+Pp3bDD7AAAAAElFTkSuQmCC\n", "text/latex": [ "$$4 y \\left(- 2 x y^{2} \\sin{\\left (x + y^{2} \\right )} + 3 x \\cos{\\left (x + y^{2} \\right )} + 4 y^{2} \\cos{\\left (x + y^{2} \\right )} + 6 \\sin{\\left (x + y^{2} \\right )}\\right)$$" ], "text/plain": [ " ⎛ 2 ⎛ 2⎞ ⎛ 2⎞ 2 ⎛ 2⎞ ⎛ 2⎞\n", "4⋅y⋅⎝- 2⋅x⋅y ⋅sin⎝x + y ⎠ + 3⋅x⋅cos⎝x + y ⎠ + 4⋅y ⋅cos⎝x + y ⎠ + 6⋅sin⎝x + y ⎠\n", "\n", "⎞\n", "⎠" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expression2 = x*sympy.cos(y**2 + x)\n", "sympy.diff(expression2, x, 2, y, 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is also a function representing an *unevaluated* derivative:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAANMAAAAzCAMAAAA6nc1pAAAAM1BMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxgEwMAAAAEHRSTlMAZnaJIhC7RM0y\n75ndVKsgyGZyxgAAAAlwSFlzAAAOxAAADsQBlSsOGwAABM9JREFUaAXdWQmT6yAI9owx1/r/f+0D\nFWLM0cZ9O5PWmd2SFAQ84IMK8Xr4xRspX/N9EocLISyfZPAbtrrZ2zfYPorFuY8y99JYqbQ2wOFG\npcbv2Cn0x3awRwb+ZHfp/od8KXs01A/JXB9wxz59jMmbIMUC586GL7pU0ygG2CITvuNCeTkLETqh\nwR09fvq5Q/t9L63RPoAzWo/6G1xyg0c3uqC+wZvog8m+TF8UG5YcE4Ycyx+5WXrs7mCBELMThPAH\nXyQEBUuy850ltxgaYKi7Idw3prEWuQl8iliArzwTRz5auk43t8k3QqgmuQlxG953R5UQE0c+iS6y\nLXdN7Bszc6ucmONB0lSxMnHklJkgO413E+14uflHetK7VjkhpqRxorVk4lDZrOVd2NoKoFrlVnij\naPWZOPSp4WUrgGqVE5JcMSGby0SD+YciA+DDlnEpN5+fZwcRzEW4Iya6UUy0GLKX8XcDf57iWu7c\nJ9/P89ylmzRSNGNib1/LG9mIOa7lzn0aoJ8V8qFTpJuJFg/2MmPO6VapxTil6dDYEYA9HkurldKY\nlL2apWIEcCaXNFQ+WRWDpBko0iUuR2eEifT+t/+7tP8WTrmEGDtlow1eFw+FpcfELzoFXQ5UNZG+\nE7n8deWTFjNuiaKgkLl8SPcKgEUmaPbfffYpnccSEpZtzqmgR99mUDVFUAJKXVxk2kZxIpeN2fpk\nZhG3Na8DGxzxBD4hEc/kr/7xvFDm48BD0dOVxU5GDrg+pLAIsHgKnVqT37EcJJ8exzTEjwx/YPIB\nF6Mu60yeHHxqDL5o+n7k9cYvCpWO6DmXYtANsLoP5CosAMG1jRzNv90nCN54c3YnbLNPJPofPlfb\nSpX7fRoNbqXkavNYjgyqfYpHbxfduFfHBMlvPl9VXFqN2CVbR0a8s003WOUv432CGyWGeAhdcMnM\nhdLkiVyeuPYpousEsVfVaffw+TLuvaq4RjBpm+DS4jk40B1EJUMmmwEpmM7HFkePkQvd7ehGncih\nhTBqn1Cng67jdnCOW4ncGS/5uOLCl9Q6LxiwlSQ3ETUtkV2UgiRS/GBll1HhCgkDiWrBekdLJWOi\nivOdySVltU92gQOy6wrz6hKBCmNnvDBZcMUFLw8Z4D1NkOUGzKcN41Ku9gnnpyy96uopM2Ri2xlf\n+TCrxDtxxmBTv4wlWruAl3KWjmhSgw2IfaPbEowgYu2Ms3WZyBXXCYPixcns9INBPc2r5ztyiLsB\nilRDUjpgIjHk1FdwV3XNnqE6e2JpzHc35Bz8FrZHPxO9YkJQZ7zwB0iuuCDH5db5lgFS39YJy7i0\nYnzx2CpH08qIuuCJiaIzXkLqteLaMGRY/IN3ydQxdabCk7S9+dkql6Y3hMSYKDrjJaReK66CQayw\nGGO9rBA/RJXG0NcqF53iZiwRZWe8hNRccZUMBSz2WullG5Pe3JS/Zys74xi5C0idlFcMh7D47828\npaHujBOM5km2DMewmJkfQRBsps54CamjgRXDMSx+hCtsxKYzXkNq5NowQL7D7LaDxTzdM4hkX8T7\nO0gdLSwY4BnT7B4WP8MVtqLojO8hNXIVDPB0DIt5tqcQLzvjNcMeFj/FlSY7jmFx01SPETqGxY8x\nr8mQY1jcNNWfCf0DhT0mZT1jGeAAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\frac{\\partial^{5}}{\\partial x^{2}\\partial y^{3}} \\left(x \\cos{\\left (x + y^{2} \\right )}\\right)$$" ], "text/plain": [ " 5 \n", " ∂ ⎛ ⎛ 2⎞⎞\n", "───────⎝x⋅cos⎝x + y ⎠⎠\n", " 3 2 \n", "∂y ∂x " ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.Derivative(expression2, x, 2, y, 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These can be useful for display, building up a calculation in stages, simplification, or when the derivative cannot be evaluated. It can be explicitly evaluated using the `doit` function:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n+Pp3bDD7AAAAAElFTkSuQmCC\n", "text/latex": [ "$$4 y \\left(- 2 x y^{2} \\sin{\\left (x + y^{2} \\right )} + 3 x \\cos{\\left (x + y^{2} \\right )} + 4 y^{2} \\cos{\\left (x + y^{2} \\right )} + 6 \\sin{\\left (x + y^{2} \\right )}\\right)$$" ], "text/plain": [ " ⎛ 2 ⎛ 2⎞ ⎛ 2⎞ 2 ⎛ 2⎞ ⎛ 2⎞\n", "4⋅y⋅⎝- 2⋅x⋅y ⋅sin⎝x + y ⎠ + 3⋅x⋅cos⎝x + y ⎠ + 4⋅y ⋅cos⎝x + y ⎠ + 6⋅sin⎝x + y ⎠\n", "\n", "⎞\n", "⎠" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.Derivative(expression2, x, 2, y, 3).doit()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Integration" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Integration uses the `integrate` function. This can calculate either definite or indefinite integrals, but will *not* include the integration constant." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAAAaBAMAAABCw30eAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD10lEQVRIDbVWXYgbVRT+JplkJ5nZ7NCWYl+W\nNEpepBhllfWpgygtlmJQEIXCxhUXBEMXKaiIEGqpP4guaAurwkZRKIoYf0CwioH64IO6AaF90MqC\nCCIqG7VF6mo8Z+45d5PsRPYlBzLnnO8753xz79ydWSDR6p+GifiYwWyUXhqzROJ4Lwr+TCTGDHpV\n99KYJUaMz3dHEGOGveKYBUaMrxv8gNDHRpQlw+6iwSeiZL4PDW6u9WWY6MSZ2xIwHfWzFB/+9hOL\nnDttQxMc0nxGA/HuxbPtIWi60g/cjSOc5iIBnSUJNK/gaFUh5weNxL+k+R4NxO9Edvi8+v26wctv\nvcelT9i+eRvFQTpEYc1CH9goDmSzKM4WhXnd+OuB3wRRN6Bb6PXWmTihLKZtFAeFBtIbFhrS9SJl\nnDWJRPcnYH9bSeMHdIVyGxLQjttdjaFc9390D9ounJJQdFfCTd0dV99WLgKk68yXq8jcdKHUkupU\nB3BKM3fSJk9SOGheF9IKWu/u0gPAXfWHr6WiffQT6qL0iC5lL4RmolObOO4txbpfRHgfc6G3WJRq\nf5EG4tHiM8AElQzaXE1bSTc4Ab+Y6eKpFBV9RHcrUx+THqubuSwTs2G2m49i3ZPAansW6YYUw2sC\n9+Fo+AaQt6CST0JbSderIdigxllmn6UDJVPPSLXV9Soy0UGuxaRfCa4AU7Xv+3QLVSDEK0wH63TZ\n8zTbq5zzxmsr6a42gcuTa0b3R1qvTF3l0geXl59fXn6RQ9DGy0RMFRnwK3n605pq3dGebnLOxrrA\n73yJdTlQ44coraT7LlX+7W44PzNKukrFupTpevnEyETaW45lvZ1b5h/iNDbeZ9o/jjMNvm5avoNb\n+bHEiFnvP265HOe0z0rdwyGZ6r4DNzIT8+F1SIXx8/0VmKu+aQrjK5+r11Lr2Lv1XH0FXKOttN5C\nB5lLeVo0G50rpYbOVdBBKjIT55qf4QAV+y183cZp3Hvkc+6NLUvTrvjr/JqfrAlmnHty4ZuGtuIs\ngl+Qq2VOfRkxXaf7l6nnTbmu9+BCfVYm7iztuEBzg/1/RO75+6vI9Xq0bmO0uc4Ne/c9QlmuLZhx\nVNVrSCvO9WZweOFGYKX3b4d42lylzBm0+7zS6/2lEwfmAR9j15miYpvvyb53kJJbvN90bj9OqBcp\n5TYk0uerxBafb9GzpJ+xkd8FLRjwb1P2OP0Svgu7BgoTEuc5etRNJfxIouHvoBYM+KvavF1kHyo8\n/B1UPMHvni9/Z2H73bc3YKmEwFko1duMH1LS3oAC2/V80tmOGbfN6zb+z/kP9lzyp+P2rN8AAAAA\nSUVORK5CYII=\n", "text/latex": [ "$$x \\log^{2}{\\left (x \\right )} - 2 x \\log{\\left (x \\right )} + 2 x$$" ], "text/plain": [ " 2 \n", "x⋅log (x) - 2⋅x⋅log(x) + 2⋅x" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "integrand=sympy.log(x)**2\n", "sympy.integrate(integrand, x)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAARQAAAAaBAMAAACEI76OAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiKZu6uJRO92\nVGZ6zyUAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEL0lEQVRIDcVWXWgcVRT+JrvT7Uyy27WlYomQ\nNCi0hWJB86C2OvgDAR+yUNAXbUaR1LQg+1Lig5W1sYI+mKVoMBLKYn3wrRGLiCLdJ3Uh0IWCFa1k\n8aGlVJBgaZtUXb9z753Jnd2pRIT0wN455zvnO/ebe29uBlh/8w6+uP6Tps/4AY6lJ9YfHcZoaf1n\nTZ3xEYzVUhN3Alws3olZU+fcm4quCTxgVRX+/z57oerntlbb2l3d8ckAzsSVAMgeq67WiOeWTXz3\nyfeB48mkie5tHErDFQMjOxO5Szp6zoCdXe+Bt4KepjPMfH/FFJlHjyzEz0VgN7aUsDmZNKkQG5sd\niZgB50s75Vf9QOL7+YtrrK5vAl/jKnCC+VyFg2V8C+ft6SIK8/AG4dVN6qJ+qlS+BXdQxzasGcBr\nhqIeT/xyga+FQpjaFfgcmA7IkMPdKUVWCueKgueX4MyrhoCZU6W8Mpw9GrdhzeiQcrbdlspMiUN3\nV+CBIqXcBE43u6S4ag6SNlXg/wXs0lMmpPg3il5L47YUw0iuiqHvl2d3V5V9/K7rlFJXUpy5Rg3+\nO68ulIG+UNIkDYTw/wTGJaTZc2L675MaTcCGIVK2LXwEfDrz23emDN+K091VUH/ZXQZGq0rKkyW8\njtPFTKvOsAUaSWNVZFnyq4S0hBSvvV2jCdgwKCU7jFzdX8JjfaYMb4jT3VXQTMXlqhgpD9MLprBR\n9ibTlLSQQiXlvIS0hJQfT92qKTQBGwalZPga19huShdx3Cee3XXzg2L3ER2HE29QlkdiU/WwltJb\nM6QBvUGjEp4YGnp0aGiHuNKvUMG5z7phw6CUUb7P8oZ5S8pXhmp3FUifCB7bRVJylfwKpZTHgn5Z\nkFgKD2GeGpUU4heFJkYpvSWIfDEbNgxKWawBN9xrzjeqRoZISkdXZn6AW5oEfi+KFLUq4fNzvFyt\nDcqVUVgCTglIs+ccYPyeQhOwYZhVue42GoEu4rhPPL5FR1fe9iH6SleBl5jnbfAF/5ZqP0mxdWx5\nYW0YTD+2XBUcUdUJKYZBKb3c3JV8TZeoMTq2HV2B/bMzUzygzhmWUeczAXbi40+eFpIXykj9fJH+\nAJiQkGavir8dhbpCE7BhYBLZM+ip+rueomRjM/Ls7sorrt3+A87c9wEXaPpmyZ34sIaedpurA38P\nh1fO7mjxbniLrpxxsUiKSo1MHNJoEtaMkfZxPDv7rsxyKzRlap9Tukbp5PMotp6vE1IXf5xyRZlY\nJEVH8XgbWPK5pvPC3qhQXfxRgLhrjNhOvsz/WfyB/w4t8+om2GqBlnsbWCou8Hc5KuW/Q8virha2\n6joPyXswzpVWQaR8JNjZf/W3BMDRuOJI7NGxPhJsOPK3zTVeFj/+dFKJRIeodG1PZ3ZhJohLo08n\nBay164GYzi1LLJGV+M9uxwflP9x/SR6zRszCAAAAAElFTkSuQmCC\n", "text/latex": [ "$$- 20 \\log{\\left (10 \\right )} + 18 + 10 \\log^{2}{\\left (10 \\right )}$$" ], "text/plain": [ " 2 \n", "-20⋅log(10) + 18 + 10⋅log (10)" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.integrate(integrand, (x, 1, 10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The definite integral is specified by passing a tuple, with the variable to be integrated (here `x`) and the lower and upper limits (which can be expressions).\n", "\n", "Note that `sympy` includes an \"infinity\" object `oo` (two `o`'s), which can be used in the limits of integration:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAPBAMAAAArJJMAAAAAHlBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAACGjDitAAAACXRSTlMAVO8Qq5l2zWYZcMvdAAAACXBIWXMAAA7EAAAOxAGV\nKw4bAAAAHUlEQVQIHWNgAANGZQYGk5DJQDYbqQSr03QPsBkAJYgIYEZbtZEAAAAASUVORK5CYII=\n", "text/latex": [ "$$1$$" ], "text/plain": [ "1" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.integrate(sympy.exp(-x), (x, 0, sympy.oo))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Multiple integration for higher dimensional integrals can be performed:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nXIzGPgAAAABJRU5ErkJggg==\n", "text/latex": [ "$$- \\frac{e^{- x}}{4} e^{- y} \\sin{\\left (x \\right )} \\sin{\\left (y \\right )} - \\frac{e^{- x}}{4} e^{- y} \\sin{\\left (x \\right )} \\cos{\\left (y \\right )} + \\frac{e^{- x}}{4} e^{- y} \\sin{\\left (y \\right )} \\cos{\\left (x \\right )} + \\frac{e^{- x}}{4} e^{- y} \\cos{\\left (x \\right )} \\cos{\\left (y \\right )}$$" ], "text/plain": [ " -x -y -x -y -x -y -x \n", " ℯ ⋅ℯ ⋅sin(x)⋅sin(y) ℯ ⋅ℯ ⋅sin(x)⋅cos(y) ℯ ⋅ℯ ⋅sin(y)⋅cos(x) ℯ ⋅\n", "- ───────────────────── - ───────────────────── + ───────────────────── + ────\n", " 4 4 4 \n", "\n", " -y \n", "ℯ ⋅cos(x)⋅cos(y)\n", "─────────────────\n", " 4 " ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.integrate(sympy.exp(-(x+y))*sympy.cos(x)*sympy.sin(y), x, y)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAI4AAAArBAMAAABcAq1mAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWYy3bsi\niUSr8q8rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACEUlEQVRIDWNgoDYQMiBgIk4FjMoIncyu/vjN\nwa3AJOQzwhwGhnz85uBRwDZqDiggcQbgaPiA0xl9wydEv6QBbC0uAqcCVqfvHrg0DUZxxgS8riIg\njdBLQCEB6VFzUKPhPxYADCPe8vIq9fJyB1BwoatAleYHS4PU4QAEIoSANMJQAgpxS1/dilJl4FYI\ntgunNO8BlgKEaxgYcCqEKMIpzXWA8w9F5kyF6OZ6wPMPuzlHo3ciS0DYSO7hDAALrYYpYvzMU///\n/08ol/kAjOHAcP8BmI1VmoGBawNIlk0brAZIcCWwzkwORglskBSLAQOTAojBgFWagSEJbM6JarAa\nIHGVwYDtQACMB6eZFjCwQByJVZqBpx1szgWYORxAI7h5MM1h/wwzB6s0Ay87yByOA0BzmK+lHmB4\ny/CS4TSfA9wdSAyuzxAlWKV7wOaYMQDNeXWA5wJnoeBmhghOBSTtcOb7C2AlWKWZE8DmXACaw6PI\nYDqB6f//DwxrGBbDNSMxlkCUYJXmZQCZwzgBaA6LRlozki4MJmsAHiWSYHNsGYDm8DtgaEURSGXA\nrYT5AtgcEReXT278F1C0oXMYAxjO4FTC6OLir5IA0qLNwAQ0B8wEcTEBMOPk4FPCBIp3BobfDGwF\nDKYHwGxsBM/auyEL8CnhB5tz+78HQ2pGAzYTIGLswJJzAR4lvPu/4NGN21xsMgClwcIux+i3tgAA\nAABJRU5ErkJggg==\n", "text/latex": [ "$$\\frac{1}{4 e^{2 \\pi}} + \\frac{1}{2 e^{\\pi}} + \\frac{1}{4}$$" ], "text/plain": [ " -2⋅π -π \n", "ℯ ℯ 1\n", "───── + ─── + ─\n", " 4 2 4" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.integrate(sympy.exp(-(x+y))*sympy.cos(x)*sympy.sin(y), \n", " (x, 0, sympy.pi), (y, 0, sympy.pi))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, there is an unevaluated integral:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHQAAAAuBAMAAAALoSCFAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAmYkQdqvvRN27IjJm\nVM1kwppwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC30lEQVRIDZ2UTWgTQRTH/8km7W42X/TgRQ9b\njVDooaGHHLw0thURDw3Sg3qwehXBRcRLwQTBi4JdUXrTLqLgoZCcRLw0vYkIFjwogjR68yAEay1+\n1PhmZ3bcZLfZdgcy897v/d/MvM3MALzFDhaFtefhWKmy5xyeoGyp5YipiXbEREC1IqfWo24XmDEj\nr7pUjJz6IyBz+O5u5tM3/alxO9nyUx9JfPchqLb+y099RNvyIahmKoD6dLkNHyKQCaQ9ypVaD3Bc\ncTaXRexVkAZvKgzr54yu6LDjpSwBkzY39MW8IGyYKztO9+1Jc0XWdmKA0hJGbk0YbFgwHUereBiu\nYJ65q5IVhFUtSgSlw52uVP3rx3tMckvqSsIakYQ+pThMXakDnU6bNKmaFGZNbn6SBIj/5A6lKoVJ\nE4OnDkxbIp7IU5XTZ6/SbmNkIjV0ctsF5Ga/ydTnNu6jWlSbZY6gNYFxvCzfAdItYtdsbcMF5Oa2\nqaNGq94AVhqnkaw5gDp1DTiEseIHqougcgmxlgsoXBeHVavoNEnO2OdJHTCBIr6wmfQ2bXoDquEC\nYuvEWNMqGTq2OaveKNFavLFUwLkeLHXAwgQj7n0Za7EwS3VWzT8ujHJAPdsw9N/MH6wBEwbWJSBj\nKU8dNar1AlA133GXsybwlh7MKf6ZJtbwMGMLQILLbGZqmoVnDXzG9fkXHFAfz2NwW2unmlSnQX9G\nOX0z7gL6auIw6XObdmrosIlsp0Or80a7VGanjr4mL9sg7ezok+MuoBp6X6YHOPK+LFI9B/Gpi/6P\niZ6XKWNRXfTjbdU14B5/CYDkH49DpnKbyhblk2WLqLx0HrXqfHoPGC9M7peuvOpyDhmiM9D2OH5z\nWaCgB2ZF1uXPCyEzRohg5/CcuXMsJLIQEu8T/tsn1j+kizeivyowmu79WwNVgTB5PhDvBuaM3agC\nNdVGIA6HIzgTLgpWLOoXgwPh9NGJqPv9B1boo+M9lsVhAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\int \\log^{2}{\\left (x \\right )}\\, dx$$" ], "text/plain": [ "⌠ \n", "⎮ 2 \n", "⎮ log (x) dx\n", "⌡ " ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.Integral(integrand, x)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHQAAABKBAMAAACYxG3JAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMs2Zq91U7yJ2iWZE\nELuNX9C8AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADSklEQVRYCe1VPWgUQRT+9v5/sruHItrlQLCw\nkBMUISIcQsBYmFMsRIRcYdRCScBGsHBBLdQiJ9okGLMhpjhBciCCaOHGRrS56yJpsigYLCQXCTFq\n4vl2Z3Y3uT3M3ljqg9t573vft29m9s0cQLYFSJZ1y2vXtnYDL3C2XZnN7wfOQK2JaPshLyJeFJNK\nK4hWBKVriJYEpSuIC0ppraohVlV4h88D98S+6/W+HqS6DonM91/ThB8Ldb+1Tfdn8oK7Ja+KtTCV\nS9YFawJRU1g6JHRs7HJjhnDVBeFPg28tik58DPI+ackvTWmRrB/1IcnvPghRje66zU1Z9XOiRqIF\n6uOpaz6IgFhLtInZWWgC7DBQb77Kt5JOMPAOzz1vxUGv3UzSYX19Np2zo4TJwYjGHGmeJVjUZ9jj\nxoP3DtMWGtLsHCBnuaMWuUOD3KjZgZL3MEi7zn2xwqcuVuZelbHtKMabaYM03mjUrewpLgBmuDfp\nIkDqFws2SHk+UXCJIYO5O12ElvODBSSVyyMGOo4eHDZ5PpmjBQ0feUuzDZOLRNfdZQegUF1mPJJu\n0/AZ1Vq0UuJSpQLM4lnpBJDOEvZGU9YcgMIh3qwkPQ10ZroRKXAlokXgCaZqF6i7CJSvIpx1AOIM\n1BlRyUtUX9UPrJPGDaCGPRZBIlqY/sN1ByBsKksPMiUfo45XzaHMTNEG6GFJAftkWdK4iTnDAWhc\nyNGDjFfN3SqPM4Ce1oQhLVpxRwGY0zHgAuRcK9KDjNZ6GagaF1nIsApwie7aUbZNc0V8iGkc8JoJ\niontGezG6+kdrjiVQ8eyUk/QG8I6fcdS+mTKAWgivJmk3iUt0fXIQKjRoOrMaJZyz+i9lxSFMlSm\nZ/zGAwegq7/5ZvqE9/0lR+s14k0H8sbIT8+3vJhJ66IfM3/7Oxkao/b+eYB8nHas6MSKxj0560De\nqNY93/ZmyyN7Xcg96u473BR1nrku8Lt/umDGdD8/INJrBCT6aX1+KCjyNSjRx5P4HeFLbA6kmz7r\n5gqXERl03XYdVW9X4fKrdCCEbBLHhHQkmpeuiEpvPxSdr2jFv9VJWdE3SPsKolL7n0RQbP0JCdp/\naaCNiw0GorUgJfYvlVrAAaDftrjPkt1IQLoAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\int_{1}^{10} \\log^{2}{\\left (x \\right )}\\, dx$$" ], "text/plain": [ "10 \n", "⌠ \n", "⎮ 2 \n", "⎮ log (x) dx\n", "⌡ \n", "1 " ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.Integral(integrand, (x, 1, 10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, the `doit` method will explicitly evaluate the result where possible." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Differential equations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Defining and solving differential equations uses the pattern from the previous sections. We'll use the same example problem as in the `scipy` case, \n", "\n", "$$ \\frac{\\text{d} y}{\\text{d} t} = e^{-t} - y, \\qquad y(0) = 1. $$\n", "\n", "First we define that $y$ is a function, currently unknown, and $t$ is a variable." ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": true }, "outputs": [], "source": [ "y = sympy.Function('y')\n", "t = sympy.Symbol('t')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`y` is a general function, and can be a function of anything at this point (any number of variables with any name). To use it consistently, we *must* refer to it explicitly as a function of $t$ everywhere. For example," ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAUBAMAAAAevyJ8AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHaZIu+JVM27RDKr\nZt2dj8xZAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA8ElEQVQYGT2QsUoDQRCGv425i3fqcWWKoIs+\ngAFBIgq5RkKKwD2CWFnaC5paGwsbwSJP4D2CIjZ2BzY2QgqxFju18Z/LJT/M7rf/7g4zA7VGtq9l\n9Qma1xU+L4xl3a1ntBfGq+gCQj93PgQ9cHltNKeCT8UlbstzmDa6xC8/T7BD2MrZJiqh9aUXbwyW\nxtySnIIAzkkDzzfBBJIj4AGKdOWPYAIbCjN6NPLqS4GDe7gjeqySnnBmSdmjKAm7cOA87ELnuJ8R\nT2H4rhxXCisZK11Sxatj9yuy5iQ1l5SRF0WZFqz9eHPfqB7QjfFM8xH+A2BeLPY/vHjEAAAAAElF\nTkSuQmCC\n", "text/latex": [ "$$y{\\left (t \\right )}$$" ], "text/plain": [ "y(t)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y(t)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We then define the differential equation. `sympy.Eq` defines the equation, and `diff` differentiates:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAL0AAAArBAMAAADfxpRdAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMrvvmVREEIndzSJ2\nZqtw62vAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADH0lEQVRYCbVWz2sTQRT+ml+7zTZN/oMGPQhq\nqxf1YiEHD7UUiXgSBAM9FaQt2Iu1kBV6aekhIIKlKAkUDxEk9OZBSTF4UulBEBQheBLtIQjag4i+\nN/M27G4nPTkPdubNe9988/vtA1iGjpdUba3Il61RK+KFRbv8a3bpsW2T35va/WmTf7aVOLDI70wi\nVbfInzrAsG+RP1lEtWKRv+rjpiX6BvNWyziZbtkYwVHXJtvOPXZt0CNdY1pn/97L1yF+b48bn0IW\ns/qCzbkjFu5d3i4Yuu4o2+gRHRXAK6rquyrNRbZssj+lJW3BqZt8IVuWJnCnheWQKa7mTXPMlYB0\nD9iIo2Pt99Sme+e2xX4j5E8fIzmB2ZCprw7ToPyeb/ctZmWLzNO01LPiDvOL6Z1jWMBzcvJ7zlYE\nZa68Gtkf0vdE/Ab+mei1XJmBdwEdYP7MRBupknSMVxo2UkLmy4994FKM39noBLOe34309a9hpIdx\nsvF7ztXZ6TaVlFgX0bDEnj4mfBRzMP+5lucH0EjtlaeRKOIBGWlf5XFEEKohsOGyPiZcF4jwe+ew\nVDjciywOLiLfxnlSeV+HejHU8iZLQ2DJij4mjDFsvdm832w+I2108s0HtgTyN5AeMgcYKzC/84u8\nh/iDHhqWrFDkok/zUy3zz3dJNwvdylfg/cn0sIhMjVGumvRmN9RDw3h/FmjNmBNXwO+HoFE10cUE\n+Hzderog5xtFqJaG8fmu4yri55v0gbahF5lSxcwfYJWU7goVPplMomFuCbjitIEpwcj8R+pYapm6\n0bZ/7fxW6/XGaXLZghklMN6+nc8EaUT50XlLnQcIbS04PrDwOx4gDAPHBxL1jlmR+bMakyC7/aYu\nBMc3loHxTcPA8Y2kH9/u6rappOyWIi0e4TR7TynI4PgssIRe51HxORiLsluOCLc6Bbbo/4t0DyCh\nWmDyf9GzCbkN6pqOCOL5b//H/kiU3XJEsCOc3epIa4dfZbf8Q7QjOrtVN9rKADq7tZfg6uy2WrEy\neSKtquxWRVorQ+jsVkVaK/w6u1WR1gq/zm5VpLXB/w8+d8o2RW/FAgAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\frac{d}{d t} y{\\left (t \\right )} = - y{\\left (t \\right )} + e^{- t}$$" ], "text/plain": [ "d -t\n", "──(y(t)) = -y(t) + ℯ \n", "dt " ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ode = sympy.Eq(y(t).diff(t), sympy.exp(-t) - y(t))\n", "ode" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we have used `diff` as a method applied to the function. As `sympy` can't differentiate $y(t)$ (as it doesn't have an explicit value), it leaves it unevaluated.\n", "\n", "We can now use the `dsolve` function to get the solution to the ODE. The syntax is very similar to the `solve` function used above:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKgAAAAYBAMAAACcr6vyAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHaZIu+JVM27RDKr\nZt2dj8xZAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACs0lEQVQ4EbVVz2sTQRT+NrvJJps2LP5CQXSp\nCHoQi7+oWDQgVTzU5uTV2FNPWvQkgi54MKhgD14KEXPxJibgH2CoehAUgnrwIqwQxYPYIKKoFXzv\nZXZ2ktRb+mDffO/7Zl/m7ZuZAEO3bGPoKYHt/hokvboGOY9/PqKzTjMaLeo4AaIkYR962xcDNzTj\nLAh8pgkNRLF2v3zllDVngJGiEQj8roksaduK2KwJDVjBzhbcgy3NxcBqwwrjAJcXyXyvpIk3hK4B\nmUAzMWBlywdyx4oxhYsKuR1gVrNdkGpuiJk2gQnASn7GVO74FD2IGeikdghsTGhBdlBWjBMR+ETP\nTUXogRX7J4ePNaeTFspAtpbwjLylBqwdAab81Di8F7+WgP29MwBSMBMxq6vSK314vxrApgnAprED\nPCjLuCXsRa4F8AfCO6HnKmzXGbNyIRAW+bA76pVSFzDKpNfGCaXxcJK+yyIK81RkSOHAcWBlucEz\nkZ+MZNQr5S7AjchNzVvJlgf8dIBvSNcA/kB4Qk+PpWvAWZ8pH25EA6iMj5XKbYbchXyH3PPXe2QO\nk2x1P/8H6RpdBPSsnnSZBLgNuBGNbGpLWb8JS9IVoRM3gVRJyq/DAh6JcP4r2xfGXL7sUFtVyqRK\n6nVo+V5ExA9mDasi15R2zOFK3ChD5kbNlIk4N5g0E9LypVFnaJsYL+Ew6i1kxoFJKwAOmRJjVty/\nwCV/MKndXEf9LdOsXbDMLYWts1Qd13DqPam36OkxqW599WmNWDcix6bKd+5RGdkGEal9/LJpvDH4\nmJLJyerC2CuFQzcix6aSCj4tvteNhNJDvjbI/nOhdEXQOemacbgGLhSeUWjlAhpyRXJY7epTConO\n0ZWAJ/WYcfUlvDcmR8FZEOpuIsRIKXHYPya/2a9QPM3cUP5OgH+lSJKdA/dqngAAAABJRU5ErkJg\ngg==\n", "text/latex": [ "$$y{\\left (t \\right )} = \\left(C_{1} + t\\right) e^{- t}$$" ], "text/plain": [ " -t\n", "y(t) = (C₁ + t)⋅ℯ " ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.dsolve(ode, y(t))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is simple enough to solve, but we'll use symbolic methods to find the constant, by setting $t = 0$ and $y(t) = y(0) = 1$." ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADsAAAARBAMAAACRPMnQAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWaJ3bsi\nRDIczTGXAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAsklEQVQoFWNgwAaYs108eCaAZRiVMRUkNTAw\nBjWAxE1CPmNIWy8GCsUfAIuzYUrXGwBlLoFlGTClWT+CZJ7ikj6/ACRjgyI9vRwESkFi8xMgMnwF\nQBrT8PUPwNJ8IQuwSuuDXMZgwMCIXXo9SJbxAYr0rFUgsAQkA/YxK1DFAiAH0+7zoOCcjFOa8QcD\ngyjQfpBuVqfvHkDFKMB0i+sFoADYcBQJFA4haQUU1WgcnqgvCQDOGDHf2N3daQAAAABJRU5ErkJg\ngg==\n", "text/latex": [ "$$1 = C_{1}$$" ], "text/plain": [ "1 = C₁" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "general_solution = sympy.dsolve(ode, y(t))\n", "value = general_solution.subs([(t,0), (y(0), 1)])\n", "value" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We then find the specific solution of the ODE." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJoAAAAYBAMAAADwqfn3AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHaZIu+JVM27RDKr\nZt2dj8xZAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACZUlEQVQ4Ea1UPWsUURQ9M7M7szvJLoOoWAQd\nksZGXFQkYsABiZIisjYWVktsUkmwE0EXFFzUwsImkOD+AHH3H7gEU1gIg1rYCFvEj0JkFRG/Cu99\nc+fte8laZS+8ueee++a8z/uA8VmpOz4t4FA0TrWb4xQ7++m0lltkVEl0rEEh1dACb6yIg7uaKTxU\n8LkmNFjQyAaTiR0D3zVRotzBBAc0ocEdwNnSUQaCi0Q2NXl9lSwK65p4TegW4MeaEVCpAcFAgmuZ\nn5r7SmBJyNy5vb055NFnacChvmSqCeA1JRA1uKy2T8jceXFDYKFP4AO1e0Jod4FQtSGhpVZqCysu\n3OjCmYkxH7k1hC9+bQDH7R7ADPDk8Vqc0ZaaR3sA7J8+keXU1w/qOIpyKrvzVpHLLbbbjNep0YZm\nZqlVmkSGWzgnSXbnaVNWUV2R3dlxnz9SH9rQzCy1oE/k/IozvLNAVIzxDcW27M4z6mHZZYp4QwGa\n8PtW6wFDdQoTA0Kbr45EzOTWiSb+oNimoqWGUWrOb0oos+am1P7mKfGzcOtqpR04wFPFXv3C9pkx\nrTQcQMa31MI+pX9wH8PWUO6pU1jGDSA7BSNNp+A3g27GWGrqFC7Rso3eOIVOCr8GzDkxcNJMMb5C\nx9PbI6yl5jWIPQzHvCGYWjqTgGe98I6y96lZRksvrKdCiZq3+fMloJ5a9xj/ZRpfAKlrVRNmDlxZ\n2vK5KYKrZLtNNtWRcdWT+bFyxoerXpsua2a2Vz1z1bQckysn9MGoF+mRSuz8GC/SMBlOq7ssr+WI\nX//3Wsr4QyUTLXKwu5cc+Af49YD1LJzQSgAAAABJRU5ErkJggg==\n", "text/latex": [ "$$y{\\left (t \\right )} = \\left(t + 1\\right) e^{- t}$$" ], "text/plain": [ " -t\n", "y(t) = (t + 1)⋅ℯ " ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ode_solution = general_solution.subs([(value.rhs,value.lhs)])\n", "ode_solution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`sympy` provides an interface to `matplotlib` so that expressions can be directly plotted. For example," ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": true, "nbconvert": { "hide_code": true } }, "outputs": [], "source": [ "%matplotlib inline\n", "from matplotlib import rcParams\n", "rcParams['figure.figsize']=(12,9)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAAISCAYAAAAurBzdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl0Xld57/Hf0eRBnmPZsi1bkuU5djxkMBmaGyhJTchA\n2t6uAAUKpYQh7WWxOtDe3gW09FJoe1eH0N6UUtqGXlKg0ACZQ+IkhBDjOLbj2bJsy/IgeZIdeZJl\nnfvHzhtPr6R3OOfsffb5ftbScmxL7/tE1jn7Oc9+9t5BGIYCAAAAfFVhOwAAAAAgTiS8AAAA8BoJ\nLwAAALxGwgsAAACvkfACAADAayS8AAAA8BoJLwAAALxGwgsAAACvVdkOAADiEATBJEk3Spoq6ZSk\nDZJWh2HYbzUwAEDiAk5aA+CTIAjeLumzkiZIek1Sl6ThkuZIapH0XUl/FYbhcWtBAgASRcILwCtB\nEPyFpL8Lw7A9z99VSbpDUmUYhv9Zxnt8/c3X6QzD8KoBPudvJb1L0glJvxGG4dpS3w8AUB4SXgAo\nUhAEN0nqkfRv+RLeIAjeJen+MAzfHQTBckl/E4bh25KOEwBgsGgNgJeCIHgoCIKxF/y+KQiCH0fx\n2mEY/kTS0UE+5W5J//bm574iaWwQBJOjeG8AQPFIeAH46ieSXgmC4PYgCH5L0lOS/jqh954mac8F\nv9/75p8BACxglwYAXgrD8MEgCDZKek7SIUlLwzA8YDksAIAFUSa8NAMjNXp7pU9/WnrlFelTn5Ku\nuUbq6pK+/nXp5Zelv/5r6e67pSCwHSlK9dBDD2n27Nn6whe+oPXr19c/+eST+9etW6fFixdH8vq7\ndu3SnXfeKeW599133316+9vffkfu93PnztXzzz//ar7XCYJAn/vc5976/S233KJbbrklkhjjdu6c\nuWY+/3nphhukj35UOnNG2rRJ+vu/l977XunP/kyqrrYdKeC2V16R/vRPpRMnpPvuk6ZPl3btkv79\n36XWVunf/k16G6sALlT86ByGYVQfQCrs3x+GN94YhnfdFYbHjl3+9z/+cRhefXUY/smfJB8bonP3\n3XeHnZ2db/3+lVdeCZcsWRLZ6+/cuTNcuHBh3r979NFHw9tvvz0MwzB8+eWXw+XLlw/4OuY2nD79\n/WH4qU+F4b33huGaNZf/fVdXGN5+exguXx6GBw8mHx+QFk88EYYTJ4bh97+f/++///0wnD49DJ95\nJtm4HFd0nhrlLg1UeOG8o0el3/gNackS6XOfkyoG6GLv7paWL5c++1npwx9ONETEqLe3VzU1NWW/\nzvve9z6tXLlShw8f1uTJk/WFL3xBvb29CoJAH/vYxyRJ999/v5544gnV1tbqG9/4hpYtW5b3tYIg\nUIT34cR86UvSww9LL7wgjR2b/3P6+6Uvf1n6/veln/xEiuBbD3jlpZfMLMj//J/SjTcO/HkvvCD9\n6q9KP/gBld43FV3hJeFFZvT3S+95jzRzpmlZGMrmzdJ/+2/cYNLmi1/8oj75yU9qwoQJef/+2Wef\n1cmTJ3XHHXfk/fukpTHh/eEPpd/+bemnP5WmTh38c8NQuuceqbFR+pu/SSY+IA0OHZKWLZO++lXJ\ndEcN7rHHTKvQ178uTWbPFxJeYCD//M8mef32twuvNP3wh9Lv/q6pTtXVxRsfovHII4/oK1/5ioYP\nH65ly5aprq5Op0+f1vbt27V27Vq9853v1B/90R+pzpF/0LQlvIcPSwsWSD/6kXTttYV9zdGjZmD/\ny7+UfuVX4o0PSIMwNOtHamulv/iLwr/uD/5A2r3bzK5kHAkvkE9np7RwobRypXTllcV97e/9nhmw\n/+mfYgkNEfvABz6ghx56SF/5ylc0adIk7d+/XyNGjND8+fN18803a8SIEbZDvEjaEt777pOGDZP+\n9m+L+7qf/cwM1j/4wcAtEEBW/OhHppiydq00fHjhX3fypHTVVWaW0pFJKltIeIF8Pvxh6YorTIWp\nWN3d0rx5ZjppgDZMOGTBggV65pln9K53vUvPPffcZX8/UKuDLWlKeFevNlOvmzdL48YV//Uf+YhU\nXy/97/8dfWxAWvT2msLL3/2dtGJF8V//4x9LH/uYtH69qRBnFAkvcKn1682CgH//d2nMmNJe42tf\nk777XemJJ9iqzHV/+7d/q3/4h39QW1ubpk07f9ZDGIYKgkBtbW0Wo7tcWhLe/n7p+uulT3zCLPws\nRUeHtHixtG6d1NAQaXhAavzVX0nPPWeqvKX68IdN0vy7vxtdXClDwgtc6gMfMDeGz3629Nc4d066\n6SbpT/5EuvXW6GJDfD7xiU/oH/7hH2yHMaS0JLz/+Z9mt4V/+7eBdzcpxB/+4fk9r4GsOXHC9L5/\n97umF75U69ZJ73qX1NZWXEuER4pOeDlaGF7bs0d69FHp4x8v73UqK01l60tfiiYuxC8NyW5ahKH0\nla+YBWflJLuSefDcv99spg9kzTe+YVrkykl2JTNTsmyZ9K//Gk1cWUDCC6/99V+b6ddS+g0v9d73\nmqfpn/2s/NcC0uQnPzELN++6q/zXGjtWWrTIbK8EZElfn2ln+P3fj+b1/uiPzD7XfX3RvJ7vSHjh\nre5u8zT96U9H83rV1WY69j/+I5rXA9LiL/9S+sxnzExHFD75SVOZ6umJ5vWANPjud82RwVHt637D\nDeb1GJMKQ8ILbz34oHT77dKMGdG95nvfa5Lorq7oXhNw2datZlbjQx+K7jUbG82hLt/8ZnSvCbgs\nDM3P++/9XrSv+9nPSo88Yl4fgyPhhZd6e6UHHoj+5jJmjHT33WbHByAL/uVfzErwqLcv/u3fNtsy\nMVAjC9askTZulN797mhfd8UK6bXXpFWron1dH5HwwkuPPiotXWoa+6P2kY+YFeYM1PBdb6/5WY/j\ndLRbbjEL4J59NvrXBlzz9a+bsaPcRZ+XCgKzRdk//3O0r+sjEl546ZvfjGaBTT433yydPm024Qd8\n9uijZjX5zJnRv3YQSP/jf5gKMuCzU6dMn22p+1cP5YMflL7zHXMKGwZGwgvvdHdLzzwj/eqvxvP6\nPFEjK77xjfgGacm0B/3whyxeg9++9z2z9+706fG8fkODdN11Zp9sDIyEF975z/+U3vnOaLYiG8iH\nPmSe2Hmihq86O6UXXojvwVGS6urMSvMf/CC+9wBse+EF6aMfjfc9PvIR84CKgZHwwjvf/Kb0/vfH\n+x4NDdLy5TxRw18PPyy95z3SqFHxvs/73y/9v/8X73sAtnR1meJI1IvVLnXXXdLZs1J7e7zvk2Yk\nvPBKR4e0fr3ZjixuH/2o9OKL8b8PYMPDD0u//uvxv8/dd5uDLQ4div+9gKR973vmCOCodzm51PDh\n0qxZ5v2QHwkvvPKtb0m//MvJnC2+YoWpTHV3x/9eQJL27pW2bTN75cZt1CiTEHznO/G/F5C073xH\n+u//PZn3+uVfJuEdDAkvvPLUU8lUpSSpttZsrfTYY8m8H5CU//ovMwVbXZ3M+733vdLLLyfzXkBS\nurqkV181D3RJeOc7pddflw4cSOb90oaEF97YtUtau1a66abk3vPuu1lwA/9873umWpSU224zp0Ud\nPJjcewJx+/73zUxg3O0MOcOGmeT6kUeSeb+0IeGFNx591PTuVlYm95533CE9+aTZoB/wweHDZo/p\n225L7j2HD5d+8Relxx9P7j2BuP30p8m1M+T8yq+YnYpwORJeeOPRR+NfCXupyZOl+fOllSuTfV8g\nLj/8oZkaHTky2fe94w7z3oAPjh8/X+FN0ooV0s9+Jh05kuz7pgEJL7xw8qTZMSHJqlQObQ3wyfe/\nL91zT/Lv++53S08/zWwJ/PDMM9L115u1HkmqrZV+6ZfMzCMuRsILLzz3nLRsWbyHTQzkrrtMwhuG\nyb83EKUTJ8yBE0nPlEhmtmTePOn555N/byBqjz2WzPaY+bzrXWbhKS5Gwgsv2GhnyJk3z/Qgvvaa\nnfcHorJypflZHj/ezvvfcYf0ox/ZeW8gKmFoN+FdscJUmPv67Ly/q0h4kXq5m4uthDcITFsDK2OR\ndk8+aaZDbbnzTtPHy2wJ0mzdOtNaMHu2nfefOlWaPl36+c/tvL+rSHiReps2mQFywQJ7Mdx5p9kS\nDUgz2wnvVVeZqtSmTfZiAMpls7qbs2KF9MQTdmNwDQkvUi/XzhAE9mK44QYzHdzVZS8GoBw7d5pT\nA5cssRdDEEgf+ICZjgXSioTXTSS8SD2b/bs5VVXSzTezPRnS68knzS4nFZZHhWXLWGGO9DpyRFq/\nPpljuQdzww3Sli0c5nIhEl6kWne3tGaN9Pa3245Eesc7pGeftR0FUBrb7Qw5b3+79JOfsD0Z0un5\n56X3v98s/rSppsZcS08/bTcOl5DwItVefFF63/uS3yQ/n1/8RRJepNPZs2Z2wsY+1peaMMEs9lm1\nynYkQPGefVaaOdN2FMbdd7O25EIkvEi1H/9Yam62HYWxcKF09Ki0Z4/tSIDivPqqWTA2aZLtSIxf\n/EVzbQNp88ILpr3NBdddxzHDFyLhRao9/7z9XqmcigozhfTcc7YjAYrz4osm4XUFCS/S6OhRqa3N\n9KG7YP580/a3b5/tSNxAwovU6u6WWlulq6+2Hcl573gHAzXS58UXpV/4BdtRnHfTTaY3v6fHdiRA\n4V56SXrb26TqatuRGBUV5lp68UXbkbiBhBep9dJLZsqmpsZ2JOflFq6xcT7Sor/fLBJzKeGtrTUP\nsgzUSBOX2hlybr7ZxAUSXqSYS+0MObNnm2S3tdV2JEBhNm6UrrhCmjLFdiQXe+c7mS1BuriY8P7C\nL/DgmEPCi9Ry8eYSBGxPhnRx8TqSTB/vunW2owAK09Mjvf66mXV0ydKl5lCZI0dsR2IfCS9SqadH\n2rBBWr7cdiSXI+FFmrjWv5tz9dXSyy/Tx4t0+NnPTHI5YoTtSC5WXW36il96yXYk9pHwIpVeftnN\nm4tkEt4XXjC9kYDLwtDdhHfYMHON/+xntiMBhvbii27OlEi0NeSQ8CKVXJ2GlaQZM6Tx46Vt22xH\nAgyurc386spG+Ze66SazoA5wnctjEgmvQcKLVHL55iJJS5aYKjTgslx1NwhsR5IfCS/S4MwZ6ec/\nl264wXYk+S1fLq1fL508aTsSu0h4kTqnT5uToVy9uUjS9deT8MJ9Lk/DSuYaX7XKHH0MuGr1amne\nPGnMGNuR5DdypLR4Me1BJLxInVWrpAULpNGjbUcysOuvl376U9tRAIN74QU3+3dzxo+XmpqktWtt\nRwIMzPUZR4m2BomEFymUhpvL4sXSrl3SsWO2IwHy279fOnxYuvJK25EMjrYGuC4NYxIJLwkvUsjF\nAycuVV1ttlV65RXbkQD5vfiiSSYrHB8FSHjhsnPnTPvaTTfZjmRwN95oxqMstwc5fqsDLtbXZ7b7\nuvFG25EMjT5euMzV7cgudeONZraE47rhonXrpGnTpIkTbUcyuPHjzW4sa9bYjsQeEl6kysaN0r59\n0oQJtiMZGgkvXOb6grWcxkbTftHebjsS4HJpaGfIyXpbAwkvUmXVKveObhzI9debKSQOoIBrurul\nykpp2TLbkRTmmmvMSnjANSS86UHCi1RZtUq69lrbURRm0iRTid6yxXYkwMVefdVsVVRdbTuSwpDw\nwkVhaBZ+urxF5oV+4RdMC8a5c7YjsYOEF6ny85+np8Ir0dYAN736qllUmRYkvHBRR4cpaMyYYTuS\nwkydag6ZyZ2wmDUkvEiNEyfMcb2LF9uOpHDsxwsXpS3hvfpqk/CycA0uyV1Hrp5UmE/uWsoiEl6k\nxmuvmT1Dhw2zHUnhqPDCRWlLeCdPNgfNZLUyBTetXm1mH9Iky7MlJLxIjbS1M0jSVVdJe/ZIR4/a\njgQwurulzk5p7lzbkRQnywM13JS2B0cp29cRCS9SI007NORUVZkbDAdQwBVr1pi2oMpK25EUJ8sD\nNdwThibhTVuF9+qrzWxpFheukfAiNdKY8ErSihXShg22owCMNFalpGz3HsI9e/aYUwqnTrUdSXHG\nj5fq6sx6mKwh4UUqHDokHTyYvmlYSWppyfbeh3BLmhPeNWvY1xpuSOOCtZyszpaQ8CIVcosDKlL4\nE7tsWbaPc4Rb0prwTpxo9rVubbUdCZDOdoaca64x8WdNCtMHZFFa2xkkqblZ6umRurpsR4KsO3bM\nHNM7b57tSEqT1coU3LN6dTofHKXsXkckvEiFNJ2wdqkgoMoLN6R1wVpOVgdquCW3YC2tCe+yZdLa\ntVJfn+1IkkXCC+eFYborvJK5wWRxCgluSfMgLZHwwg179pgdeNK2YC1n7Fhp2rTsHXtPwgvntbeb\nilRDg+1ISpdbcAPYlPaEd9my7G6pBHfk2hnSuGAtJ4sPjyS8cF6uupvmmwstDXBB2hPe8eOl+npp\n61bbkSDL0n4dSdnc5o+EF87bsUO65RbbUZRn1izpyBHp8GHbkSCrjh2T9u1L74K1nCxWpuCWNO/Q\nkJPF64iEF8577jlpzhzbUZSnokJassRMxwI2vPaaOeq6qsp2JOXJ4kANd4RhundoyFm6VHr9dens\nWduRJIeEF85bt84M1Gl39dUsXIM9PkzDSiS8sKu9XaquTu+CtZzRo6XGRmnTJtuRJIeEF07r7JTO\nnEn3grUc+nhhky8J79Kl0vr12dtSCW7woZ0hJ2sPjyS8cNrrr5t9Q9O8YC2HhBc2+ZLwjhkjTZ8u\nbd5sOxJkkQ/tDDkkvIBDfGlnkKS5c6UDB8ziISBJx49LHR3S/Pm2I4lG1gZquMOXB0cpe9cRCS+c\ntn69qfD6oLLSJO8sXEPSfFmwlpO1gRpu8GXBWs6SJdLGjaZtMAtIeOE0nyq8EgvXYIdPVSmJhBd2\n7N4tDRuW/gVrOSNHSitWZGfhGgkvnHX2rNlg/sorbUcSHfp4YYNvCe+SJdKGDVJvr+1IkCW+XUeS\nSeA3bLAdRTJIeOGsrVvNtikjR9qOJDokvLDBt4G6tlaaOdNMxwJJWb3anx0achYuJOEFrPOtnUEy\ni4bGjJFOnLAdCbLijTekPXukBQtsRxKtFStIeJEs3x4cJWnRIrMbUhaQ8MJZPi1Yy6muNgsEstIz\nBftee80Mar4sWMuZMkVatcp2FMiSvXv9G5Oo8AIO8LHCK2XrBgP7fKxKSdmqTMG+ri5p/34/DkG6\nUFOTdORINrbLJOGFs9avJ+EFyrVli+kd983ChSbhDUPbkSALXn/d/Mz5cAjShSoqTLtTFtqDSHjh\npIMHpZMnpRkzbEcSPSpTSNJPf2p2NfBNfb35tbPTbhzIhg0bTMLro6yMSSS8cFKuuuvb07REhRfJ\nOXtWam31b8GaZO4NWRmoYd+GDebnzUdZGZNIeOEkHxes5cyYIfX0SIcP244Evtu+XZo+XRoxwnYk\n8ci1NQBxy7U0+IiEF7DI1/5dyVSmsnKDgV0bN/p1cMulFi3iOkL8+vvNteRrwpubKfG9H56EF07y\ndYeGHBJeJMHnvkOJlgYko71dGjtWGj/ediTxmDzZ/Op7PzwJL5zT12dWlvs+UJPwIm6+V3ivvNLs\naX3unO1I4DOf2xmk7Mw6kvDCOVu3mr0Oa2ttRxIfeg+RBN8rvGPGSHV1Ulub7UjgM9+vI4mEF7DC\n5/7dnNzNxfeeKdhz+rS0e7c0Z47tSOLFbAni5vMODTlZuI5IeOEcn3doyKmrk4YPN0dVAnHYulWa\nOVOqqbEdSbzo40XcslLh9f06IuGFc3xfsJaThRsM7PG9fzeH6whxOntW2rZNmj/fdiTxuvJKc8/o\n77cdSXxIeOGcLFR4pWxMIcGeLFSlJK4jxCu3l/XIkbYjide4cWYXit27bUcSHxJeOOXwYemNN6TG\nRtuRxC8LiwRgT1YqvHPnSrt2mZ5lIGpZeXCU/H94JOGFU9avNxedj0cKX4qpWMQpKwN1TY3U0iJt\n3mw7EvjI9y3JLuT7mETCC6dkpZ1BMtW3LVvYQxTRO3FC2rfPJIJZ4HtlCvZkYYeGHN9nHUl44ZSs\nLFiTpFGjpPp6qbXVdiTwzebNZqq/qsp2JMlgpwbEJSszJRIJL5CoLFV4Jf9vMLBjw4Zs9O/m+D4V\nCztOnDBbR86aZTuSZMyfbxbpnT1rO5J4kPDCGX195pjQrDxNS0zFIh4bN2bvOiLhRdQ2bzYHt1RX\n244kGSNGSDNmmG3YfETCC2ds3y5NnWqm+rOCyhTikLUKb2OjdPy4dPSo7Ujgkyy1M+T4POtIwgtn\nbN0qvfvdtqNIFhVexCFrFd6KCpPgcy0hSiS8fiHhhTPWrctWdVcy02W7d7OHKKJz7JjZz7qpyXYk\nyWK2BFF7/fXs7NCQ43N7EAkvnLF5s//HN16KPUQRtU2bpAULTNUzS5gtQdSo8PolY7dEuGzzZmne\nPNtRJI+BGlHKWv9ujs+VKSTvyBFz6ueMGbYjSdasWWZnihMnbEcSPRJeOOHcObNoLYsJr89P1Ehe\n1vp3c3ItDWFoOxL4IFfdzcKpnxeqqjJ7ePs460jCCyfs3i1NnJi9Hl6JyhSildUKb12dtGyZqU4B\n5cpiO0OOr2MSCS+ckMX+3RwqvIhSViu8OT5WppC8LCe8vo5JJLxwQpYT3qYm0y927JjtSJB2hw9L\nJ09KDQ22I7Fj/nwSXkSDhNd2FNEj4YUTspzwsocoorJxo/lZylrfYc68edKWLbajQNqFYTa3JMvx\ndSE1CS+ckNUdGnIWLaIyhfJltX83hwovorBvn3TDDaYvPIumT5d6eszMo09IeGFdGJqqTFYrvJL5\nf/dxkQCSlfX+3XnzSHhRvi1bTMKXVUHg56wjCS+s6+oyF1hWn6YlpmIRjaxXeKdNMz3MR4/ajgRp\ntmVLtmccJT/7eEl4YV2ufzerfYeSublu3Wo7CqRZGGZ7oY1k7iE8PKJcW7eS8PrYx0vCC+uyvGAt\np6lJ6uw01SmgFJ2d5tfJk+3GYRsJL8pFhff8QS4+IeGFdVlfsCZJlZVSS4s5bQ4oRVZPhroUC9dQ\nLhJecy+prvbr5EISXlhHhdeYO5fKFEq3a5dZWZ51LFxDOXp6pIMHpRkzbEdiV12dtG6d+V74goQX\n1mV9h4Yc+nhRjtdek6ZMsR2FffPn8+CI0m3bJs2ebWbdsm7uXL/GpMgS3u9/P6pXQpa88YbZ66+x\n0XYk9lHhRTm2b5fmzLEdhX0tLVJHh3T6tO1IkEYsWDtvzhzzAOCLyBJeBmqUYssWc1FVMNdAhRdl\nyVWmsq662iwCpR8epaB/9zwS3gFwc0Ep6N89Lzd95NMiASTj9GnpwAFmSnJoa0CpSHjPmzPHryIM\nCS+sYoeG88aOlUaPlvbutR0J0mbHDlPVrKqyHYkbWLiGUm3ZYooPMN8HKrx5kPCiFCxYuxh9vCjF\ntm30716ICi9K0d9vchkSXmPWLKmtTTp3znYk0Ygs4X3jDen48aheDVlBS8PF6ONFKViwdjEqvChF\ne7t0xRXSqFG2I3HDiBHmIJvdu21HEo3IEt5Zs6jyoji9vWbvUBbanEeFNx2eeOIJzZs3T3PmzNGX\nv/zly/7++eef17hx47Rs2TItW7ZMX/ziF2ONhwVrF5s3z3xP+vttR4I0oX/3cj5tTRZZwjt7Ngkv\nitPaajb3HjbMdiTuoMLrvv7+ft1///168skntXHjRn3rW9/SljxPKTfffLPWrFmjNWvW6I//+I9j\njYmWhouNHi1NmGAqdkChSHgv59NODSS8sIYFa5ejwuu+VatWafbs2WpsbFR1dbXuvfdePfLII5d9\nXpjgdhvbt1PhvRRtDSgWC9YuR8Kbx5w5JLwoDv27l2tsNEc5njhhOxIMZO/evZo+ffpbv29oaNDe\nPFtrvPzyy1qyZIne/e53a9OmTbHFc/y4+Zg6Nba3SKX580l4URwqvJcj4c2DCi+KxQ4Nl6usNP3w\nvtxgsurqq69We3u71q5dq/vvv1/vec97Ynuv1lbzM8PhLRebN4/ZEhSHU9YuRw9vHrNnM0ijOFR4\n86OP123Tpk1T+wXNoR0dHZo2bdpFnzNq1CiNHDlSkvSud71LZ8+e1ZEjRwZ8zc9//vNvfaxcubKo\neOjfzY8KL4rR3S319EiXXMqZN2OGmXU8edJ2JOWLbJvySZOks2elI0fMYgFgMP39PE0PhD5et117\n7bVqbW3V7t27NWXKFD388MP61re+ddHndHZ2avLkyZJMz28YhpowyI3x85//fMnxkPDmx168KMbW\nrebeGwS2I3FLZaU0c6aZSbrqKtvRlCeyCm8Q0NaAwu3ZY04WGzvWdiTuocLrtsrKSj3wwAO67bbb\ndOWVV+ree+/V/Pnz9eCDD+of//EfJUnf/e53tXDhQi1dulSf/vSn9R//8R+xxcOCtfwmT5bq6qRD\nh2xHgjRgwdrAfDliONKDKHML15Yvj/JV4SN2aBjY3LnSX/2V7SgwmBUrVmjrJSPAfffd99Z/f+pT\nn9KnPvWpRGLZtk36xCcSeatUCQKzPdn27dLEibajgetYsDYwX44YjnSZAxVeFIoFawPL3VzYNB9D\nCUMOnRgMByKhULTYDcyXnRoiT3h9+KYgfl1d0rJltqNw05gxptWjo8N2JHDd4cPmVyqY+c2ebXoP\ngaFQ4R0YCW8eVHhRqFWrWA07GPp4UYjcgjUW2uRHhReFOHtWamtjpmQguR7eBM/SiUUsCW/avymI\nX2srN5fBsFMDCsGCtcHNmkWFF0PbudMUYIYPtx2Jm+rqTF6Xm1FKq0gT3iuuMFtYHDwY5avCN2fO\nSAcOmP39kB8VXhSCLckGRxEGhWCHhsEFgR9tDZGfzcMRwxjKzp0m2a2KdI8Qv1DhRSGo8A5uwgQz\nWKe9MoV4sWBtaCS8edDHi6HkjkLFwKjwohBUeAeX2x+etgYMhgVrQ/NhL95YEt60PwUgXtu3k/AO\nZcYMU5Xq6bEdCVwVhlR4C8HCNQyFhHdoPuzFS4UXiaPCO7SKCh4eMbh9+8zBCmPG2I7EbVR4MZTh\nw+nhHQotDXmQ8GIo7NBQGPp4MRjaGQpDhReDOXJEWr1amjTJdiRuy+14cu6c7UhKF0vC29rKqlgM\njApvYejdRugwAAAgAElEQVTjxWBoZygMFV4MZscOMx6xl/XgRo0yO3Ht2WM7ktJFnvCOHSvV1kr7\n90f9yvBBb6+0d6/U2Gg7EvdR4cVgqPAWJlfhpQiDfFpbpZYW21GkQ9r7eCNPeCV6DzGw3bvNBt81\nNbYjcR8VXgxm2zYqvIW44grz65EjduOAm3IVXgwt7X28sSW89EwhH3ZoKFzu5tLfbzsSuGj7diq8\nhQgC+ngxMFrsCpf2rclIeJEoFqwVbvRo873q6LAdCVzT12cOcGEqtjD08WIgJLyFo8KbB6etYSDc\nXIozbpyZcgMu1N4uTZ4sjRhhO5J0oMKLgTAmFY4e3jyo8GIg3FyKk9sKBrgQC9aKw3WEfN54w3xM\nmWI7knRoajIbEpw+bTuS0sSS8M6aZapS9B7iUiS8xWlpYaDG5ViwVhyKMMhnxw5zj2VLssJUVZmk\nN61jUiwJb22tNGFCuvdrQ/T6+sxUbHOz7UjSg8oU8mHBWnG4jpAPW5IVL819vLEkvBJP1Ljc7t1S\nfb00bJjtSNIjN1sCXIgKb3EmTjQzjmxNhguxJVnx0tzHG1vCy8I1XIodGoqXa2lg03xciApvcdia\nDPnQYle8NG9NRoUXieHmUryxY6WRI6XOTtuRwBVnzkj79pleOhSOrclwKcak4tHSkAcJLy7FzaU0\n9B/iQjt2SDNmSNXVtiNJFyq8uBRjUvFIePPgeGFciptLadipAReinaE0VHhxoVOnpEOHpIYG25Gk\nS329mWVKYz98bAlvS4tZpNTXF9c7IG04Vrg0VHhxIRaslYYKLy7U1mbagiorbUeSLkGQ3ipvbAnv\n8OHmJKDdu+N6B6TJuXPSrl3SzJm2I0kfdmrAhajwloYKLy7ElmSlI+HNg50akLNnjzRpEkehloIK\nLy7EKWulmTjRzDimcSoW0aPFrnQkvHmwcA053FxKl5uKZWsySLQ0lCoIqPLiPPbgLV1a9+Il4UUi\nSHhLN2GC+ZXKFHp6pO5uFtqUij5e5DAmlS6te/HGnvCm8SkA0ePmUrrcpvlUprB9u+k7rIj1zu0v\nriPkMCaVLlfM7O+3HUlxqPAiEezQUB4WrkFiwVq5GJMgSb295vCWxkbbkaTTmDHmUKS9e21HUpxY\nE97mZvMN6e2N812QBhwrXB4qU5Do3y0X1xEks2PQtGkc3lKOuXPT19YQa8JbU2N6zXbujPNd4Lr+\nfrPnIVuSlY6BGhI7NJSLRWuQaGeIQhp3aoi9E4wpJOzdaxZe1dbajiS9OG0NEi0N5aqrMzOOR4/a\njgQ2kfCWj4Q3DxaugZtL+ajwQqKloVxsTQaJLcmiQMKbBxVesGCtfPX10okT0vHjtiOBLYcPm4MT\nJk2yHUm6sTUZKMKUjx7ePDhtDdxcypfbmoydGrJr+3ZTQAgC25GkGxVeMCaVr7lZ6uiQzpyxHUnh\nqPAiduzQEA3aGrKNBWvRoMKbbX190u7dJmFD6WpqpBUrzIL0tIg94Z0xQ+rslE6fjvud4CqepqNB\nwpttLFiLBhXebNuzx7QFDR9uO5L06+1N16xj7AlvVZXU1JSubwqiE4bm376lxXYk6cdODdnGgrVo\nUOHNNgow0UnbmJTIAZXs1JBd+/dLo0ebD5SHCm+2UeGNxqRJbE2WZSS80UnbupLEEl6eqLOJHRqi\nQ8KbXWFIhTcquQWgXEvZRMIbnZYWEt7LsFNDdnFziU5Dg3TkiHTypO1IkLT9+6WRI6Vx42xH4gf6\neLOLPXijQ8KbBxXe7GKHhuhUVJiVxWlaFYto5LYkQzTo480uijDRaW42O16cO2c7ksKQ8CJW3Fyi\nlbZFAogGW5JFi5aGbOrvNwUDFlFHY8QIaeJEs/NFGiSS8DY0mAUCPT1JvBtcQsIbLQbqbGLBWrRo\nacimffuksWOl2lrbkfgjTQvXEkl4KyqkmTO5wWRNGJp/c56mo0PCm00sWIsWLQ3ZRAEmemnq400k\n4ZVYuJZFnZ1mc28W2kSHhDebaGmI1uTJ5jCk7m7bkSBJJLzRI+HNgz7e7GHBWvTSNH2EaJw7Z/oO\nGaijw9Zk2UTCG700rSsh4UVsuLlEr7HRbFF15oztSJCU9naprs5sS4bo0MebPWxJFr00FWESTXg5\nbS1bSHijV1VlFoHu2mU7EiSFBWvxoI83exiTopdraQhD25EMjQovYsPNJR5MxWYLC9biQYU3W1hE\nHY9x46SaGungQduRDC2xhHfKFHNC1LFjSb0jbONY4XiQ8GYLFd54UOHNlq4uadgwFlHHIS19vIkl\nvEFAlTdLck/TJLzRS1PPFMpHhTceVHizhfEoPmkZkxJLeCUS3iw5dMj0m06YYDsS/1DhzRa2JIvH\n5MnSqVPMOmYFCW980rI1GQkvYsHNJT5pmT5C+Xp7pY4Oc2Y9osXWZNnCmBQfEt482KkhO7i5xKe5\nWdq9W+rrsx0J4rZzp7RkiVkUgujRx5sdjEnxIeHNg9PWsoObS3yGD5fq683+rPBbW5s0dqztKPxF\nhTc72IM3Pmm5jmhpQCzYoSFeabnBoDxtbdLMmbaj8BcL17KDIkx86uulEyekN96wHcngEk14J06U\n+vulw4eTfFfYwM0lXmlZFYvy7NjBvqFxoqUhG44cMUd0X3GF7Uj8FATmwdz1MSnRhJetybKjtZWt\nlOLEwrVsoMIbLyq82ZArwASB7Uj8lYY+3kQTXomFa1lw5Iip5PM0HR9aGrKBhDdeuanY48dtR4I4\nMeMYvzSMSVYSXiq8fuNpOn5puLmgPGFIwhs3tibLBhLe+FHhzYOdGvzHzSV+LS0mGervtx0J4tLV\nZXbkYJeGeNHH6z/GpPiR8OZBhdd/7NAQv9paafx4ae9e25EgLixYSwZ9vP5jS7L4kfDmkUt4wzDp\nd0ZSWLCWDHZq8BvtDMmgwuu/1lYeHuPW2CgdOCCdOWM7koElnvCOH29ODerqSvqdkRSmj5LBTg1+\no8KbDCq8fjt+XOrpkaZMsR2J36qqpIYGadcu25EMLPGEV2KnBt+R8CaDxTZ+o8KbDCq8fss9OLKI\nOn6utzVYSXgXLWKg9lV3t3T6tDRpku1I/EfC6zcS3mRMmcLWZD6jAJMcEt48pk6Vdu608c6IG1uS\nJYeE12+0NCQjCGgP8hkJb3JIePNw/ZuC0nFzSU5ukGYBqH9OnjQHuEydajuSbODh0V+MSclx/Tqy\nkvDOnGmm6+AfdmhIzrhxZp9WFoD6Z+dOqalJqqy0HUk2sHDNX2xJlhzXi5kkvIgUT9PJcv2JGqWh\nfzdZLFzzF1uSJWfmTLNLg6sHIllJeOvrzTYhb7xh490RJxLeZJHw+on+3WRR4fXTyZPSoUNmuyzE\nb+RItw9EspLwBoHU3MzCNR+R8CaLhNdPVHiTRYXXT21tJtegNSg5Lh+IZCXhlWhr8NHx46Zqzwbf\nySHh9VNbGxXeJE2dKo0YwayjbyjAJM/lHU+sJbyuNzejeGzwnTyXn6ZRuh07qPAmKQikUaMowviG\nhDd5Lud2VHgRGXZoSJ7LT9MoTX+/WfjR3Gw7kmxpaWFM8g0Jb/JIePMg4fUPN5fkTZwonTtn9myF\nH/btM1vO1dbajiRbZs50d6BGaRiTkufyrCMtDYgMN5fkBQF9vL5hwZodFGH8w24nyXP5QCRrCW9T\nk9TebqpT8AMJrx0kvH5hkLaDhNcvZ86Y2ZLGRtuRZMuECVJFhXT4sO1ILmct4R0+3EzHurpfG4q3\nfTsJrw0kvH6hwmsHs45+2bVLmj5dqq62HUn2uHotWUt4JXe/KSjeiRNSd7c0bZrtSLKH68gvVHjt\naGxk1tEnzDja42ofr9WElykkf+S2Uaqw+hOVTVR4/UKF147hw6VJk6SODtuRIAokvPa4WoSxnvC6\n+E1B8bi52NPSIh09ajsKRIVDJ+xxdaBG8RiT7HF1u0zrLQ1UeP2wd690zTW2o8imKVPMMd09PbYj\nQbneeMO0B02ebDuSbGLW0R8kvPbMmmXGJNdYr/Byc/HDxo1mdSaSV1FhDilw8QaD4rS1mX9LTiu0\ngzHJH/TC2+Pq7L31Cq+L3xQUj5uLXQzUfuA6sosxyQ99fdLu3ZxWaMvUqeYwpFOnbEdyMasJ78SJ\nUm+vWd2PdGOhjV20B/mB68guHhz90N4u1debhYhIXkWF2fXEtVlHqwlvEJgbjGvfFBSnr8+sbGaD\nb3tcnUJCcajw2kXC6wf6d+1z8VqyvokUU0jp195uFk7V1NiOJLtcvLmgeFR47Zo4UTp7llnHtNu3\nT7rhBttRZJuLY5L1hNfFbwqKwyBtHy0NfmBLMrtys45cS+m2YYM0apTtKLLNxTGJhBdlYxrWvqYm\nc5Qmp0SlV1+ftGeP+beEPYxJ6UcRxj4X2+ysJ7y0NKQfNxf7Ro4028Lt22c7EpSqo8Oc9DVsmO1I\nss3FgRrFYabEPhcfHK0nvC5+U1AcEl43cC2lW+54btjl4lQsCheGXEsuyO0NH4a2IznPesLb2Ggq\nG319tiNBqWhpcAOzJenGg6MbeHBMt0OHpOpqadw425Fk26hR0ujR0oEDtiM5z3rCW1NjVvi3t9uO\nBKXgadodDNTpxoOjG7iO0o0HR3e4VoSxnvBK3GDS7MgRs8k0xwrbx3WUbgzUbsjNOp49azsSlIL+\nXXe4NiY5k/C69BSAwjFIu4Pew3RjoHZDbtZxzx7bkaAUzDi6g4Q3Dwbq9CLhdQcPjunGQO0O1wZq\nFI4xyR2uXUdOJLyufVNQOPoO3TF5snTihHT8uO1IUKyjR6X+fumKK2xHAsm93kMUjoTXHa5dR84k\nvC59U1A4bi7uyJ0StXOn7UhQrFx1NwhsRwKJIkyaMSa5w7XryImEN/cU4NJ+bSgMFV63uPZEjcLQ\nv+sW1wZqFObMGamzU5o+3XYkkEwvfHe3dPKk7UgMJxLe8eNNZePoUduRoFg8TbuFgTqd6N91Cw+O\n6bRrl0l2q6psRwLJ7ODU1OTOrKMTCW9uKpYbTLr09vI07RoS3nTiwdEtufGIWcd04Tpyj0u5nRMJ\nr8RODWm0a5fU0MDTtEu4jtKJlga3MOuYTiS87nFpTHIm4aUylT7cXNzj0tM0CkdLg1uYdUwnHhzd\n41Ju51TCy80lXRik3dPUZI7pPnfOdiQoxv790owZtqPAhVyqTKEwjEnuIeHNg5tL+vA07Z7hw6W6\nOnM0KtJj2jSputp2FLiQSwM1CsOso3tcuo6cSXhd+qagMNxc3MQK8/ThwdE9zDqmSxgyJrmoudns\n0tDfbzsShxLe6dPNtF5vr+1IUCj24HUTD4/pwyDtHmYd0+XgQTPDNXas7Uhwodpaadw4k9/Z5kzC\nW11tVvzv3m07EhQi9zTd3Gw7ElyKhDd9eHB0D9dRutC/6y5XriVnEl6JKaQ06eriadpVVKbSh4Ha\nPcw6pgvtDO4i4c2DgTo9WLDmLh4c04eB2j3MOqYLCa+7XBmTnEp4XXkKwNC4ubiL6yg9cid58fDo\nJq6l9GBMcpcrxUznEl4XngIwNBasuauuTjpzRuruth0JhnLwoPmV1iA3MSalB7OO7nLlwdGphNeV\npwAMjadpdwUB11Ja8G/kNq6j9GDRmrtIePPIfVNy03xwFzcXt7lyg/HVE088oXnz5mnOnDn68pe/\nnPdzfud3fkezZ8/WkiVLtHbt2ryfQ/XQbVxH6XD6tJktaWiwHQnyqa+Xjh2TenrsxhFZwrty5cqy\nX2PsWKmm5vw0H9yVpumjKH4204aBOj79/f26//779eSTT2rjxo361re+pS1btlz0OY8//rh27Nih\n7du368EHH9THP/7xvK/Fv5Hbsn4dpeXeuWuXOZq7stJ2JMinouL8ARRRCYLglqLjiOrNo7owmEJy\n36lT0uHD0tSptiMpTFpu2lHiOorPqlWrNHv2bDU2Nqq6ulr33nuvHnnkkYs+55FHHtEHP/hBSdLy\n5ct17NgxdXZ2XvZa/Bu5LdfDm9VZx7TcO9NUgMmqGMakW4r9AqdaGiSeqNNg506psZGnaZex2CY+\ne/fu1fTp09/6fUNDg/bu3Tvo50ybNu2yz5H4N3LduHFm1vHQIduRYDC02LnPhdzOyYSXQcBtPE27\nz4WbC4bGv5H7uJbcxyJq97lwHQVhRHM1QRBkdNIHAAAASQrDMCjm8yOr8IZhGMnHs8+GuvnmaF6L\nj3g+fud3Qv2f/2M/Dj4G/5gxI9SOHfbj8O2jr69PLS0t2rVrl86cOaPFixdr06ZNF33Oo48+qttv\nv11hGOrll1/W8uXLL3udTZtCzZkTRnr/5CP6jz/8w1B/+qf24+Bj4I+FC0O99pr9OPgY+GPDhlBz\n50b6mkUlu5JUFVXCGxVaGtzX1ia94x22o8BQclNITPVFq7KyUg888IBuu+029ff36zd/8zc1f/58\nPfjggwqCQB/72Md0++2367HHHtOsWbNUW1urb3zjG5e9Tq7vcNs2C/8TKNjMmdJPf2o7CgwkDLnP\npUFzs9lNo7/f7Npgg3MJb0ODWSBw+rQ0fLjtaJAPCwTSwYWeKV+tWLFCW7duvejP7rvvvot+/8AD\nDwz6GvTCp8PMmdJDD9mOAgPp7JRGjpTGjLEdCQYzcqQ0YYK0b5+9/ZLLyrODIPjVIAg2BEFwbs2a\nNRf93Ze+9CXNnj1b8+fP11NPPVXwa1ZWmv30otyvDdHp7zf/NmlLeL/whS+ooaFBy5Yt07Jly/TE\nE0/YDil2LS3Mlrjs2Wef0Le/PU+SBjy8AvZldYu/pqYmLV68WEuXLtV1111nO5wBUd1Nj1Jn8H/z\nN39TkydP1lVXXfXWnwVBMD4IgqeCINgaBMGTQRAMeUB7uYXl1yXdI+n5C/9w8+bN+va3v63Nmzfr\n8ccf1yc/+UmFYeFr2qhMuWv/fnNASG2t7UiK95nPfEZr1qzRmjVrtGLFCtvhxI7ryF39/f16+un7\n9Wd/9qQk5T28Am5oaDCHIZ0+bTuSZFVUVGjlypV67bXXtGrVKtvhDIiENz1KHZM+/OEP68knn7z0\njz8r6ZkwDOdKelbSHw71OmUlvGEYbg3DcLuki5qHH3nkEd17772qqqpSU1OTZs+eXdQFk9Un6jRI\n8zRsMQ9dPiDhddeqVasUBLP1trc1SlLewyvghspKafp003+YJWEYqr+/33YYQ0rzmJQ1peZ2N910\nk8aPH3/pH98t6V/f/O9/lfSeoV4nltbhQjddHwgL19yV5qfpBx54QEuWLNFHP/pRHTt2zHY4sePB\n0V179uzV6dPT1dxsfp/v8Aq4I4vXUhAEuvXWW3Xttdfqa1/7mu1wBsSakvSIuAgzKQzDTkkKw/CA\npElDfcGQCW8QBE8HQbD+go/X3/z1zggCzovKlLtcvrnceuutuuqqq976WLRoka666ir98Ic/1Cc/\n+Um1tbVp7dq1qq+v12c+8xnb4cZuwgTTc33kiO1IcKnubnOC16hRtiNBIbI4Jr300ktas2aNHnvs\nMX31q1/VT37yE9sh5ZXmIkzWxFzMHHIKd8hdGsIwvLXYd502bZr27Nnz1u87Ojo0bdq0gr8+i0/T\nadHWJt12m+0o8nv66acL+rzf+q3f0p13xva85owgOD9QT5hgOxpc6Ny5aaqpaX/r98XeI5GsLM46\nTpkyRZJUV1ene+65R6tWrdJNN91kOarLkfCmR8QPjp1BEEwOw7AzCIJ6SV1DfUGkB0/k3HXXXXr4\n4YfV29urnTt3qrW1tahVns3N5puSsZbLVHC5wjuYAwcOvPXf3/ve97Rw4UKL0SQni5WpNBg27Fqd\nO9eq3bt3S5Iefvhh3XXXXZajwkCydh2dPHlSPT09kqQTJ07oqaeecvKeeeqUdPiwxLNiOtTXSz09\n0htvFP+1uQMnLvADSb/x5n9/SNKQiyDK2oc3CIL3SPo7SRPvuOMOLVmyRI8//rgWLFigX/u1X9OC\nBQtUXV2tv//7v1cQFH4oxujRZqrvwAHpzYdMOCKtCwR+//d/X2vXrlVFRYWampr04IMP2g4pEWxN\n5qZduyp1113m8ArJLFqbP3++5agwkKzNOnZ2duqee+5REATq6+vT+9///rd+Vl2yc6fU2GgWFsJ9\nuVnHnTulC3YYG9L73vc+rVy5UocPH9aMGTP0hS98QZL+XNJ3giD4iKTdkn5tyPePcOV6pPXY66+X\n/vIvpRtvjPJVUY6eHmnSJOnECfODC/f93/8rvfqq5PCak0z69V83rUEf/KBZHJS1HUTS5vhxU3zp\n6eHe55If/Uj66lelxx+3HQkKdddd0oc/LN1zT9kvVfSVaOmAt6FlsWfKdW1tpt2EG356ZG0qNi3o\nO0yXMWPMSVGdnbYjwYW4jtLH5pjkdMLLQO2WtLYzZFnWpmLTYscOrqW04VpyDwlv+pDw5sHNxT1p\nXbCWZTNmmLPLe3ttR4Kc3KKN+nrbkaAYzDq6hyJM+pDw5sHNxT08TadPdbU0darU3j705yIZtAal\nE7OO7qEIkz42i5nOJrxUeN3D03Q6MVC7hesonRiT3BKGZrV/7rRCpENTkzR5snTuXPLv7WzCO2WK\nOY3oxAnbkSCHp+l0YmsytzBTkk48OLrlwAGzfeno0bYjQTFGjDDjUUdH8u/tbMJbUWGeBHbutB0J\nJPM01t7O03QaMVC7hQVr6USbnVuYKUkvW0UYZxNeiSkkl3R0SBMnSsOH244ExSLhdQsV3nSaOlU6\nckQ6edJ2JJCYcUwzEt48eKJ2B4N0evHg6BYqvOlUWWlmHXftsh0JJMakNCsn4V29erUWL16sIAhq\ngiCoDYJgQxAECwr5WucTXgZqNzB9lF65B0cO87Iv1xrU1GQ7EpSCIow7SHjTq5yE95prrtHdd98t\nSX8m6cuSHgrDcFMhX+t0wktlyh1MH6XX+PGmOnX4sO1I0NEh1dXRGpRWFGHcQcKbXuW2NPyv//W/\nJOlWSVdL+kqhX+d0wsvTtDuo8KYbD49uYJBON64jdzAmpVcu4S111vHQoUOSNErSaEkFlw+cTnib\nm02/VH+/7UhAhTfdeHh0AwlvunEdueHkSbOAcOpU25GgFBMmmIN3Sp11/PjHPy5Jfyzp3+VLhXfk\nSPON2bfPdiRgoE43pmLd0NEhLVpkOwqUiuvIDTt3mj74CqczGAwkCEpva3jooYdUU1OjMAwflunh\nvSYIglsK+Vrnf1x4oravu1vq7TW9h0gnBmo3bNxIVSrNZs40yRazjnZRgEm/UhPeD3zgA/rOd74j\nSQrDsD8Mw+vDMFxZyNemIuFloLYrd3MJAtuRoFSctuaG1lZp1izbUaBUtbXS2LHS/v22I8k2+nfT\nz8aY5HzCyyIB+7i5pB8PjvaFoUl4uZbSjWvJPtaUpB8Jbx60NNjHzSX9pk+XOjulM2dsR5JdBw9K\nNTVmmzikF0UY+2hpSD8S3jx4mraPm0v6VVWZpHf3btuRZBftDH6gCGMfY1L6kfDmQe+hfbQ0+IGB\n2i4SXj9QhLGrv99sV0rCm27Tppmt5U6eTO49nU94J0+WTpyQjh+3HUl20dLgBwZqu0h4/cB1ZNf+\n/SYvqK21HQnKUVlptpbbuTO593Q+4Q2C81vBIHlnz0p790qNjbYjQbkYqO0i4fUDs452tbaa6iDS\nL+lryfmEV+IGY1N7uzRlillsg3TjOrKLhNcP9fVmxrGnx3Yk2cROJ/4g4c2DypQ9LA7wB9eRXSS8\nfqioMMfeM+tox44dXEe+IOHNg4HaHhas+SN3HYWh7Uiy58gRs9jmiitsR4IoMFtiDxVef5Dw5sHN\nxR4WrPlj7Fhp+HCzHyySlavuclqhHyjC2EOF1x8kvHlwc7GHlga/sDWZHbQz+IUxyY7caYVcS35o\nbjbrhM6dS+b9UpHwNjUl+03BeTt2MH3kEwZqOxik/cJpa3YcPmx6qCdMsB0JojB8uFRXJ+3Zk8z7\npSLhHT7c3GDa221Hki1hSIXXNyS8dpDw+qW5mb3hbeA68k+SbQ2pSHgladIkpmKTduQIT9O+oR/e\nDgZqv8ycKa1eLfX12Y4kW1iw5p8k2+xSk/DOnm1+2JEcFqz5hwqvHSS8fhkxItmpWBgsWPMPFd48\nZs2Stm+3HUW20M7gn5kzOZIzaceOmfPiJ0+2HQmiRBEmeTw4+oeENw9uLsljwZp/Ghqk554zCRiS\nkatKsSWZX2bNYkxKGmOSf0h486DCmzwqvP6prDQLbujjTQ5VKT8xJiWPa8k/uYQ3iQORUpPwtrSY\noxzZmiw5JLx+YrYkWQzSfuI6Stbx49KJE1J9ve1IEKUJE0wh5tCh+N8rNQlvba35xnR02I4kO5g+\n8hNTscki4fUT11GycuMRrUH+SaqtITUJr8QTdZLOnJE6O6Xp021HgqgxFZsstlLy08yZzDomievI\nXyS8eTBQJ2fXLpPsVlXZjgRR48ExWVR4/cSsY7LYksxfJLx5MFAnh/5dfzEVm5wTJ6SjR6Vp02xH\ngjgwJiWHB0d/kfDmQYU3OSS8/po+Xerqkk6dsh2J/3KHt1Sk6k6LQvHwmBzWlPiLhDcPnqaTw83F\nX1VVUlMTJ64lgaqU30h4k8O15C8S3jxaWswg3d9vOxL/UeH1GwN1Mhik/TZ7NrOOSTh1Sjp4kEXU\nvpo2TeruNi1gcUpVwssigeRQ4fUb7UHJIOH1Gw+Oydi5U2psNPu1wj8VFcnMOqYq4ZUYqJMQhuYH\nr7nZdiSIC+1BySDh9RuzjsngOvJfEm0NqUx4Gajj1dUljRghjR1rOxLEhesoGQzUfhs1ytwn9+61\nHYnfmHH0HwlvHvRMxY+bi/+YKYnfqVPm4ZG+Q78xWxI/Hhz9R8KbB5Wp+LFgzX+NjdKBA9Lp07Yj\n8Veu75DDW/zGmBQ/ijD+I+HNgwpv/A4dkpYtsx0F4lRVZZKxnTttR+IvTobKBhLe+FHh9R8Jbx4s\nEojf6tXS5Mm2o0DcaGuIF4N0NnAdxevsWWnPHrOKH/5qbjb/zn198b1H6hLeUaOk8ePZmixO27aZ\nSn8kqXMAACAASURBVDr8Ru9hvEh4s4HrKF7t7dKUKdKwYbYjQZyGDTOFtj174nuP1CW8ElNIcQpD\nk/DOmWM7EsSN6yheJLzZkJuKDUPbkfiJ6yg74m5rSGXCSx9vfA4eNJt7X3GF7UgQN6Zi48VAnQ1j\nxpiZx/37bUfiJxasZQcJbx5UpuJDdTc7mIqNT2+v2Zu1sdF2JEgCRZj48OCYHSS8eXBzic/27SS8\nWdHYKO3bJ505YzsS/+zebc6Hr6mxHQmSQBEmPlR4s4OENw9uLvFhwVp2VFebQxF27bIdiX+oSmUL\nY1J8uJayg4Q3j1mzzDeFrcmiR0tDtjBbEg8G6Wwh4Y1Hf7/ZK5wKbzbEvQA0lQnvqFHSuHGcXx4H\nEt5sYaCOBwlvtvDgGI99+6SxY6XaWtuRIAnjxpk2sIMH43n9VCa8EjeYOPT3czpU1pDwxoOEN1ta\nWsy/OVuTRYvrKHtmzoyvrSG1CS8DdfQ6OqQJE0wFHdnAg2M8GKizZdw4acQIqbPTdiR+YcFa9sTZ\nx5vahJeBOnosWMseHhyj19dndmlobrYdCZLEtRQ9Hhyzh4Q3D24u0aN/N3uamkxlv7fXdiT+2LPH\nHJE5fLjtSJAkijDRo8Uue0h48+DmEj0S3uypqZEaGtiaLEpUpbKJIkz0WltpacgaEt48Wlqktja2\nJosSCW82MVBHi4Q3m7iOohWGVHiziIQ3j9GjzXYlbE0WHU5ZyyYG6mhRlcomjuqO1qFDUmWlNH68\n7UiQpKlTpWPHpJ6e6F87tQmvxEAdpd5e03vIQpvsoT0oWlR4s2nWLHMdsTVZNLiOsqmiwuQhbW0x\nvHb0L5kcBuro7NxpejlramxHgqTx4BgtBupsGj/eHNcd16b5WcOWZNkVV1tDqhNeBuro0L+bXVxH\n0envN5UJBups4lqKDg+O2UXCmwc9U9Eh4c2u5mapvV06e9Z2JOm3d6+p9HEUajYx6xgdFqxlFwlv\nHrmeKZSPBWvZNWyYWSiwe7ftSNKPqlS2UeGNDos/s4uEN49Zs8w3ha3Jyscpa9nGQB0NEt5s4zqK\nDhXe7CLhzWP0aGnMGGnfPtuRpB8tDdnGVGw0SHizjTa7aBw7Jp08aU4sRPY0NZl//6hPAE11witx\ng4nCiRPSkSPS9Om2I4EtVKaiQcKbbWxNFo3cDg1BYDsS2DBsmDRypNk9KkqpT3jp4y1frleqIvU/\nDSgVCW80SHizbcIEk6QdPmw7knSjnQFz55qZ5yilPsWhwls+2hlAS0P5wpCFNlkXBDw8RoHrCHPm\nkPBehgpv+ViwhuZms0tDX5/tSNLrwAGzHdnYsbYjgU0UYcpHhRckvHlwcykfFV4MHy7V15v9eFEa\n2hkgUYSJAhVezJkjbd0a7WumPuFla7LykfBC4uGxXCS8kGhpiAIVXlDhzWP0aPOxf7/tSNKLQycg\nUZkqFwkvJBLecp06JR08KDU02I4ENjU0SN3d0htvRPeaqU94JQbqchw+bPo26+psRwLbGKjLQ8IL\niZmScrW1mX1YKyttRwKbKiqiz+28SHi5wZRu+3bz/WO/Q3AdlYeEF5I0caIpIhw5YjuSdKKdATlR\ntzV4kfBS4S0d/bvI4ToqXW5LMgZqsDVZeViwhpyo9+L1IuGlMlU6El7kzJwp7dolnTtnO5L0OXTI\nTMFOmGA7EriAMal0VHiRQ4U3DypTpWPBGnJGjJAmTZL27LEdSfowSONCVHhLR4UXOSS8eeS2JuP8\n8uJR4cWFeHgsDe0MuBDXUel4eERObi/eqHI7LxLeMWOkUaOkfftsR5IuYXh+0RogUZkqFQkvLsR1\nVJqzZ6WODrNLA3DFFVJVldTVFc3reZHwSvRMlWLfPvOgMGaM7UjgCq6j0pDw4kJcR6XZvVuaMkWq\nqbEdCVwRZVuDNwkvU0jFo50Bl+I6Kg0JLy40aZJ0+rTZOB+Fo50BlyLhzYMn6uKxYA2XYiq2NCS8\nuBBbk5Vm1y5a7HAxEt48qEwVjwovLtXSIu3cydZkxTh6VOrt5bRCXIyEt3ibNpntEYGcKPfi9Sbh\npcJbvG3beJrGxUaONAsFOjpsR5IeuWlYTivEhRiTird1qzRvnu0o4BIqvHnknqbZmqxwVHiRD5Wp\n4rBvKPJh1rF4W7eaih6QM2uW1NYWzayjNwlvbmuy/fttR5IOfX2mX4qBGpeiMlUc+neRDw+OxTl1\nSjpwQGputh0JXDJypGkXa28v/7W8SXglnqiLkdv+Zfhw25HANVxHxSHhRT48OBZn+3aT7FZV2Y4E\nrskdQFEurxJebjCFo38XA6EyVRwSXuRTXy+dOCEdP247knSgnQEDiaqP16uEl8pU4ejfxUB4cCwO\nCS/yCQLTMsa1VBgSXgyEhDcPBurCkfBiIC0tZueB/n7bkbjvjTdMBW/KFNuRwEXMlhSOhBcDIeHN\ngwpv4Uh4MZDaWmn8eGnvXtuRuG/HDvOAUOHVnRRRoQhTOBJeDCSqvXi9uk2zNVnhOGUNg2GgLgzt\nDBgMFd7ChCEJLwbW2Gh28Dh1qrzX8SrhHTvWVKfYmmxwue1fZsywHQlcxWxJYUh4MRiuo8J0dko1\nNebQG+BSVVVmB48dO8p7Ha8SXonKVCF27GD7FwyOylRhSHgxGMajwmzZQnUXg4uij9e7hJcn6qHR\nv4uhMFAXhoQXg5kyRTp2TOrpsR2J22hnwFBIePNgoB4aCS+GQoW3MCS8GExFxfldTzAwEl4MJYrD\nJ7xLeKnwDo0FaxgKW5MN7eRJ6dAhqaHBdiRwGWPS0Eh4MRQqvHlQ4R0ap6xhKKNHS2PGsAB0MG1t\nphe+stJ2JHAZY9LQSHgxFBLePNiabGi0NKAQtDUMjnYGFILraHBnzkgdHdLMmbYjgcvq683PypEj\npb+Gdwnv2LHSyJFm2y1crrvbnO/OyVAYCgP14Eh4UQhaGga3Y4fZZ7WmxnYkcFkQmEJdOdeSdwmv\nxA1mMLn+3SCwHQlcN3eu2S4I+e3eLS1caDsKuG72bFNkQH5sSYZCldvW4GXCS8/UwFiwhkLNm0fC\ne6mjR4/qtttu09y5c/XNb/6S6uqO5f28pqYmLV68WEuXLtV1112XcJRwSUOD6VHt7rYdiZvo30Wh\nSHjzoMI7MBasoVDz5kmbN9uOwi1//ud/rne+853aunWrenvfoaee+lLez6uoqNDKlSv12muvadWq\nVQlHCZcEAdfSYEh4USgS3jyo8A6MBWsoVEuLWUxy+rTtSNzxyCOP6EMf+pAOHpQqKz+kZ575r7yf\nF4ah+tnTDW+aP5+EdyAkvChUuXvxepnwUuEdGAkvClVdbbbd4lo6r6urS5MnT9bmzdKVV9arq6sr\n7+cFQaBbb71V1157rb72ta8lHCVcQ8KbXxiS8KJwuUVrpdYSqqINxw0Xbk3G4qzzwpCWBhQnN1Av\nWmQ7kuTceuut6uzsfOv3YRgqCAJ98YtffOvPNm8235tt2/LfYF566SVNmTJFBw8e1K233qr58+fr\npptuij12uGn+fOmf/sl2FO45dMiMS3V1tiNBGowZYz727SvtwB8vE95x46SlS82m+VOn2o7GHV1d\n0rBh0oQJtiNBWmRx4drTTz894N9NnjxZnZ2d2rJlshoaDmjSpEl5P2/Km/v+1dXV6Z577tGqVasG\nTXg///nPv/Xft9xyi2655ZaSYoebqPDmt3WrucdQmEKhcn28JLwXCAIzUJPwnkd1F8WaP1967DHb\nUbjjrrvu0r/8y79o8+Y/UH39v+ruu+++7HNOnjyp/v5+jRo1SidOnNBTTz2lz33uc4O+7oUJL/zT\n0mKqUqdOSSNG2I7GHWxJhmLlEt53vKP4r/Wyh1eSFizgifpS9O+iWFms8A7mD/7gD/T000/rxz+e\nq9bWH+uzn/2sJGn//v264447JEmdnZ266aabtHTpUr3tbW/TnXfeqdtuu81m2LCsqsqcJFbu0ai+\noX8XxSpnpwZvK7zz50ubNtmOwi0kvCjWvHnm56a/X6rw9vG4cBMmTNB//dczmjRJev55qbLS/PmU\nKVP0ox/9SJLU3NystWvXWowSLsq1NSxebDsSd2zdKv3Gb9iOAmkyZ46595bC2yFswQIS3kuR8KJY\no0dL48dL7e22I3HH1q2mNSiX7AKFoI/3clR4UaxyKrxeJ7zcXC7GKWsoBQP1xXI7NADF4Dq62Nmz\n5njuWbNsR4I0mTnT/NyUwtuEd+pUs0Dg8GHbkbjh3Dlpxw5uLigefbwXI+FFKUh4L9bWJk2bZnYO\nAgo1bFhpOzRIHie8QcAN5kJ79kgTJ0ojR9qOBGnDdXQxEl6UYu5csz98X5/tSNyQ25IMKFapbTDe\nJrwSbQ0Xon8XpaLCezESXpRi5Eipvl7audN2JG5gSzKUqtRcxuuEl50aziPhRamo8J539qxJWNjP\nGqXgWjqPBWsoFQlvHuzUcB4L1lCq+nqpt9ccA5p1ra2mf2z4cNuRII1IeM8j4UWpSHjzoKXhPE5Z\nQ6ly/fC0NdDOgPKQ8J5HwotSXXNNaV/ndcLb2Gh2aTh+3HYk9tHSgHLQx2uQ8KIcJLzGkSPSmTNm\n9ggo1rhxpX2d1wlvRYV5gsz6QH3mjLR3r9TcbDsSpBUDtUHCi3LkZkrC0HYkduWqu0FgOxJkidcJ\nr0Rbg2T2O5wxQ6quth0J0ooKr0HCi3JMmGD6v/ftsx2JXWxJBhu8T3jZqYEFaygfFV6pv98M1CS8\nKAfXEv27sMP7hJedGliwhvLNnGmqUqdO2Y7Eno4OacwYaexY25EgzUh4zdZ+JLxIWiYS3qzfXFiw\nhnJVVUktLeZnKatoZ0AUSHil116jpQHJ8z7hbWkxC7ayXJki4UUUst7HS8KLKGQ94T19Wmpvp8KL\n5Hmf8OYqU1u32o7EHhJeRCHrAzUJL6KQ9etoyxYzJtfU2I4EWeN9witlu62hu9sku9Om2Y4EaUeF\nl4QX5Zs2TTp5Ujp61HYkdmzYIC1aZDsKZFFmEt6sLlzbuNHcXCsy8S+NOGW9MkXCiygEgXl4zOq1\ntGGDtHCh7SiQRZlIg7K8Ndnrr/M0jWjMnWu2uDt3znYkyTt0SDp7lpOhEI0sPzyS8MKWTCS8WW5p\nYPoIURk1Spo4Udq923YkyctVdzkZClEg4bUdBbIoEwnvnDlm37/eXtuRJI8KL6J0663Z3JqMdgZE\nKasJ7/HjZraEY+5hQyYS3mHDpOnTpdZW25EkKwxJeBGtsWOltWttR5G8zZvZNxTRyWrCu2mT+X9n\nTQlsyMyPXRbbGvbtM9uyTZpkOxL4YtEi8xCVNVR4EaWZM6X9+7O3P/zrr9POAHsylfBmbeEa1V1E\njYQXKF9W94enfxc2ZSbhzeJODSS8iNqCBWanhrNnbUeSnJ4eqauLvkNEK4ttDSS8sCkzCW8WWxrY\noQFRGznS9MNnaeHa1q3S7NlSZaXtSOATEl4gWZlJeOfNM4N0lvYQpcKLOGStrWHHDrM7BRClrCW8\nXV1mp6SpU21HgqzKTMJbW2sWb+3caTuSZPT1mWNgFyywHQl8k7WE99VXpSuusB0FfLNwodTfbzuK\n5GzcaP6f2csatmQm4ZWy1dbQ2ipNmWIOCwCilLWEd9066aqrbEcB38ydKz3+uHT6tO1IkkGLHWzL\nXMKblYVrtDMgLllLeNevJ+FF9GpqTG/4xo22I0kG/buwLVMJb5Z6pkh4EZeWFtOP98YbtiOJ38GD\nZq/U6dNtRwIfLVmSnYNcSHhhW6YS3quuMgNYFjB9hLhUVpqHxw0bbEcSv1x1l75DxGHxYtMy47sw\nNPeLK6+0HQmyLFMJ74IF0nPPZWMPUSq8iFNW2hpoZ0CcslLh7egwC8dZ/AmbMpXw1tZKM2aY3Qt8\nduKEtHevNGuW7UjgqywlvIsX244Cvlq82PyMhaHtSOJFOwNckKmEV8rGE/WmTdKcOVJ1te1I4Kus\nJLzs0IA4XXGFNHq0tGuX7Uji9frrJLywj4TXQ7QzIG65hNfnylRuL2v6DhGnLPTxUuGFC0h4PUTC\ni7hNnixVVEj799uOJD7btkkNDaYVCohLFsYkEl64IJMJ77p1flem2KEBcQsC/9sa1q2jfxfx873C\ne+4cp37CDZlLeOvrpaoqs6jLV1R4kQTfE152aEASfK/w7thhxl1O/YRtmUt4Jb9vMAcPmqMqp02z\nHQl8R8ILlK+lRTp0SOruth1JPGhngCtIeD2Tq+6yUT7i5nvCS0sDklBRYa6l9ettRxIPWuzgChJe\nz9DOgKRceaXpzevrsx1J9A4fNkcnNzbajgRZ4HMfLxVeuIKE1zM8TSMpo0ZJU6aYHj3fMFOCJPk+\nJpHwwgWZTHhnz5YOHJCOH7cdSfSo8CJJvrY1cOAEkuRrhffMGWnnTmnuXNuRABlNeCsrzROnbz1T\n/f3Sxo1slI/k+JrwcqQwkrRokbR5s3/tQVu2SLffLtXU2I4EyGjCK/k5hbRrlzRunDR+vO1IkBU+\nJ7xUeJGU2lpzyMnWrbYjidarr0rDh9uOAjBIeD1COwOS5mNS2NcnbdpE3yGS5eOY9Oqr0tVX244C\nMEh4PULCi6TNni09/bRfe4i2tprFeKNH244EWeJjHy8JL1yS2YR30SJTxTl71nYk0dm+nYQXyaqs\nNAP1mjW2I4kO7QywYfFiv4owfX2mCLN0qe1IACOzCW9trTRjhl89Uy+/bCrXQJKuucZUcnzBDg2w\nYckSvyq8mzaZvuQxY2xHAhiZTXglv9oaurul/ful+fNtR4KsufpqafVq21FEhwovbJg6VTp3zmyZ\n6QPaGeAaEl5PEt5XXzVTR5WVtiNB1vhW4WVLMtgQBP6NSSS8cAkJryc3l5//XLr2WttRIIvmzJE6\nO6WjR21HUr4jR6Rjx6TmZtuRIIt8WrhGwgvXkPCulcLQdiTlI+GFLZWVZnbBh4Vr69aZpKMi03dG\n2OJLEaavz8yUsGANLsn0bb2+XqqqkvbutR1J+X7+czO1DNjgSx/v6tUs/IQ9vlR4N2+Wpk2Txo61\nHQlwXqYTXsmPJ+rOTqmnR2ppsR0JssqXPt7Vq3lwhD3z5pkTM0+dsh1JeWhngItIeD1IeHODdBDY\njgRZ5VOFl4QXttTUSHPnShs22I6kPCS8cBEJrwcJL+0MsG3OHOnQIbPoK62OHJEOHjQJB2CLD2MS\nCS9cRMLrwc2FBWuwraLCLFBJc1vDq69Ky5axYA12pb2PN7dgbdky25EAF8v8rX32bLPR9/HjtiMp\nTRiS8MINae/jpZ0BLkh7EWbLFmnKFBaswT2ZT3grK6WFC82Z32nU3m7+H6ZNsx0Jsi7tfbwkvHDB\n4sXmWN7+ftuRlIZ2Brgq8wmvJN12W3oTXhaswRVUeIHyjR8v1dVJ27bZjqQ0JLxwFQmvpKYm6YUX\nbEdRGtoZ4IpZs8zCr8OHbUdSvK4u09bE1n5wwZIl0iuv2I6iNCS8cBUJr6S3vS29NxcSXriiosIs\nVEljlTc3SDNTAhcsXy6tWmU7iuKdO2cW3LFgDS4i4ZXZ7PvQIbMlUZr095uBmmlYuCKtfbxs7QeX\nLF+eziLMli3mBNNx42xHAlyOhFemMnXddem7wbS2mhtLXZ3tSAAjrX289O/CJUuXmoVrp0/bjqQ4\na9bQzgB3kfC+KY1P1LQzwDVprfCS8MIlI0eamcfXXrMdSXHo34XLSHjfRMILlK+lRTp2LF3tQXv2\nSKNHS42NtiMBzkvjmETCC5eR8L4pt0ggTXsfkvDCNWlcuPbSS9KCBSxYg1uuuy5dC9f6+kxlmgVr\ncBUJ75smTZImTJC2brUdSWH6+lgNCze9/e1m8Upa/PSn0g3/v707D+qqauMA/r364oqSooOOJpqC\noKKhGW6AG66oYGVmllNZNhNWYzRtNvU2NY3TZqlNq1ZumY64pZCJhqKoaCWCuS+vWKKGmmKicN8/\nHh3JWH7Avfec+/P7+U/kd87zB3Cfe85zntNLdRRE/+S2Fd7du+UipEaNVEdCVDomvCW4qT1ZTg7Q\nsiWvbyT9hIUBycmqo/BcejrQu7fqKIj+yW3dg/jiSLpjwltCRASQkaE6Cs+wnIF01acPsGWL9OTU\n3YULshrNnRLSTY0acpBy+3bVkXiGL46kOya8JbhpC4l9Q0lXTZoALVpIyY3utm+XW63q1FEdCdG/\nDR0K7NqlOgrPcIWXdMeEt4TwcLm/vKBAdSQV++UXrvCSviIjgY0bVUdRsfR0PqRJXx07AikpqqOo\n2IkTcjV3cLDqSIjKxoS3hNq1gagoaZ6ts+vbsOHhqiMhKp1bEl6uSpHOevWSXYjCQtWRlG/LFqBn\nTynDINIVfzxvEhoK/PST6ijKl5EBdOoE1K2rOhKi0l1PeE1TdSRlKy6WBzUTXtKVnx8QFKR/mz++\nOJIbMOG9SXQ0kJamOorybdwoK9FEugoMlB2T/ftVR1K2PXsAf38gIEB1JERlc8NuCQ+skRsw4b3J\n9RPmV66ojqRsaWnyR5BIZ7o/qPmQJjfQ/ffo0iUgK4tnSkh/THhv4u8PtG6tbx1vYSGQmcntI9Jf\nZKTeuyXchiU36NNHXs50vQV0xw65qbBePdWREJWPCW8poqP1rePNzJSaLl44QbrTfWWKK7zkBs2b\nyy2gOTmqIyndxo3SPo1Id0x4S6FzHS/rd8ktQkOBc+eA3FzVkfxbXp7cYNWhg+pIiCqm88tjaip7\nwpM7MOEtRWQksGmTnjdFsX6X3KJGDdmO1fFBnZEBjB3LNkrkDromvJcvy+8SF2HIDfjnvhQBAbKN\npNtNUUVFsg3bp4/qSIg8ExWl54M6JQVo21Z1FESe0bXN39atQEgIcNttqiMhqhgT3jLoWMeblQU0\na8Y2SuQeuq5M/fgjMHCg6iiIPNOunXQOOnpUdST/tH490K+f6iiIPMOEtww61vFmZgIjR6qOgshz\n4eHA4cNAfr7qSG44dgw4cwbo0kV1JESeMQxg3DjZ4dNJairQv7/qKIg8w4S3DNe3YnVqBbNiBdC1\nq+ooiDzn4wNEROj1oF63DhgwgPW75C4hIcCaNaqjuOHSJWlJxhI7cgv+yS9DixZSl5SdrToSceWK\nlFhwG5bcRreyBpYzkBvFxMjPri51vJs3A507A76+qiMh8gwT3nLcf7+cQNVBRobUcTVpojoSosoZ\nMECfHqKmyYSX3KlNG0kud+9WHYlgOQO5DRPecnTpAixbpjoKsXatvOETuc3dd8vuxOnTqiORZMHX\nV5IHIrcZOFCeBTrggTVyGya85YiJka3Yv/9WHQkTXnKvWrWAvn1lZVU1ru6Sm8XE6JHw/vUXsGsX\nr+Ymd2HCW45GjYCwMPXdGs6elZUpXoNKbjV4sPS+VY0JL7lZ//5yAPTyZbVxpKYCsbFA3bpq4yCq\nDCa8FRgyBEhOVhvD+vXyJl2njto4iKpq8GDghx/UHrgpLJQdG27Dkls1aiRXdm/erDaO77+XUiUi\nN2HCWwEdEt61a4FBg9TGQFQd7drJC5vKAzdbtwJBQTz4Se4WEyOt9VQxTWDVKlnhJXITJrwV6NZN\nDtuouuHGNIEDB2SFjMjNVL88bt0KxMWpm5/ICsOGScKpys8/Aw0aAMHB6mIgqgomvBWoUUNWV1U9\nqLOygH37gI4d1cxPZJXYWGDvXnXzz53LcgZyv4gI4MQJ4MgRNfOvXMnVXXInJrweULkytXw5MGqU\nXC1J5GbR0cB33wF//un83IcOAX/8AfTs6fzcRFaqWRMYPlxu3lSB5QzkVkx4PTBkCHDsmFyl6LTr\nCS+R29WrJ5dQqNiOXbYMGDlSkgUitxs1Sk3C+/vvUmLH64TJjZjweqBJEzkd6/Q95sePy8pUZKSz\n8xLZJT5ezWUuSUkyN5E3iIkBtm2TlpVOWr1aSvx8fJydl8gKTHg9dN99sh3rpJUr5YAC/7iQt4iN\nlRPmBQXOzXnypNTC8xpU8hb16wNRUc4vwrCcgdyMCa+HRo+WOl4nH9QsZyBv07gxcNdd0pPXKStX\nSpcT9rEmb+J0WUNBAZCXBwwd6tycRFZiwuuhpk2B7t2de6POzweKiqR+mMibxMU5W9aQlMR2ZOR9\nRo4EsrOdW4RZtUpWltnHmtyKCW8lOFnWsGQJ4Ocn/Q6JvElcnHRMcOJ61PPn5Xa1YcPsn4vISQEB\nQPPmsoPhhPnzgQcfdGYuIjsw4a2E+HjnyhrmzgUeesj+eYicdvvtkuw60a1hxQp5SPv52T8XkdPG\njwfmzbN/ntOngQ0bePCT3I0JbyU0bSr3h69ebe88R44AOTmslSLvNWEC8PXX9s8ze7a0QiPyRvHx\nsoNx6pS98yxeLM+jhg3tnYfITkx4K2nMGPvLGubNk3lq1bJ3HiJV7rkHSEuTQzB2OXRIujOMGGHf\nHEQq+fpKuY7dz6T582U1mcjNmPBW0ujR8hDNz7dnfNNkOQN5vwYNJBFduNC+Ob76SsoZate2bw4i\n1caPl4TULocPy/X2gwfbNweRE5jwVpK/PxAeDnzzjT3jb98OFBcDPXrYMz6RLuwsaygqkoT3kUfs\nGZ9IFzExwMGDwP799oy/YIEc2GY/eHI7JrxVMGkS8OmnshprtaVLgYQEwDCsH5tIJ/36Se3hrl3W\nj52aKjX3XbpYPzaRTnx85Jn0ySfWj331KpCSAjz6qPVjEzmNCW8VREVJsrtpk7Xj5uUBn30GjB1r\n7bhEOqpZE5gyxZ4H9ezZfEjTrWPiRNnROHfO2nGTkmTHsVs3a8clUoEJbxUYBvD448CiRdaOO2uW\nbB0FBFg7LpGuxo2TOl4rD6+dOAHk5gIPPGDdmEQ6a9VKamw//9y6MU0TeOcdIDHRujGJVDJM6/bl\nbdjg19fZs0DbtsCOHUDr1tUf7+JFGSc9HQgOrv54RG4xaZK85L3xhjXjJSbKVuz06daMZzfDMGDh\n32G6Re3YIW3KDh60pt42LU1Wjvfskd0YIs1UuvCTCW81vPgicOECMHNm9ceaORNYt062kIhuVuhL\ndQAABNBJREFUJfv2Ab17S//p+vWrN9aZM0BQEPDrr3LBhRsw4SWr9Osnu4/jxlV/rBEjgNhYeSEl\n0hATXiedPAmEhsolEc2aVX2cq1dlVXfePKBXL+viI3KL+Hi5ICIhoXrjvP46cPw48MUXloTlCCa8\nZJVVq4DXXgMyM6t38HnPHqBvX3kJrVvXquiILFXpn3DW8FZDQADwzDPAjBnVGycpCQgMZLJLt66p\nU6V5fnUO3Zw9C8yZA7zwgnVxEbnJsGFSGlfd20DnzAEmT2ayS96FK7zVlJcHdOwo1zuGhFT+8+fP\ny+cXLAAiI62Pj8gtnnhCbhesaonQk0/KJRMffmhtXHbjCi9ZafVq4Nln5YKkqly6kp4uN33m5AB+\nftbHR2QRljSo8N57Un9blbfqyZOBggLgyy+tj4vITfLz5eVv6dLKX7yyfj3w8MPA7t3ue0gz4SWr\njRoFREQAL79cuc9duQJ07Qq8+qokvUQaY8KrQmGh9M6Nj6/clcBbtwJxcUB2NtC4sX3xEbnFokXA\nm28CO3d6ftL84kWgc2fgo4+A4cPtjc8OTHjJaocPA927AxkZQLt2nn9u2jRgwwZZvOHlR6Q51vCq\nUKuWHBSYMgU4cMCzzxQUAM8/L6vDTHaJxJgx0l3h3Xc9/8zUqVL/7kSyu2TJEnTq1Ak1a9bEzp07\ny/y+5ORkhISEIDg4GNOmTbM/MKIS2rQB3n5belEXFHj2mawsKa2bNYvJLnknJrwW6dJFkt6pU6V7\nQ3kKCqTdy513sjk+UUmGAXz8sZQofPttxd+/cKE8qJ3quRsWFoakpCRER0eX+T3FxcVISEhASkoK\nsrOzsXDhQvz222/OBEh0zcSJQIcOsutYXFz+9x45IgfeXnoJuOMOR8IjchwTXgs99ZS0KevZE9i7\nt/TvuXhRkt1WrYAPPuCbNNHNWreWnY/ERFltKsuMGbJL8v77gL+/M7G1b98eQUFB5ZYgbNu2DUFB\nQQgMDISPjw/Gjh2L5cuXOxMg0TWGIVfVnzoltbyXLpX+fUePAoMGye8Sr7Unb8aE10KGIau8r7wC\nREcDixcDRUXyf0VFwIoV8tYdGCiH1Hh7DVHpwsKk88n06bLqtG+ffL24WGrfExOlm8OmTVK/q5Pc\n3FzcXuLWi5YtWyI3N1dhRHSrql1bevMeOwZ06gQkJ9/4v8uX5erg7t2B554Dnn5aXZxETviP6gC8\n0WOPyR+XyZOln+Hp00CNa68WU6YA9957499EVLo2bSShnTlTmuA3awbk5gJNm0op0ObN9qzsxsTE\n4GSJuiTTNGEYBt566y2MGDHC+gmJbNSwodTmrlkjK70TJshiS2go4OsrL5bt26uOksh+VnZpICK6\nJRiGsR7Ac6Zp/uvkmmEYPQC8bprmkGv/fhGAaZpmqafXDMMwAfy3xJc2mKa5wfqoiYhuXVzhJSKq\nmrIq8LcDaGcYRiCA3wGMBVDm8VTTNFnJT0RkM26sExF5yDCMOMMw/gegB4BVhmGsufb15oZhrAIA\n0zSLACQA+AFANoBvTdPcoypmIiJiSQMREREReTmu8BIRERGRV2PCS0RERERejQkvEREREXk1JrxE\nRERE5NWY8BIRERGRV2PCS0RERERejQkvEREREXk1JrxERERE5NX+D259IcmpzYUtAAAAAElFTkSu\nQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sympy.plot(sympy.sin(x));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can explicitly set limits, for example" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAt0AAAIqCAYAAAD4oPZTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xuc12P+//HHVVg5s1jfcj4t68zKITItVsjmlC3nMz+b\n82KX3ZXFWmdZS0KWdikkhaSDooOoLedyakWJRNhETc31++OaGHaqaZr3vD+Hx/12m1vzmc/nPT1n\nb7PT0zWv93WFGCOSJEmSstMk7wCSJElSqbN0S5IkSRmzdEuSJEkZs3RLkiRJGbN0S5IkSRmzdEuS\nJEkZs3RLkiRJGbN0S5IkSRlbri4vCiGsC7QCmgNfA68B42KMVRlmkyRJkkpCWNyJlCGENsDvgLWA\nCcAMYEVgS2Az4BHgxhjjl9lHlSRJkorTkkr39cDfYozv1/LcckA7oGmMsc9iPkdb4BbSKMs9McZr\nf/D8r4ArgSqgEjg/xjiq+rn3gC8WPhdjbLlUX50kSZJUABZbupf5k4fQBHgL2Bf4EBgLdIwxTqrx\nmpVijHOq398OeCjGuHX148nALjHGWZmFlCRJkjJWpxspQwg9Qwir13i8cQhhaB0ubQm8HWOcEmOs\nBHoB7Wu+YGHhrrYKaVX727+qrhklSZKkQlXXQjsSeCGEcFAI4TRgEGlkZElaAB/UeDy1+mPfE0I4\nNIQwEXgcOLnGUxEYHEIYW/33SpIkSUWnTruXxBjvDCG8DgwDZgI7xRg/aqgQMcbHgMdCCHsBVwH7\nVz/VKsY4PYSwDql8T4wxjmyov1eSJElqDHXdMvA44I/A8cD2wIAQwkkxxpeXcOk0YMMaj9ev/lit\nYowjQwibhhDWijF+FmOcXv3xT0IIfUnjKv9TukMI8fLLL//2cUVFBRUVFXX50iRJkqS6CvW+sC43\nUoYQHgNOjzHOqH7cErgzxrjTEq5rCrxJupFyOvAi0CnGOLHGazaLMb5b/f7OQL8Y4wYhhJWAJjHG\n2SGElUkjLVfEGAfV8vfELG8IlSRJkliG0l3X8ZJDf/D4xRDCbnW4bkEIoTOpMC/cMnBiCOGM9HTs\nDhwRQjgemEc6eOeo6st/AvQNIcTqnP+qrXBLkiRJhW5J+3T/Abg9xvjZIp7/BbBSjPGJjPLViSvd\nkiRJagSZrXS/CjweQvgGGA98QjqRcgtgR2AI8Jf6/uWSJElSOVjSSnfPGONxIYSLSUfA/x9pBGQi\n8FyM8evGibl4rnRLkiSpEWS20r1LCKE5cAzQ5gfPNSMVcEmSJEmLsaTS3Q0YCmwKjKvx8UA6uGbT\njHJJkiRJJaOuWwbeEWP8f42Qp14cL5EkSVIjyHaf7kJn6ZYkSVIjqHfpbtKQKSRJkiT9L0u3JEmS\nlDFLtyRJkpQxS7ckSZKUMUu3JEmSlDFLtyRJkpQxS7ckSZKUMUu3JEmSlDFLtyRJkpQxS7ckSZKU\nMUu3JEmSlDFLtyRJkpQxS7ckSZKUMUu3JEmSlDFLtyRJkpQxS7ckSZKUMUu3JEmSlDFLtyRJkpQx\nS7ckSZKUMUu3JEmSlDFLtyRJkpQxS7ckSZKUMUu3JEmSlDFLtyRJkpQxS7ckSZKUMUu3JEmSlDFL\ntyRJkpQxS7ckSZKUMUu3JEmSlDFLtyRJkpQxS7ckSZKUMUu3JEmSlDFLtyRJkpQxS7ckSZKUMUu3\nJEmSlDFLtyRJkpQxS7ckSZKUMUu3JEmSlDFLtyRJkpQxS7ckSZKUMUu3JEmSlDFLtyRJkpQxS7ck\nSZKUMUu3JEmSlDFLtyRJkpQxS7ckSZKUMUu3JEmSlLHl8g4gSZIkFZoY4YMP4MUXYezY9OewYfX/\nfJZuSZIklb1PP4Vx41K5Xli0AVq2TG+/+92yff4QY1z2lDkLIcRS+DokSZLUOKZMgeHD09uHH8KY\nMbDLLt+V7F13hfXXhxC+d1mo9ZPVgSvdkiRJKnnvv58K9rBh6c85c6CiAtq0gb33hq23hiYZ3u3o\nSrckSZJKzocfwtCh35Xs2bO/K9kVFbDVVv+zil0X9V7ptnRLkiSp6M2fD88/D089BQMGpJsg27aF\nVq1Syd5663qV7B+ydJfC1yFJkqS6++gjGDgwFe3Bg2HjjeHAA+Ggg2C33WC5hh+ktnSXwtchSZKk\nxZs8GR59FPr0gXnzYNNNU8lu2xb+7/8y/+st3aXwdUiSJOn7YoQ33khF+9FH06z2oYfCEUfAPvvA\nj37UqHEs3aXwdUiSJCkV7fHj02r2o4/CV1/B4Yenot2qFTRtmlu0wi3dIYS2wC2kI+fviTFe+4Pn\nfwVcCVQBlcD5McZRdbm2xuewdEuSJBW5SZPgn/+EV16BiRNTyT788LRndgPcBNkQCrN0hxCaAG8B\n+wIfAmOBjjHGSTVes1KMcU71+9sBD8UYt67LtTU+h6VbkiSpCM2YAQ8+mMr21Klw9NFwzDGw004F\nU7RrKtjDcVoCb8cYpwCEEHoB7YFvi/PCwl1tFdKKd52ulSRJUvGZMwf69YOePWH0aPjVr+Dqq2Hf\nfXMdHclU1qW7BfBBjcdTSWX6e0IIhwLXAOsABy/NtZIkSSp88+fDs8+mot2vX9rS79hj4aGHYJVV\n8k6XvYI4Bj7G+BjwWAhhL+AqYP+l/RxdunT59v2KigoqKioaKp4kSZLqafp06NEjjY+suSZ06ADX\nXNMo2/sVlKxL9zRgwxqP16/+WK1ijCNDCJuGENZa2mtrlm5JkiTlp6oKnnkGunVLR7F36JBK9y67\n5J0sP1mX7rHA5iGEjYDpQEegU80XhBA2izG+W/3+zsAKMcbPQghLvFaSJEmFY+ZM+Mc/4M47YaWV\n4Mwz0yr3aqvlnSx/mZbuGOOCEEJnYBDfbfs3MYRwRno6dgeOCCEcD8wDvgaOWty1WeaVJEnS0okR\nRo5Mq9oDBkD79mlue7fdCnL3kdx4OI4kSZKW2qxZqVx365aK95lnwvHHp7ntElawWwZKkiSphEya\nBLfcAm++mW6G7NYN9t7bVe0laZJ3AEmSJBW2GGHYMGjXDvbZB9ZbLx1o88AD0Lq1hbsuXOmWJElS\nrebNg9694aab4Jtv4IIL4OGHoVmzvJMVH2e6JUmS9D2ffQbdu8Pf/gZbbw0XXggHHABNnJFwpluS\nJEnL5j//gdtvh3vuSUezDxgAO+yQd6rS4H+vSJIklbmJE+GEE2DXXWGddeC119J+2xbuhmPpliRJ\nKlMTJsCRR0JFBfz0p/Duu3DxxdC8ed7JSo+lW5IkqcyMGgUHHQSHHAJ77QWTJ8Oll8Lqq+edrHQ5\n0y1JklQGYoTBg+Hqq+GDD+B3v4O+feFHP8o7WXmwdEuSJJWwGGHIEPjzn9N+2qefDh07wnK2wEbl\n/9ySJEkl6tln4Y9/hBkzoEsXOOoot/3Li6VbkiSpxDz/fCrb//kPXH45HH20K9t58791JEmSSsS4\ncekGyY4d09ukSXD88RbuQmDpliRJKnKvvgrt28Ohh0K7dvDWW3DqqbD88nkn00L+d48kSVKRmjIl\njZGMHg2dO0OvXtCsWd6pVBtXuiVJkorMp5/ChRfCzjvDxhvD+PFw3nkW7kJm6ZYkSSoSc+bAX/8K\nW20FX38Nr7+etgJcbbW8k2lJHC+RJEkqcPPnw333pZ1I9tgjnSi55ZZ5p9LSsHRLkiQVqIWnSJ5/\nPqy9NvTpA7vtlncq1YelW5IkqQC9/noq29Onw3XXpa0AQ8g7lerLmW5JkqQCMnMm/OY30KZN2v5v\n/Hg4+GALd7GzdEuSJBWAykro2hV+9rN0VPvEiXDOOe61XSocL5EkScrZgAFwwQWw0UYwbBhss03e\nidTQLN2SJEk5mTgxle3Jk+Gmm5zbLmWOl0iSJDWyTz9NoyOtW8MBB6Rj3J3bLm2udEuSJDWSqiro\n0QPuuiudJjlxYtoKUKXP0i1JktQIJkyAs85K73frBjvtlG8eNS7HSyRJkjL0+edw9tnQti2cemo6\nTdLCXX4s3ZIkSRmIEf75z7QF4Lx58MYbcMopaTtAlR/HSyRJkhrY66+nA26+/BL69vXodrnSLUmS\n1GBmz4aLLoKKCujQAcaOtXArsXRLkiQ1gCefTKMkH38Mr72WVrqbNs07lQqF4yWSJEnLYNo06NwZ\n3nwTevaEffbJO5EKkSvdkiRJ9VBVBXfcATvuCNtvn7YEtHBrUVzpliRJWkpvvAGnn56K9/DhsM02\neSdSoXOlW5IkqY7mzoUrrkgr2kcfDSNHWrhVN650S5Ik1cGoUXDaabDFFmmUZP31806kYmLpliRJ\nWowvv4Tf/Q769YOuXeGIIyCEvFOp2DheIkmStAhPPAEtW8L8+WkbwCOPtHCrflzpliRJ+oFZs+Dc\nc9NIyb33QuvWeSdSsXOlW5IkqYbHH4dtt4U11oBXXrFwq2G40i1JksT3V7cfeMA9t9WwXOmWJEll\n74er2xZuNTRXuiVJUtlydVuNxZVuSZJUlhaubq++uqvbyp4r3ZIkqax88QVccw08/LCr22o8rnRL\nkqSy8eyzsMMO8Pnn8NJLFm41Hle6JUlSyZs7F/7wh7SyfdddcNBBeSdSubF0S5KkkvbKK3DssbD5\n5vDyy7D22nknUjlyvESSJJWkBQvg+uth333hwguhTx8Lt/LjSrckSSo5770HJ5wAMcLYsbDxxnkn\nUrlzpVuSJJWMGOH++2HXXaFdOxg2zMKtwuBKtyRJKgkzZ8KZZ8Kbb8KQIWmXEqlQuNItSZKK3qBB\naWV7k03SOImFW4XGlW5JklS05s2Dyy6DXr3SWEmbNnknkmpn6ZYkSUXp7behUydo0QImTHBnEhU2\nx0skSVJRiRHuuw/23BNOPhkee8zCrcLnSrckSSoaX34J/+//pSPcn3kGttsu70RS3bjSLUmSisIL\nL8BOO8Fqq6WbJS3cKiaudEuSpIJWVQXXXQc33wzdusFhh+WdSFp6lm5JklSwPvwQjjsO5s+HceNg\ngw3yTiTVj+MlkiSpID3+OOy8M1RUpPltC7eKWeYr3SGEtsAtpIJ/T4zx2h88fzRwSfXD/wJnxRhf\nqX7uPeALoAqojDG2zDqvJEnK17x5cOmlMGIE9OkDrVrlnUhadpmW7hBCE+A2YF/gQ2BsCKFfjHFS\njZdNBlrHGL+oLujdgd2rn6sCKmKMs7LMKUmSCsN778FRR0Hz5jBwIKy5Zt6JpIaR9XhJS+DtGOOU\nGGMl0AtoX/MFMcYxMcYvqh+OAVrUeDo0QkZJklQA+vWD3XaDjh2hb18Lt0pL1uMlLYAPajyeSiri\ni3Iq8FSNxxEYHEJYAHSPMd7V8BElSVKeKivhd7+DRx5JB93ssUfeiaSGVzC7l4QQ2gAnAXvV+HCr\nGOP0EMI6pPI9McY4Mp+EkiSpob3/Pvz61/DjH8P48elPqRRlXbqnARvWeLx+9ce+J4SwPWmWu23N\n+e0Y4/TqPz8JIfQlrZLXWrq7dOny7fsVFRVUVFQse3pJkpSZJ5+EU06BCy9Mb00cKFUJCzHG7D55\nCE2BN0k3Uk4HXgQ6xRgn1njNhsBQ4LgY45gaH18JaBJjnB1CWBkYBFwRYxxUy98Ts/w6JElSw6ms\nhD/8AR54AHr1cncSFZVQ3wszXemOMS4IIXQmFeaFWwZODCGckZ6O3YE/AmsBt4cQAt9tDfgToG8I\nIVbn/FdthVuSJBWPqVPTjZKrrprGSdZZJ+9EUuPIdKW7sbjSLUlS4Rs4EE48Ec49Fy65xHESFaXC\nXOmWJEmaPx/+/Gfo0QMeeghat847kdT4LN2SJCkzM2akcZLNNkvjJOuum3ciKR/+YkeSJGVizBjY\nZRfYc0/o1s3CrfLmSrckSWpQMcLtt8MVV8Ddd8OvfpV3Iil/lm5JktRg5syBM86Al1+G0aNh883z\nTiQVBsdLJElSg3jnHdh99/T+mDEWbqkmS7ckSVpm/fun2e0zz4T774eVVso7kVRYHC+RJEn1tmAB\n/OlP0LNnKt4LV7olfZ+lW5Ik1cvMmdCpE1RVwbhx7k4iLY7jJZIkaamNGwdHHw0//zk8/bSFW1oS\nV7olSdJSuf9+uPBCuPNOOPzwvNNIxcHSLUmS6qSyEn77WxgwAIYPh222yTuRVDws3ZIkaYlmzICj\njkq7kowdC2uskXciqbg40y1Jkhbr3/+GXXeFVq3g8cct3FJ9uNItSZIWqWdPuOAC6NYNjjgi7zRS\n8bJ0S5Kk/1FZCRddBE8+CcOGwbbb5p1IKm6WbkmS9D2ffJLmt1dcEV58EdZcM+9EUvFzpluSJH1r\n/Pg0v73HHvDEExZuqaG40i1JkgB48EHo2hWuvx46dMg7jVRaLN2SJJW5qir4wx9S6e7XD7bfPu9E\nUumxdEuSVMa+/BKOPRa++CLNb6+zTt6JpNLkTLckSWXq3XfT7Hbz5jB4sIVbypKlW5KkMjR0KOy5\nJ3TunPbgXmGFvBNJpc3xEkmSykiM8Pe/w1VXQa9e0KZN3omk8mDpliSpTMybl1a2n38eRo+GTTfN\nO5FUPizdkiSVgRkz0jHua62VCveqq+adSCovznRLklTiXnkF9tknvfXta+GW8uBKtyRJJezxx+Hk\nk+GOO+DII/NOI5UvS7ckSSUoRrjxRrj55nSc+2675Z1IKm+WbkmSSsy8eXDWWTBuXLppcsMN804k\nydItSVIJ+fTTdMPk6qvDyJGwyip5J5IE3kgpSVLJmDQpjZG0bAmPPmrhlgqJpVuSpBIweDC0bg2X\nXQbXXQdNm+adSFJNlm5JkorcHXfAccfBww/DSSflnUZSbZzpliSpSM2fDxdckFa5R42CzTbLO5Gk\nRbF0S5JUhL74An7967Q14PPPwxpr5J1I0uI4XiJJUpGZPBn23BM23xyefNLCLRUDS7ckSUVk9Gg4\n6CA4+2y47TZYzt9ZS0XB/6tKklQkeveGzp3hvvtS8ZZUPCzdkiQVuBjhr39Nu5QMGQI77JB3IklL\ny9ItSVIBq6yEM8+ECRPSDZMtWuSdSFJ9WLolSSpQn38ORx4JzZrBc895wqRUzLyRUpKkAvSf/6Qd\nSn72M3jsMQu3VOws3ZIkFZgXXoBWrdJYya23eqS7VAocL5EkqYD06ZPKdo8ecMgheaeR1FAs3ZIk\nFYAY4YYboGtXePpp2HnnvBNJakiWbkmSclZZmfbfHjMm7VCywQZ5J5LU0CzdkiTl6Msv4cILYdo0\nGDkSVl0170SSsuCNlJIk5WTaNNh7b1hhBejf38ItlTJLtyRJOXj1VdhjDzj6aLjtNljO3z1LJc3/\ni0uS1MiGDEllu2tX6NQp7zSSGoMr3ZIkNaL77oNjjoGHH7ZwS+XElW5JkhpBjHDllXDvvTB8OGy9\ndd6JJDUmS7ckSRmrrEwH3rz0UtoScL318k4kqbFZuiVJytCXX0KHDulGyWefhVVWyTuRpDw40y1J\nUkamTYPWrWGTTaBfPwu3VM4s3ZIkZeC119KWgB07wh13uCWgVO78ESBJUgMbNgxOOgluuAGOOirv\nNJIKgaVbkqQG1KsXnHMO9O4NbdrknUZSobB0S5LUQG66CW6+GYYOhe22yzuNpEJi6ZYkaRlVVcFv\nfwuDBsHo0bDBBnknklRoLN2SJC2DuXPh+OPho49gxAhYc828E0kqRO5eIklSPX3+ORxwQFrpfvpp\nC7ekRcu8dIcQ2oYQJoUQ3gohXFLL80eHEF6ufhsZQti+rtdKkpSXDz6AvfaCHXdMN02uuGLeiSQV\nskxLdwihCXAbcACwDdAphLDVD142GWgdY9wBuArovhTXSpLU6F59FVq1StsC3nwzNPH3xpKWIOsf\nEy2Bt2OMU2KMlUAvoH3NF8QYx8QYv6h+OAZoUddrJUlqbMOHw377wbXXwoUXQgh5J5JUDLIu3S2A\nD2o8nsp3pbo2pwJP1fNaSZIy1bt3OuzmwQehU6e800gqJgWze0kIoQ1wErBX3lkkSfqhhXtwDxkC\n22+/5NdLUk1Zl+5pwIY1Hq9f/bHvqb55sjvQNsY4a2muXahLly7fvl9RUUFFRUV9M0uS9K2qKrj4\nYpgyBUaNgg03XPI1kvRDIcaY3ScPoSnwJrAvMB14EegUY5xY4zUbAkOB42KMY5bm2hqvjVl+HZKk\n8jRvHpx8MvznP/D447DWWnknkpSzet/FkelKd4xxQQihMzCIND9+T4xxYgjhjPR07A78EVgLuD2E\nEIDKGGPLRV2bZV5JkhaaPRuOOCJtBThkCDRrlnciScUs05XuxuJKtySpIc2YAQcfnPbgvuMOWK5g\n7oCSlLN6r3S7s6gkSTVMnpz24G7bFrp3t3BLahiWbkmSqk2YAHvvDeefD1de6R7ckhqO//0uSRIw\ndGjae/uOO9IstyQ1JFe6JUllr1evVLgfftjCLSkbrnRLkspa165w/fUeeiMpW5ZuSVJZihGuuCKV\n7ZEjYeON804kqZRZuiVJZWf+fDjzTHj1VXjySVh77bwTSSp1lm5JUln5+mvo2BHmzk03T66ySt6J\nJJUDb6SUJJWNzz+HAw6AlVeG/v0t3JIaj6VbklQWPvwQWreGnXeGf/4TVlgh70SSyomlW5JU8t56\nK50y2akT3HwzNPFfP0mNzJluSVJJ+/e/oV27dMLkqafmnUZSubJ0S5JK1pAhcPTR0L07HHpo3mkk\nlTNLtySpJPXtC2ecAY88kma5JSlPlm5JUsm54w649loYPBh22CHvNJJk6ZYklZAY0+z2/ffDM8/A\nppvmnUiSEku3JKkkVFXBuefCiBHpWPf11ss7kSR9x9ItSSp68+bBiSfCtGnw7LOw+up5J5Kk77N0\nS5KK2ldfwRFHwI9+BAMHQrNmeSeSpP/l8QCSpKL12Wew337QvDn06WPhllS4LN2SpKI0dSrsvXd6\nu+ceWM7f3UoqYCHGmHeGZRZCiKXwdUiS6uatt+Dii9PR7hddlHcaSWUk1PdCV7olSUVl/HjYZx9o\n397CLal4+Ms4SVLRGD4cjjoK7rwTDjss7zSSVHeWbklSUejXD047DXr3hjZt8k4jSUvH8RJJUsG7\n7z4480wYMMDCLak4udItSSpoN90EXbvCsGGw1VZ5p5Gk+rF0S5IKUozwhz+k/bdHjIANN8w7kSTV\nn6VbklRwFiyA3/wG/v3vVLjXWSfvRJK0bCzdkqSCMm8eHHccfPIJPPMMrLpq3okkadl5I6UkqWB8\n9VXaoWTevHTTpIVbUqmwdEuSCsJnn8H++8NKK8HDD8OKK+adSJIajqVbkpS76dPTKZN77AG33w7L\nOfwoqcRYuiVJuZo8GfbeGzp1ghtugBDyTiRJDc/SLUnKzWuvQevWcOGFcOmlFm5Jpctf4EmScjFm\nDLRvD7fckla5JamUWbolSY1uyBA4+mj4xz/goIPyTiNJ2XO8RJLUqPr0SYW7Tx8Lt6TyYemWJDWa\nHj3g7LPh6afTzZOSVC4cL5EkNYobb4S//Q2GD4ctt8w7jSQ1Lku3JClTMcKVV6bV7ZEjYf31804k\nSY3P0i1JykxVFXTuDC++CAMHwtpr551IkvJh6ZYkZaKyEk48EaZNg2eegdVWyzuRJOXH0i1JanBf\nfw1HHZXef+opaNYs3zySlDd3L5EkNagvv4QDD0wr248+auGWJLB0S5Ia0MyZ8ItfwDbbQM+esPzy\neSeSpMJg6ZYkNYipU6F1azjgALjtNmjivzCS9C1/JEqSltnbb6fDbk4+Ga6+GkLIO5EkFRZvpJQk\nLZOXX07HuV9xBZx6at5pJKkwWbolSfU2ejQcdlgaJ+nQIe80klS4LN2SpHoZPBjOPhvuvz/NcUuS\nFs3SLUlaao88AmedBX37QqtWeaeRpMLnjZSSpKXSoweccw4MGmThlqS6cqVbklRnN98Mt9wCw4fD\nllvmnUaSioelW5K0RDFCly7QqxeMGAEbbph3IkkqLpZuSdJiVVXB+efDc8+lwr3uunknkqTiY+mW\nJC3S/Plp7+133oFhw2CNNfJOJEnFydItSarV3LnQsSPMmQNPPw0rr5x3IkkqXu5eIkn6H7NnQ7t2\nsNxy0L+/hVuSlpWlW5L0PbNmwf77p5sle/WCH/0o70SSVPxCjDHvDMsshBBL4euQpLx99FE6ZXKD\nDeDGGyGEvBNJUkGp909FV7olSQBMmQJ77w3bb2/hlqSGZumWJDFpUircZ58Nf/yjhVuSGlrmpTuE\n0DaEMCmE8FYI4ZJanv9pCGF0COGbEMIFP3juvRDCyyGECSGEF7POKknlaPx4aNMGrrwyHe8uSWp4\nmW4ZGEJoAtwG7At8CIwNIfSLMU6q8bJPgbOBQ2v5FFVARYxxVpY5JalcjRgBRxwB3brB4YfnnUaS\nSlfWK90tgbdjjFNijJVAL6B9zRfEGGfGGP8NzK/l+tAIGSWpLA0cmAr3Aw9YuCUpa1kX2hbABzUe\nT63+WF1FYHAIYWwI4bQGTSZJZezhh+GEE6BfP9hvv7zTSFLpK/QTKVvFGKeHENYhle+JMcaReYeS\npGJ2zz3pZslBg2CHHfJOI0nlIevSPQ3YsMbj9as/VicxxunVf34SQuhLGleptXR36dLl2/crKiqo\nqKhY+rSSVOJuugluvRWefRa22CLvNJJUPjI9HCeE0BR4k3Qj5XTgRaBTjHFiLa+9HJgdY7yx+vFK\nQJMY4+wQwsrAIOCKGOOgWq71cBxJWowY4fLL4aGHYPDgdPiNJGmp1XtD1UxXumOMC0IInUmFuQlw\nT4xxYgjhjPR07B5C+AkwDlgVqAohnAv8DFgH6BtCiNU5/1Vb4ZYkLV5VFZx3Xtqp5LnnYN11804k\nSeXHY+AlqYTNnw+nnALvvgtPPAFrrJF3IkkqaoW50i1Jys/cudC5M/z3v+mmyZVWyjuRJJUv98CW\npBI0eza0aweffw69elm4JSlvlm5JKjGffQb77w8bbpgK9wor5J1IkmTplqQS8tFHUFEBe+wBd98N\nTZvmnUiSBJZuSSoZU6bA3ntDhw5w440Q6n27jySpoVm6JakETJyYCvc556TTJi3cklRY3L1Ekorc\n+PFw8MFw7bVw/PF5p5Ek1cbSLUlFbMQIOOIIuPNOOOywvNNIkhbF0i1JRWrAADjhBHjwQdhvv7zT\nSJIWx5kNr9ecAAAbKklEQVRuSSpCvXvDSSdB//4WbkkqBpZuSSoyd90FF1wAgwenrQElSYXP8RJJ\nKiI33AB//zsMHw5bbJF3GklSXVm6JakIxAh/+hO8/HK6eXL99fNOJElaGpZuSSpwVVVw9tkwZgwM\nHAjrrJN3IknS0rJ0S1IBq6yEE0+EqVPhmWdg9dXzTiRJqg9LtyQVqK+/hqOOSqMlAwdCs2Z5J5Ik\n1Ze7l0hSAfrySzjwQFhtNejb18ItScXO0i1JBWbmTPjFL+BnP4OePWH55fNOJElaVpZuSSogU6fC\n3nvDL3+ZtgZs4k9pSSoJ/jiXpALx9tupcJ98MvzlLxBC3okkSQ3F0i1JBeDll6GiAi69FC66KO80\nkqSG5u4lkpSz0aPhsMPgttugQ4e800iSsmDplqQcDRoExxyTbphs2zbvNJKkrFi6JSknffrAlVem\nLQH32ivvNJKkLFm6JSkHd98Nl18OTz4JO+6YdxpJUtYs3ZLUyK67Du64A4YPhy22yDuNJKkxWLol\nqZHECL//PTz+OIwcCS1a5J1IktRYLN2S1AgWLICzzoIJE+C55+DHP847kSSpMVm6JSlj8+bBscfC\np5/C0KGw6qp5J5IkNTYPx5GkDH31FRxyCFRWppsmLdySVJ4s3ZKUkVmzYP/9oXlzePhhWHHFvBNJ\nkvJi6ZakDEyfDvvsA7vvDvfcA8s5zCdJZS3EGPPOsMxCCLEUvg5JpWHyZDjvPNhtN7j0Uggh70SS\npAZS75/ornRLUgN65RVo3RoOPBAuu8zCLUlK/IWnJDWQUaPg8MOha1fo2DHvNJKkQmLplqQG8NRT\ncPzx0LMntG2bdxpJUqFxvESSltGDD8KJJ0L//hZuSVLtXOmWpGXw97/DNdekQ2+23TbvNJKkQmXp\nlqR6iBGuvDKNk4wYAZtsknciSVIhs3RL0lKqqkpbAj73HIwcCT/5Sd6JJEmFztItSUuhshJOOgne\nfx+GD4c11sg7kSSpGFi6JamO5syBDh2gSRN4+mlo1izvRJKkYuHuJZJUB7NmpZ1JfvxjePRRC7ck\naelYuiVpCaZPh332gV/+Ev7xD1h++bwTSZKKjaVbkhbjnXegVat0wuRll6XREkmSlpYz3ZK0CBMm\nwMEHwxVXwGmn5Z1GklTMLN2SVIvhw+Goo6BbNzj88LzTSJKKnb8olaQfePTRVLh797ZwS5IahqVb\nkmq46y7o3BkGDoQ2bfJOI0kqFY6XSBLpWPe//jWV7mefhS22yDuRJKmUWLollb2qKrjwQhgyJB3r\n3rx53okkSaXG0i2prM2bB6eeCpMnw3PPwZpr5p1IklSKnOmWVLZmz4b27WHVVWHQIAu3JCk7lm5J\nZWnmTNh33zRK0rUrrLRS3okkSaXM0i2p7EyZAnvtBfvtB3ffDcs5aCdJypilW1JZefXVVLjPOguu\nvhpCyDuRJKkcuL4jqWyMGAFHHpnGSTp2zDuNJKmcWLollYXHHoPTT4cHHkhjJZIkNSbHSySVvO7d\n0zjJU09ZuCVJ+XClW1LJihGuugr+8Q9PmZQk5cvSLakkLVgA55wDo0alt/XWyzuRJKmcWbollZxv\nvoHjjkt7cT/7LKy+et6JJEnlzpluSSXl88/hwANh/fXTDLeFW5JUCDIv3SGEtiGESSGEt0IIl9Ty\n/E9DCKNDCN+EEC5YmmslqaZp06B1a9huO7jhBlhxxbwTSZKUZFq6QwhNgNuAA4BtgE4hhK1+8LJP\ngbOB6+txrSQB8MYbsOeecOyxaR/upk3zTiRJ0neyXuluCbwdY5wSY6wEegHta74gxjgzxvhvYP7S\nXitJACNHQps2aaeSiy/2lElJUuHJunS3AD6o8Xhq9ceyvlZSmXj0UTjsMOjZM908KUlSISqZ3Uu6\ndOny7fsVFRVUVFTklkVS47j9drj6anj6adh557zTSJK0aFmX7mnAhjUer1/9sQa/tmbpllTaYoTL\nLoNHHoERI2DTTfNOJEnS4mVduscCm4cQNgKmAx2BTot5fc1JzKW9VlIZqKyE006DSZNg9GhYe+28\nE0mStGSZlu4Y44IQQmdgEGl+/J4Y48QQwhnp6dg9hPATYBywKlAVQjgX+FmMcXZt12aZV1Jhmz0b\njjwSll8ehg6FlVfOO5EkSXUTYox5Z1hmIYRYCl+HpEX7+GM4+GDYaSe44w5YrmTuSJEkFZF674/l\niZSSCt4770CrVtCuHXTvbuGWJBUfV7olFbQXX4QLLoATTkiz3JIk5ajeK92uF0kqWP37wymnwL33\nplVuSZKKlaVbUkG6/fZ0wuSAAbDrrnmnkSRp2Vi6JRWUqir4/e/hscfS8e7uwS1JKgWWbkkFY+5c\nOPFE+OCDtAf3j3+cdyJJkhqGu5dIKgizZsEvf5kOvxk82MItSSotlm5JuZsyJW0JuMsu8NBD0KxZ\n3okkSWpYlm5JuRo/HvbcE844A266CZr4U0mSVIKc6ZaUm6eeguOPh27d4Igj8k4jSVJ2XFOSlIu7\n74aTToJ+/SzckqTS50q3pEYVI1xzDTz4IDz3HGy5Zd6JJEnKnqVbUqOZOxdOPhkmT4ahQ2HddfNO\nJElS43C8RFKj+PRT2G8/mDcPnnnGwi1JKi+WbkmZe+cd2GOPtEtJ795uCShJKj+WbkmZGjkS9toL\nfvtbuPZatwSUJJUnZ7olZaZXLzjnHOjZEw44IO80kiTlx9ItqcEt3KHkzjthyBDYfvu8E0mSlC9L\nt6QGVVkJZ54JEybA889D8+Z5J5IkKX+WbkkN5vPP4cgj042Szz0Hq6ySdyJJkgqDtzRJahDvvQet\nWsHWW8Njj1m4JUmqydItaZmNGQOdOsHpp8Pf/gZNm+adSJKkwuJ4iaRl8uCDaYeSe++Fdu3yTiNJ\nUmGydEuqlxjhz3+GHj3Ske7uUCJJ0qJZuiUttW++gZNPhnffhRdegPXWyzuRJEmFzZluSUvl44+h\nTRtYsACGD7dwS5JUF5ZuSXX26quw227wy1+mWe5mzfJOJElScXC8RFKdDBgAJ5wAt9wCxxyTdxpJ\nkoqLpVvSYsWYtgG85hro1w/23DPvRJIkFR9Lt6RFqqyEc89Np0s+/zxsvHHeiSRJKk6Wbkm1mjUL\nLrwQpk+H0aNhtdXyTiRJUvHyRkpJ/+PNN2H33WHtteHxxy3ckiQtK0u3pO95+mnYe2+4+GK47jpY\nzt+HSZK0zPznVBKQbpjs2hWuvRb69EnFW5IkNQxLtyTmzoWzzoJx42DMGNhoo7wTSZJUWhwvkcrc\njBmw777pxslRoyzckiRlwdItlbGXXoKWLeEXv4BHHoFVVsk7kSRJpcnxEqlMPfoonHEG3HYb/PrX\neaeRJKm0WbqlMhMjXHUV3HUXDBwIu+ySdyJJkkqfpVsqI199BWeeCW+/DS+8AP/3f3knkiSpPDjT\nLZWJyZNhzz1hvfVg+HALtyRJjcnSLZWBIUNgjz3glFPSgTcrrph3IkmSyovjJVIJixFuugluuAF6\n94aKirwTSZJUnizdUomaMwdOOw0mTvTAG0mS8uZ4iVSCpkyBVq2gSRMPvJEkqRBYuqUSM2wY7L47\nHH883H8/NGuWdyJJkuR4iVQiYoSuXeGvf4V//Ssd7S5JkgqDpVsqAV9/nU6XfOWVNL+98cZ5J5Ik\nSTU5XiIVufffhyOPhMpKGD3awi1JUiGydEtFbNAgaNkS2raFBx6AlVbKO5EkSaqN4yVSEaqqgr/8\nBW6/Pe2/vc8+eSeSJEmLY+mWisysWWlnks8+g3HjoHnzvBNJkqQlcbxEKiIvvQQ//zlsumnaGtDC\nLUlScbB0S0Xivvtg//3hqqvS1oArrJB3IkmSVFeOl0gFbu5cOO88eOaZtLq97bZ5J5IkSUvL0i0V\nsPffhw4doEULGDsWVlst70SSJKk+HC+RCtSQIWk7wCOPhD59LNySJBUzV7qlAlNVBTffnOa2H3wQ\n2rTJO5EkSVpWlm6pgHzyCRx7LMyZk06XXH/9vBNJkqSG4HiJVCCeew522gl23jndMGnhliSpdLjS\nLeWsqgquvTaNk9x7Lxx4YN6JJElSQ7N0Szn65JN0uuR//5tOl3R1W5Kk0pT5eEkIoW0IYVII4a0Q\nwiWLeM2tIYS3QwgvhRB2qvHx90IIL4cQJoQQXsw6q9SYRo5MoyQ77OA4iSRJpS7Tle4QQhPgNmBf\n4ENgbAihX4xxUo3XHAhsFmPcIoSwG3AHsHv101VARYxxVpY5pcZUVQXXX592KOnRAw46KO9EkiQp\na1mPl7QE3o4xTgEIIfQC2gOTarymPXA/QIzxhRDC6iGEn8QYPwYC3uypEjJzJpxwAsyalQ672WCD\nvBNJkqTGkHWhbQF8UOPx1OqPLe4102q8JgKDQwhjQwinZZZSagSjRqVxkm22gWeftXBLklROCv1G\nylYxxukhhHVI5XtijHFk3qGkpbFgQdqdZNQouP12aNcu70SSJKmxZV26pwEb1ni8fvXHfviaDWp7\nTYxxevWfn4QQ+pLGVWot3V26dPn2/YqKCioqKpYtudQApk1Lh91UVcE//+nqtiRJ5SrEGLP75CE0\nBd4k3Ug5HXgR6BRjnFjjNQcBv4kxHhxC2B24Jca4ewhhJaBJjHF2CGFlYBBwRYxxUC1/T8zy65Dq\no39/OP106NwZfv97aNo070SSJGkZhfpemOlKd4xxQQihM6kwNwHuiTFODCGckZ6O3WOMA0IIB4UQ\n3gG+Ak6qvvwnQN8QQqzO+a/aCrdUaL7+Gi66CJ54Avr0gVat8k4kSZLylulKd2NxpVuF4o03oGNH\n2Gor6N4d1lgj70SSJKkB1Xul2+34pAYQI9x5J7RuDeeeC717W7glSdJ3Cn33EqngffYZnHYavPtu\nOmVyq63yTiRJkgqNK93SMhg6NG0BuNFGMGaMhVuSJNXOlW6pHr75Bi69FB56CO65Bw44IO9EkiSp\nkLnSLS2ll16Cn/8cpk6Fl1+2cEuSpCWzdEt1tGABXHcd7L8/XHJJulnyxz/OO5UkSSoGjpdIdfDe\ne3DCCRACjBuXZrglSZLqypVuaTFihPvvh113TTdMDh1q4ZYkSUvPlW5pET79FM44A958E4YMgR12\nyDuRJEkqVq50S7V44gk48cS0qj12rIVbkiQtG1e6pRo+/xzOOw9GjIAePWCfffJOJEmSSoEr3VK1\nAQNgu+1glVXSVoAWbkmS1FBc6VbZ++ILOP98GDYs3TTZpk3eiSRJUqlxpVtl7emn0+r2j34Er7xi\n4ZYkSdlwpVtl6csv4cILYfDgNLu93355J5IkSaXMlW6VnSefhEMOgSZN0uq2hVuSJGXNlW6VjRkz\n4Nxz0xaAd94J++6bdyJJklQuXOlWyVt4quR228EGG6TVbQu3JElqTK50q6T95z/pVMlPPoGnnoKd\nd847kSRJKkeudKskLVgAN90Eu+6aZrZffNHCLUmS8uNKt0rOK6/AqafCyivD88/DFlvknUiSJJU7\nV7pVMubMgeuvTyvbZ5wBzzxj4ZYkSYXB0q2S8MQTsM02aZX7pZfglFMghLxTSZIkJY6XqKhNmQLn\nnQevvw7du8P+++edSJIk6X+50q2iNG8eXHst7LJLenv1VQu3JEkqXK50q+g8+yycdRZsvHHalWTT\nTfNOJEmStHiWbhWNjz+Giy6C4cOha1c49FDntiVJUnFwvEQFb968tOd2y5bpRMk33oDDDrNwS5Kk\n4uFKtwrawIHpRslNNoGnn4attso7kSRJ0tKzdKsgvfMOnH8+TJwIt9wCBx/syrYkSSpejpeooPz3\nv3DJJbD77rDXXmkrwHbtLNySJKm4udKtgrBgAfzjH/DQQ7DeeumQm+bN804lSZLUMCzdylWMaW77\n4othzTXTMe677ZZ3KkmSpIZl6VZuXnopbQH4/vtw3XXwq185RiJJkkqTM91qdFOnwoknQtu2aeu/\n116D9u0t3JIkqXRZutVovvwSLr0UdtgBWrSAt95KJ0suv3zeySRJkrJl6Vbm5s6Fu+6CLbeE6dPh\n5Zfh6qthtdXyTiZJktQ4nOlWZior044kV14J22+fDrfZYYe8U0mSJDU+S7ca3IIF8K9/wRVXwKab\nQu/esMceeaeSJEnKj6VbDaaqCh5+GC6/HNZdF3r0gH32yTuVJElS/izdWmYxQr9+8Kc/QbNmcOut\nsP/+7kYiSZK0kKVb9bbwYJs//Qnmz083R3pkuyRJ0v8KMca8MyyzEEIsha+jWFRVwWOPwTXXwMYb\nw69/DYcfDk3cC0eSJJW2ei8tutKtOps3Dx54AK69Nm33d9ll6RRJy7YkSdLiWbq1RHPmwN13ww03\nwE9/Cn//O7Rp4xiJJElSXVm6tUizZqWC/be/QatW0KcP7Lpr3qkkSZKKj6Vb/+ODD+Dee6FrVzjk\nEBg+HLbeOu9UkiRJxctpXAFpJ5JRo+Coo9KpkSHA+PHpREkLtyRJ0rJxpbvMzZ2bToy89Vb44gs4\n++w0v73aanknkyRJKh1uGVimPvoIunWDO++EbbeFc8+Fgw5yJxJJkqTFcMtALVmMMHo0PPJIGhv5\n9a9hyBDYZpu8k0mSJJU2S3cZmDEDevZMYyMxwnnnwbvvwlpr5Z1MkiSpPFi6S9SCBWkV++67YfBg\nOPRQuOuutPWf+2tLkiQ1Lme6S8z776ft/nr0gHXWgVNPhU6dYPXV804mSZJU9JzpLmezZ0P//vDQ\nQzBiBBx9NPTrBzvumHcySZIkgSvdReubb2DgQHjwwfRnq1Zw8slw8MHQrFne6SRJkkpSvVe6Ld1F\npLISnnkmFe3+/dNKdseOcPjhsPbaeaeTJEkqeZbuUvg6ajNvHjz3HPTtCw8/DJttlop2hw7QvHne\n6SRJksqKM92l5NNP4amn4PHHYdAg2HJLOOYYeOEF2GSTvNNJkiRpabnSXQBihDffTCX78cfh5Zeh\nTRs45JA0o73eenknlCRJEo6XFF/p/uSTNDYyfHjaT/u//00l+5BD4Be/gBVXzDuhJEmSfsDSXehf\nx8yZqWQPG5aK9vvvw157pRXt/feH7bf30BpJkqQCZ+kutK9jYckePjy9TZmSSnZFRXrbaSdYzol6\nSZKkYlK4pTuE0Ba4BWgC3BNjvLaW19wKHAh8BZwYY3yprtdWvy7X0v3RRzBhAowfn94mTIAttoCm\nTb8r2TvvbMmWJEkqcoVZukMITYC3gH2BD4GxQMcY46QarzkQ6BxjPDiEsBvQNca4e12urfE5GqV0\nx5hWrH9YsL/5JpXqnXb67s+FpVv5GD58OBUVFXnHUIHx+0K18ftCtfH7QrUJIbSJMQ6vz7VZr722\nBN6OMU4BCCH0AtoDNYtze+B+gBjjCyGE1UMIPwE2qcO1Da6qCj78EN55J729++5378+aBXPnpmK9\n885w6qmpYG+0kfPYhcYflqqN3xeqjd8Xqo3fF1qECmB4fS7MunS3AD6o8XgqqYgv6TUt6nhtncQI\ns2enHUNmzFj0n3PmwLhxsMYasPnm6SCazTeHI4747vGaa9YngSRJkspZIU4Z12vNuHXrtApd29sm\nm8Drr8O66373ts466c/mzdNx6uuuCy1apNeuskpDf0mSJEkqZ1nPdO8OdIkxtq1+/Dsg1rwhMoTQ\nDRgWY+xd/XgSsA9pvGSx19b4HIW1dYkkSZJKUoyxXgvEWa90jwU2DyFsBEwHOgKdfvCa/sBvgN7V\nJf3zGOPHIYSZdbgWqP8XL0mSJDWGTEt3jHFBCKEzMIjvtv2bGEI4Iz0du8cYB4QQDgohvEPaMvCk\nxV2bZV5JkiQpCyVxOI4kSZJUyJrkHaCuQghtQwiTQghvhRAuWcRrbg0hvB1CeCmEsGNjZ1TjW9L3\nRQjh6BDCy9VvI0MI2+WRU42rLj8vql+3awihMoRweGPmUz7q+O9IRQhhQgjhtRDCsMbOqMZXh39H\nVgsh9K/uFq+GEE7MIaYaUQjhnhDCxyGEVxbzmqXunEVRuqsPyrkNOADYBugUQtjqB685ENgsxrgF\ncAbQrdGDqlHV5fsCmAy0jjHuAFwF3NW4KdXY6vh9sfB1fwWebtyEykMd/x1ZHfg70C7GuC3QodGD\nqlHV8efFb4DXY4w7Am2AG0MIhbj7mxrOvaTviVrVt3MWRemmxiE7McZKYOFBOTV975AdYOEhOypd\nS/y+iDGOiTF+Uf1wDGn/d5W2uvy8ADgbeASY0ZjhlJu6fF8cDfSJMU4DiDHObOSManx1+b6IwKrV\n768KfBpjnN+IGdXIYowjgVmLeUm9OmexlO5FHaCzuNdMq+U1Ki11+b6o6VTgqUwTqRAs8fsihNAc\nODTGeAf1PBtARacuPy+2BNYKIQwLIYwNIRzXaOn+f3t37CrFFYZh/HmjXmKMjbEKKqgQgoVCkAhi\noSJo/ggDtoLYpQtCCIidhVhYpUpsUmgnNiKIRQKiiFgoIdEEhBAsBEUJn8UuciPk7uyVM3N3fX4w\nxS4zw1d87Hk5c3aOhtKlL84BO5L8BdwGTvZUm1auZWVOH4/ovZDkAKM34+wbuhatCGeBxWs3Dd6C\n0Zj4BXAQWAfcTHKzqh4MW5YGdhi4VVUHk2wHribZWVXPhi5Ms2VWQvefwJZFnzeNv3v7nM0TztF8\n6dIXJNkJXACOVNVSj4s0H7r0xW7gYpIAG4Gvkryqqss91aj+demLx8DfVfUCeJHkOrALMHTPry59\ncQw4DVBVD5P8BnwO/NpLhVqJlpU5Z2V5yZtNdpIsMNoo5+3B8TLwNbzZCfNpVT3pt0z1bGJfJNkC\n/AwcraqHA9So/k3si6raNj62MlrXfdzAPfe6jCOXgH1JViX5CNgDuD/EfOvSF78DhwDG63Y/Y/Qn\nfc238P9PQZeVOWdipvtdNtnR/OrSF8C3wAbg/HhW81VVfTlc1WqtY1/855Lei1TvOo4j95NcAe4A\n/wIXquregGWrsY6/F98DPyx6fdw3VfXPQCWrB0l+BPYDnyT5AzgFLPCOmdPNcSRJkqTGZmV5iSRJ\nkjSzDN2SJElSY4ZuSZIkqTFDtyRJktSYoVuSJElqzNAtSZIkNWboliRJkhozdEuSJEmNGbolSZKk\nJSTZneR2koUk65LcTbJjqnu4I6UkSZK0tCTfAWvHx6OqOjPV9YZuSZIkaWlJ1gC/AM+BvTVliHZ5\niSRJkjTZRuBjYD3w4bQXO9MtSZIkTZDkEvATsBX4tKpOTHP96iZVSZIkSXMiyVHgZVVdTPIBcCPJ\n/qq61vkeznRLkiRJbbmmW5IkSWrM0C1JkiQ1ZuiWJEmSGjN0S5IkSY0ZuiVJkqTGDN2SJElSY4Zu\nSZIkqTFDtyRJktTYa+S1zSu6SqMfAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sympy.plot(sympy.exp(-x)*sympy.sin(x**2), (x, 0, 1));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can plot the solution to the differential equation computed above:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAt0AAAIRCAYAAACWHQE9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XeUVeXZ9/HvTRNpgqBEQBAFKSolNFGiY0EQW8QS1Kig\nEWM0ap4krzEaxViiMfrE2I29IBobRMVggSiEpiKggqAgImCvsTwI3O8fe5ARBxiG2bNP+X7WYs2c\nc/Y+59rLs/TnxbXvO8QYkSRJkpSeGlkXIEmSJBU6Q7ckSZKUMkO3JEmSlDJDtyRJkpQyQ7ckSZKU\nMkO3JEmSlDJDtyRJkpQyQ7ckSZKUsloVOSiEsDWwO9AC+Ap4GXg+xrgqxdokSZKkghDWtyNlCGEv\n4HfAlsAM4D2gLrAjsAPwAHBFjPGz9EuVJEmS8tOGQvflwNUxxrfKea0WcCBQM8b4YHolSpIkSflt\nvaH724NCaBtjXLih5yRJkiR9X0VvpCyvk/1AVRYiSZIkFar13kgZQugI7ARsEUIYXOalRiSz3ZIk\nSZI2YEOrl3QgmdtuDBxU5vnPgZPSKqoSNjwjI0mSJG2aUOkTKzjT3TfGOLmyH1INDN2SJElKW6VD\n93pnukMI54YQmqwrcIcQ9g4hHFjZD5ckSZKKwYbGS2YDj4YQvgZeBN4nmeVuD3QDngIuSbVCSZIk\nKc9taJ3uu2KMx4YQ/h/JxjjbkOxIOQd4Nsb4VfWUuUGOl0iSJCltlR4v2VCnu0cIoQVwDLDXWq9t\nThLAJUmSJK3HhkL3DcDTwPbA82WeDyTd5e1TqkuSJEkqGBVdveT6GOMp1VBPZTleIkmSpLSlu2Rg\nHiiIi5AkSVJOS2fJQEmSJEmbztAtSZIkpczQLUmSJKXM0C1JkiSlzNAtSZIkpczQLUmSJKXM0C1J\nkiSlzNAtSZIkpczQLUmSJKXM0C1JkiSlzNAtSZIkpczQLUmSJKXM0C1JkiSlzNAtSZIkpczQLUmS\nJKXM0C1JkiSlzNAtSZIkpczQLUmSJKXM0C1JkiSlzNAtSZIkpczQLUmSJKXM0C1JkiSlzNAtSZIk\npczQLUmSJKXM0C1JkiSlzNAtSZIkpczQLUmSJKXM0C1JkiSlzNAtSZIkpczQLUmSJKXM0C1JkiSl\nzNAtSZIkpczQLUmSJKXM0C1JkiSlzNAtSZIkpczQLUmSJKXM0C1JkiSlzNAtSZIkpczQLUmSJKXM\n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\nW7MkSZJyXM+e8PzzcMwx0L8/jBqVbCOfq9K+kbIm8BrJjZTLgGnAUTHGOWsdtwWwAGgVY/yq9Ll6\nQI0Y439DCPWBccAFMcZx5XyON1JKkiQVoZUrYcQIuP12uP9+6Ns31Y/LzRspY4wrgdNIAvMrwKgY\n45wQwskhhOFlDv0x8K/VgbtUc2BiCGEGMAX4Z3mBW5IkScWrZk248EK47jo45JDkZy72Yt0GXpIk\nSQXh9ddh8OBk3vuGG6BevSr/iNzsdEuSJEnVpV07mDIl6XT37QtvvJF1RWsYuiVJklQw6tWDO++E\n4cOT4P3Pf2ZdUcLxEkmSJBWkyZPhyCNh6NDkZsuaNTf5LSs9XmLoliRJUsF69134yU9gs81g5Eho\n2nST3s6ZbkmSJGltzZvDU09Bly7Qowe88EI2dRi6JUmSVNBq1YLLL4e//AUGDoRbbqn+GhwvkSRJ\nUtGYOzdZVnD33eHqq6Fu3Y063fESSZIkaUM6doSpU+HTT6FfP1i0qHo+19AtSZKkotKwIdx3Hxx9\nNPTuDf/6V/qf6XiJJEmSita//w1HHQW/+AX8/vdQY/0taZcMLITrkCRJUvVbsiRZz7tp02RjncaN\n13moM92SJElSZbRsCePHw3bbQc+eMGtW1X+GoVuSJElFr04d+Nvf4I9/hH32gbvvrtr3d7xEkiRJ\nKmP27GRZwQED4Mork0BeyvESSZIkqSrssgtMnw6LF8OeeyYz35vK0C1JkiStpXFjePhhOPhg6NUL\nJkzYtPdzvESSJElajyefhGOPhXfecclAQ7ckSZJS89Zb0Lq1odvQLUmSpLR5I6UkSZKUqwzdkiRJ\nUsoM3ZIkSVLKDN2SJElSygzdkiRJUsoM3ZIkSVLKDN2SJElSygzdkiRJUsoM3ZIkSVLKDN2SJElS\nygzdkiRJUsoM3ZIkSVLKDN2SJElSygzdkiRJUsoM3ZIkSVLKDN2SJElSygzdkiRJUsoM3ZIkSVLK\nDN2SJElSygzdkiRJUsoM3ZIkSVLKDN2SJElSygzdkiRJUsoM3ZIkSVLKDN2SJElSygzdkiRJUsoM\n3ZIkSVLKDN2SJElSygzdkiRJUsoM3ZIkSVLKDN2SJElSygzdkiRJUsoM3ZIkSVLKDN2SJElSygzd\nkiRJUsoM3ZIkSVLKDN2SJElSygzdkiRJUsoM3ZIkSVLKDN2SJElSygzdkiRJUsoM3ZIkSVLKDN2S\nJElSygzdkiRJUspSD90hhIEhhLkhhHkhhLPKef03IYQZIYQXQwizQwgrQgiNK3KuJEmSlA9CjDG9\nNw+hBjAP2AdYCkwHhsQY567j+AOBM2OM+27MuSGEmOZ1SJIkSUCo7Ilpd7p7A/NjjItijN8Ao4BD\n1nP8UcC9lTxXkiRJyklph+6WwOIyj98ufe57QgibAwOBBzf2XEmSJCmX5dKNlAcBE2OMn2RdiCRJ\nklSVaqX8/kuA1mUetyp9rjxDWDNasrHnEkK4oMzDCTHG/9++HZsoFAVRAL2PLcAGLGrTrcDEigQL\n0cjYBsTE1BKMZAy+JgYLPxgQOSd9MzDhZXhzmDUpAAA06T6k/ElyznQMeU1yTPJXVae3ukWSS5Jl\nVd3m9AIAwKdr3XRX1X2MsU6yz/SVZVtVpzHGanquzbP0N8nuFbj/6+2cFwAAOrRuugEAgM86pAQA\ngK8kdAMAQDOhGwAAmgndAADQTOgGAIBmQjcAADQTugEAoJnQDQAAzR7/Cpcx8mldmwAAAABJRU5E\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sympy.plot(ode_solution.rhs, xlim=(0, 1), ylim=(0.7, 1.05));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This can be *visually* compared to the previous result. However, we would often like a more precise comparison, which requires numerically evaluating the solution to the ODE at specific points." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## lambdify" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At the end of a symbolic calculation using `sympy` we will have a result that is often long and complex, and that is needed in another part of another code. We could type the appropriate expression in by hand, but this is tedious and error prone. A better way is to make the computer do it.\n", "\n", "The example we use here is the solution to the ODE above. We have solved it symbolically, and the result is straightforward. We can also solve it numerically using `scipy`. We want to compare the two.\n", "\n", "First, let us compute the `scipy` numerical result:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from numpy import exp\n", "from scipy.integrate import odeint\n", "import numpy\n", "\n", "def dydt(y, t):\n", " \"\"\"\n", " Defining the ODE dy/dt = e^{-t} - y.\n", " \n", " Parameters\n", " ----------\n", " \n", " y : real\n", " The value of y at time t (the current numerical approximation)\n", " t : real\n", " The current time t\n", " \n", " Returns\n", " -------\n", " \n", " dydt : real\n", " The RHS function defining the ODE.\n", " \"\"\"\n", " \n", " return exp(-t) - y\n", "\n", "t_scipy = numpy.linspace(0.0, 1.0)\n", "y0 = [1.0]\n", "\n", "y_scipy = odeint(dydt, y0, t_scipy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We want to evaluate our `sympy` solution at the same points as our `scipy` solution, in order to do a direct comparison. In order to do that, we want to construct a function that computes our `sympy` solution, without typing it in. That is what `lambdify` is for: it creates a function from a sympy expression.\n", "\n", "First let us get the expression explicitly:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFoAAAAYBAMAAACIFvdWAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIma7zZnddlTvRIkQ\nqzLsm4+cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABeUlEQVQ4EWNgIB6wPCBeLQPD+QOkqG4jRbFo\nShwDA6MCdi2KGMIeQBFhDFGIAK8AusRHoIAjAwNPIpoExxygoANcsNkYCA5wTWBgYApgYOD4AJHg\nKIDQZ2P/ABnb4aohDPYLBxnYBBgYWB0gfJhqBnaQ6pMQQTjJWrCBQQzIY9sAEUJVzbIArhDM4Lr+\ngKGUgWGtvS3ECaiqWQNAik6XByJpMgKy+6F8VNVMDkBhrkQGaagsiMoA4hAoH1U1RwJQWLKBBxgn\ncDALyMoG8bhdXNymuLhcALHBvuT7AGTdVC86ABKBAqBqnl9QNqrZYNV/YeogNNAlXB8YDoA5qKq5\nEoCCv8EScALoS24HjgdgPqpqJgeg4Gygs8ByEGIrMHIuHIewUVWzbgCKljDwIIfgMmAqNFJAVc16\n88slBgZwVmEPV4LIQUhQzMMA3GywACiW0QEoVcEAD5JOzFQFVmUIU4tGI6VYJBlcuYEZxSKYBkYF\nGAuVxsxpDAwAkL5H0/W7iQ4AAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left(t + 1\\right) e^{- t}$$" ], "text/plain": [ " -t\n", "(t + 1)⋅ℯ " ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ode_expression = ode_solution.rhs\n", "ode_expression" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then we construct the function using `lambdify`:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sympy.utilities.lambdify import lambdify\n", "\n", "ode_function = lambdify((t,), ode_expression, modules='numpy')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first argument to `lambdify` is a tuple containing the arguments of the function to be created. In this case that's just `t`, the time(s) at which we want to evaluate the expression. The second argument to `lambdify` is the expression that we want converted into a function. The third argument, which is optional, tells `lambdify` that where possible it should use `numpy` functions. This means that we call the function using `numpy` arrays, it will calculate using `numpy` array expressions, doing the whole calculation in a single call.\n", "\n", "We now have a function that we can directly call:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sympy solution at t=0: 1.0\n", "sympy solution at t=0.5: 0.9097959895689501\n" ] } ], "source": [ "print(\"sympy solution at t=0: {}\".format(ode_function(0.0)))\n", "print(\"sympy solution at t=0.5: {}\".format(ode_function(0.5)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we can directly apply this function to the times at which the `scipy` solution is constructed, for comparison:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [], "source": [ "y_sympy = ode_function(t_scipy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can use `matplotlib` to plot both on the same figure:" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n3pIkSVIB/wu1ZHHOUURaMAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib import pyplot\n", "pyplot.plot(t_scipy, y_scipy[:,0], 'b-', label='scipy')\n", "pyplot.plot(t_scipy, y_sympy, 'k--', label='sympy')\n", "pyplot.xlabel(r'$t$')\n", "pyplot.ylabel(r'$y$')\n", "pyplot.legend(loc='upper right')\n", "pyplot.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see good visual agreement everywhere. But how accurate is it?\n", "\n", "Now that we have `numpy` arrays explicitly containing the solutions, we can manipulate these to see the differences between solutions:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nwi1JkiSN6J+2JGttmR834gAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pyplot.semilogy(t_scipy, numpy.abs(y_scipy[:,0]-y_sympy))\n", "pyplot.xlabel(r'$t$')\n", "pyplot.ylabel('Difference in solutions');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The accuracy is around $10^{-8}$ everywhere - by modifying the accuracy of the `scipy` solver this can be made more accurate (if needed) or less (if the calculation takes too long and high accuracy is not required)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Further reading" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`sympy` has [detailed documentation](http://docs.sympy.org/latest/index.html) and a [useful tutorial](http://docs.sympy.org/dev/tutorial/index.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise : systematic ODE solving" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We are interested in the solution of\n", "\n", "$$ \\frac{\\text{d} y}{\\text{d} t} = e^{-t} - y^n, \\qquad y(0) = 1, $$\n", "\n", "where $n > 1$ is an integer. The \"minor\" change from the above examples mean that `sympy` can only give the solution as a power series." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 1\n", "\n", "Compute the general solution as a power series for $n = 2$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 2\n", "\n", "Investigate the help for the `dsolve` function to straightforwardly impose the initial condition $y(0) = 1$ using the `ics` argument. Using this, compute the specific solutions that satisfy the ODE for $n = 2, \\dots, 10$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 3\n", "\n", "Using the `removeO` command, plot each of these solutions for $t \\in [0, 1]$." ] } ], "metadata": { "kernelspec": { "display_name": "Python [default]", "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.5.2" }, "nbconvert": { "title": "Symbolic Python" } }, "nbformat": 4, "nbformat_minor": 0 }