{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Intro to sympy: \n", "+ #### variables\n", "+ #### differentiation \n", "+ #### integration\n", "+ #### evaluation of symbolic expressions" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sympy as sym\n", "sym.init_printing() # for LaTeX formatted output\n", "\n", "import scipy as sp\n", "\n", "import matplotlib as mpl # As of July 2017 Bucknell computers use v. 2.x \n", "import matplotlib.pyplot as plt\n", "\n", "# Following is an Ipython magic command that puts figures in the notebook.\n", "# For figures in separate windows, comment out following line and uncomment\n", "# the next line\n", "# Must come before defaults are changed.\n", "%matplotlib notebook\n", "#%matplotlib\n", "\n", "# As of Aug. 2017 reverting to 1.x defaults.\n", "# In 2.x text.ustex requires dvipng, texlive-latex-extra, and texlive-fonts-recommended, \n", "# which don't seem to be universal\n", "# See https://stackoverflow.com/questions/38906356/error-running-matplotlib-in-latex-type1cm?\n", "mpl.style.use('classic')\n", " \n", "# M.L. modifications of matplotlib defaults using syntax of v.2.0 \n", "# More info at http://matplotlib.org/2.0.0/users/deflt_style_changes.html\n", "# Changes can also be put in matplotlibrc file, or effected using mpl.rcParams[]\n", "plt.rc('figure', figsize = (6, 4.5)) # Reduces overall size of figures\n", "plt.rc('axes', labelsize=16, titlesize=14)\n", "plt.rc('figure', autolayout = True) # Adjusts supblot parameters for new size" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "NOTES\n", "- Sympy functions, and variables, and even floats aren't the same as numpy/scipy/python analogues. For example\n", " + sym.exp != sp.exp\n", "\n", "- Sympy has some math functions included, but not full numpy/scipy, as demonstrated in the following cells.\n", "\n", "- Symbols that are going to used as symbolic variable must be declared as such. This is different than in Mathematica. \n", "\n", "- One consequence is that sympy symbolic expressions must be turned into scipy/numpy/python expressions if they are to be evaluated for plotting or numerical results. This is done with the `lambdify` command.\n", "\n", "- In fall 2016 we're using sympy 1.0. Documentation and tutorial can be found at http://docs.sympy.org/latest/\n", "\n", "- ML's conclusion as of 9/17/16: Don't mix `sympy` and `scipy/numpy`. Do symbolic work with `sympy`, and then switch by \"lambdifying\" symbolic exressions, turning them into python functions. \n", "\n", "- sympy does have it's own plotting capabilities for symbolic expressions (matplotlib is a back-end). ML hasn't explored this very deeply; so far just using matplotlib on \"lambdified\" expressions. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Symbolic variables" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Given the way I imported things, the following cell doesn't work." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'exp' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mexp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m3.\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'exp' is not defined" ] } ], "source": [ "exp(3.)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "This does work." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAAPBAMAAACRq9klAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC20lEQVQ4Ea2Tz2tUVxzFP29m3vzKZDJkI9VF\np6GagkhSRRFBGLpw4ca3sWAtzDAotmpNSEsGWzGDy7owgQb8sTBduegis6h2U5q0+GOh4MOF0E3n\nrSpCUFOJ0Yb4PPf7EvEP8MKc896595z53nu/D29gRw1/8FENDWP/3libnluZbfB78FnIhtZeTbXu\nuGXjFcywJjrPl3c+gf3NVmvUgM/JvaQn9H92k8Yp+IZCHI/C1XgZr0o34nA71eFQ5E0lhkTk7wCq\nZEOexnHcMOAoXOIx/KC8hP+BTfSM/6n3305WKK3SN8N20sN8Dc3EYKLfHAnojfA6fATZBLgMI7Vd\n0NWfYfwtfKFpNxr65S9S7+QX3esKTCQGE+F+QG4Yfwbt5rsEmAsU+AIuhHIYX9jJ2XcCJXej9KTI\nf66ImhlMtMD88yAX6TU/vw4we/A/BUrwjbPxo4jsk79qcGrhYyRfo+/XMzr6K6qwLWE2MNECGXl9\nVhLpt0B+2VuGA6OwxhMrAenAewk7+bCN9/1m6n9QCLVf5iIVo+VOTAJz8XWXZakGFBueKrNA496v\nZi+6JXscpGcEp9v1JVLT9Mz3ToTIIE1iEvjwx1d68p9JMoCBta1KsC3/S+mV9sRQRZByt1GY1j2X\nVfHCzYmaM7hRmLbAcoP7eip1JBlQqtpldEMpupRuOKVywxPuuLIdNalXIb1a7FB+rQWoUZzBRAss\nVMisquphTRrwQLM74GkgxfHBZ+qpSOc/FBQ6pJb6lhSYnbQK4QZmMNEC67KdgnpDbJCpUqqosbdK\ncI29FVWYrlThF/TNFDuFYYqLGZ3hJI8rmUXMYOJ6hXyqPcmQwMbW2HGKof+T2jfh8wEL9FOewqsq\noxzRnecYh0LuBocjzJCIrrHz1ynP66SqrMFcHP+Pf+Z2zV2ecaY5pl4ZbOoM+sfVHOcGdkNu4IgD\nNaMZEnHL1RsR+wYl8kG4DuL3Ot4AGOEOFpTP2KIAAAAASUVORK5CYII=\n", "text/latex": [ "$$20.0855369231877$$" ], "text/plain": [ "20.0855369231877" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.exp(3.)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "And, as in Mathematica, the output of the following cell will be symbolic." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABIAAAAUBAMAAAByuXB5AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEIl2mSJE3e9UMqtm\nzbsXyEShAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAdElEQVQIHWNgAANlbwEIg+UAywMoS4HnA4TF\nwAATY2CQWAAVY74Mk0SSZf0JEZRYwPoHwmIPYG6EsLiUtQMYGBiVTYAkCKQHsCqAGaydDCILwCzu\nHuODYAYD/wYIzcDArwBjcQBZBmAO8wUGEagpJjYHwEIAd/kS1XC+T58AAAAASUVORK5CYII=\n", "text/latex": [ "$$e^{3}$$" ], "text/plain": [ " 3\n", "ℯ " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.exp(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The analogue of Mathematica's `Exp[3]//N`, or `N[Exp[3]]`, is" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAAPBAMAAACRq9klAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC20lEQVQ4Ea2Tz2tUVxzFP29m3vzKZDJkI9VF\np6GagkhSRRFBGLpw4ca3sWAtzDAotmpNSEsGWzGDy7owgQb8sTBduegis6h2U5q0+GOh4MOF0E3n\nrSpCUFOJ0Yb4PPf7EvEP8MKc896595z53nu/D29gRw1/8FENDWP/3libnluZbfB78FnIhtZeTbXu\nuGXjFcywJjrPl3c+gf3NVmvUgM/JvaQn9H92k8Yp+IZCHI/C1XgZr0o34nA71eFQ5E0lhkTk7wCq\nZEOexnHcMOAoXOIx/KC8hP+BTfSM/6n3305WKK3SN8N20sN8Dc3EYKLfHAnojfA6fATZBLgMI7Vd\n0NWfYfwtfKFpNxr65S9S7+QX3esKTCQGE+F+QG4Yfwbt5rsEmAsU+AIuhHIYX9jJ2XcCJXej9KTI\nf66ImhlMtMD88yAX6TU/vw4we/A/BUrwjbPxo4jsk79qcGrhYyRfo+/XMzr6K6qwLWE2MNECGXl9\nVhLpt0B+2VuGA6OwxhMrAenAewk7+bCN9/1m6n9QCLVf5iIVo+VOTAJz8XWXZakGFBueKrNA496v\nZi+6JXscpGcEp9v1JVLT9Mz3ToTIIE1iEvjwx1d68p9JMoCBta1KsC3/S+mV9sRQRZByt1GY1j2X\nVfHCzYmaM7hRmLbAcoP7eip1JBlQqtpldEMpupRuOKVywxPuuLIdNalXIb1a7FB+rQWoUZzBRAss\nVMisquphTRrwQLM74GkgxfHBZ+qpSOc/FBQ6pJb6lhSYnbQK4QZmMNEC67KdgnpDbJCpUqqosbdK\ncI29FVWYrlThF/TNFDuFYYqLGZ3hJI8rmUXMYOJ6hXyqPcmQwMbW2HGKof+T2jfh8wEL9FOewqsq\noxzRnecYh0LuBocjzJCIrrHz1ynP66SqrMFcHP+Pf+Z2zV2ecaY5pl4ZbOoM+sfVHOcGdkNu4IgD\nNaMZEnHL1RsR+wYl8kG4DuL3Ot4AGOEOFpTP2KIAAAAASUVORK5CYII=\n", "text/latex": [ "$$20.0855369231877$$" ], "text/plain": [ "20.0855369231877" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.exp(3).evalf() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The analogue of Mathematica's \"slash-dot using\" syntax `Exp[x]/.x->3` is" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'x' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msym\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'x' is not defined" ] } ], "source": [ "sym.exp(x).subs({x:3})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Oops! This is an example of not having declared `x` to be a symbolic variable. Let's try again.\n", "\n", "In sympy, variables that are going to be used as algebraic symbols must be declared as such. Here's an example of a simple declaration:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAAPBAMAAACRq9klAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC20lEQVQ4Ea2Tz2tUVxzFP29m3vzKZDJkI9VF\np6GagkhSRRFBGLpw4ca3sWAtzDAotmpNSEsGWzGDy7owgQb8sTBduegis6h2U5q0+GOh4MOF0E3n\nrSpCUFOJ0Yb4PPf7EvEP8MKc896595z53nu/D29gRw1/8FENDWP/3libnluZbfB78FnIhtZeTbXu\nuGXjFcywJjrPl3c+gf3NVmvUgM/JvaQn9H92k8Yp+IZCHI/C1XgZr0o34nA71eFQ5E0lhkTk7wCq\nZEOexnHcMOAoXOIx/KC8hP+BTfSM/6n3305WKK3SN8N20sN8Dc3EYKLfHAnojfA6fATZBLgMI7Vd\n0NWfYfwtfKFpNxr65S9S7+QX3esKTCQGE+F+QG4Yfwbt5rsEmAsU+AIuhHIYX9jJ2XcCJXej9KTI\nf66ImhlMtMD88yAX6TU/vw4we/A/BUrwjbPxo4jsk79qcGrhYyRfo+/XMzr6K6qwLWE2MNECGXl9\nVhLpt0B+2VuGA6OwxhMrAenAewk7+bCN9/1m6n9QCLVf5iIVo+VOTAJz8XWXZakGFBueKrNA496v\nZi+6JXscpGcEp9v1JVLT9Mz3ToTIIE1iEvjwx1d68p9JMoCBta1KsC3/S+mV9sRQRZByt1GY1j2X\nVfHCzYmaM7hRmLbAcoP7eip1JBlQqtpldEMpupRuOKVywxPuuLIdNalXIb1a7FB+rQWoUZzBRAss\nVMisquphTRrwQLM74GkgxfHBZ+qpSOc/FBQ6pJb6lhSYnbQK4QZmMNEC67KdgnpDbJCpUqqosbdK\ncI29FVWYrlThF/TNFDuFYYqLGZ3hJI8rmUXMYOJ6hXyqPcmQwMbW2HGKof+T2jfh8wEL9FOewqsq\noxzRnecYh0LuBocjzJCIrrHz1ynP66SqrMFcHP+Pf+Z2zV2ecaY5pl4ZbOoM+sfVHOcGdkNu4IgD\nNaMZEnHL1RsR+wYl8kG4DuL3Ot4AGOEOFpTP2KIAAAAASUVORK5CYII=\n", "text/latex": [ "$$20.0855369231877$$" ], "text/plain": [ "20.0855369231877" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = sym.symbols('x')\n", "sym.exp(x).subs({x:3.})" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "sympy.core.symbol.Symbol" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can control, to some degree, assumptions about the symbolic variables. (As of sympy 1.0, this is still a work in progress for sophisticated assumptions.)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = sym.symbols('y',negative=True)\n", "(4 - y).is_positive" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The variable name used in python code, and the output representation do not have be the same. Here's\n", "a built-in example:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEAAAAAUBAMAAADPWCYMAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIma7zZnddlTvRIky\nqxACMlz2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABA0lEQVQoFWNgYFRgwAmYBIBSwjilgRIXgdgR\nn4InDAxMAfgUcBcwsIGswQn4JjCI4ZQES3gxlALp+v///39FV8i3vRRo+FYGIwYG7j3tQoUYNi0T\nYNzAwKDCkMHAcIJhI/sBdAMYZzA8BQq2McwCyRjwPgBRyIB3UrkekH8erIDnAhuyHJjNfwFMnQdZ\nwcCqwP8AzEUi+IEOAIJlIEcyvH/AvwDEQwacQAUFIEduBYqWMQC5fF+Q5RnYHRieCjAwRAPNYACa\nwgtUn/YARUVpkQKQ74MU1BxADeiAMQEpsrjRZYF8YGQxGMLEn8MYSDQwuhEJRgFJAsYE6WZUABI4\nADDJAQAVUC6EvuyBIQAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left ( \\pi, \\quad e\\right )$$" ], "text/plain": [ "(π, ℯ)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.pi, sym.E" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nKvxT9i+/lDmd6v9KpQAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left ( 3.14159265358979, \\quad 2.71828182845905\\right )$$" ], "text/plain": [ "(3.14159265358979, 2.71828182845905)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.pi.evalf(), sym.E.evalf()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sympy knows how to convert some standard variables to LaTeX output:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOBAMAAAAGUYvhAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAu92rRCIy72bNVImZ\nEHbJKPYwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAYElEQVQIHWOQVzY2FvrvwBD/lYGBIb2BgeMn\nkObawMAgD8QMBxgYrn8D0guAYp+ANAjYHwBTDNdBCoAgB0KxGgDpBwwMF4EU7wEGXlkgzbeBgTkA\nyH3fwHC+vLz8/38HAPbRF7b4ABMgAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\Sigma$$" ], "text/plain": [ "Σ" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Sigma = sym.symbols('Sigma')\n", "Sigma" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But you can be more creative:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAE4AAAAXBAMAAABXBWQRAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIma7zZnddlTvRImr\nMhBQc+7aAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABZklEQVQoFa1SPUjDQBh9SbEttA0FxUkwQ3er\ng6OtqyB0d2hHB9EuTg7q4uKgCA7RoZ262qW74hqwi4NTC1WkkyhasCLx3RcvxFTFwW/43s+9u0u4\nD/i3Omv/7ahyV3KGLfBzO4aZ5eo4YgPXvdwYRpOFNded9+qZR+CCa4swPOYzR9HcNAO4sVN54BYw\nS8BMkc5+NGc+00k2420gVUWcZ8Xe6IxFcyg0aZUm2KxDTCqocU9yJNd/p7VjKH8JmwoOKqpHKzkI\nnBbmFE+/BE6YXJW0ymFVUetUG1+wrz5Qag8nCjPBRt/+7NeB6vi5KRqJwNTEOCeriurIvVae4k6M\ncOtRWP5NDfmPXpfOVjiiuLXAlmiKnUOLqJ7v/gkPRfF0S2eZ3bZFrqDBl3h1nJo3RHxdRwTLjuN4\nXl34srybXt7VJIpGReZA2/63aBVCzgFmA21RfV+cK86pLlOTEVRnGTbb78W5/wC5dUk/3SFOxgAA\nAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left ( \\Sigma, \\quad \\Sigma^{\\prime}\\right )$$" ], "text/plain": [ "(Σ, \\Sigma__{\\prime})" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sigma, sigma_p = sym.symbols('Sigma, \\Sigma^{\\prime}')\n", "sigma, sigma_p" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are other shorter ways to declare symbolic variables, but you lose some of the flexibility demonstrated above. You can import directly from a set of common symbols in the \n", "following way:\n", "- `from sympy.abc import w`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Integration" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's evaluate the following integral:\n", "\n", "$$ \\int\\left[\\sin(x y) + \\cos(y z)\\right]\\, dx $$" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x,y,z = sym.symbols('x,y,z')" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "f = sym.sin(x*y) + sym.cos(y*z) # scipy trig functions won't work!" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$x \\cos{\\left (y z \\right )} + \\begin{cases} 0 & \\text{for}\\: y = 0 \\\\- \\frac{1}{y} \\cos{\\left (x y \\right )} & \\text{otherwise} \\end{cases}$$" ], "text/plain": [ " ⎛⎧ 0 for y = 0⎞\n", " ⎜⎪ ⎟\n", "x⋅cos(y⋅z) + ⎜⎨-cos(x⋅y) ⎟\n", " ⎜⎪────────── otherwise⎟\n", " ⎝⎩ y ⎠" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.integrate(f,x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's make it a definite integral:\n", "\n", "$$ \\int_{-1}^1\\left[\\sin(x y) + \\cos(y z)\\right]\\, dx $$" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFAAAAAUBAMAAADo9qfkAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABt0lEQVQoFXWTPWhTcRTFf695zz7TJAbFIZke\n7dBBh4jgVEqgm0sCgg4KxoJYWmhjlha6ZBNDhwotpNUhbi5qhA4Fh8QsIogEB6FFMFuHZugXtIiY\nnn/T1jxJDtz7zjn38t79fzzoAavRUYhEwRq8meywzumVc2bII7hL/5HPOxUffOZ9eAwrPq8tIp7P\n7K+yCjNJn3kigpqqA84ilXTXxnhHl6HrJr1PgzOcq3Pv6xz2t2ZZXk3x4DrWMoWi3YCctHuoFKvb\nL+zXBKp3oCQ9qshuENpxRmpD4tuKYEbpI+GDYBb74HmaqvRbbVz9GoGEg5WQ3lQMKpw9pVQdDoP7\nn0QpyuMVl6owpslIQcjT0/2j9CsP+858yxhqxN0llcTNiJrG71jRf2/cu0rEHIA+TV+ZL/DD9FHA\n9ghFzYyEL3q4Rz9hWgWzmECGW4Q9LohvE5/NTYrEGjy1lxjIbqS5IW22oy/h/uX2VvON+DCVVuu3\niDP+Ocrl2QmeNbfy0gXjPant4kVeGr2m6Ir2EWrKNqxS1y6Z5lJM8TB/Wtel6AUN+o6Rs6quWS/o\n4i7UkmdVs74e+P9XOAbg2mQ9baVdmAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$2 \\cos{\\left (y z \\right )}$$" ], "text/plain": [ "2⋅cos(y⋅z)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.integrate(f,(x,-1,1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now a 2-d integral with infinity as a limit:\n", "\n", "$$ \\int_{-\\infty}^\\infty\\int_{-\\infty}^\\infty e^{-x^2-y^2}\\, dxdy $$" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAJBAMAAAD0ltBnAAAALVBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAdpmJMlQiZrurEN1E71u8\n6TcAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAA+SURBVAgdY2CQe/fu3SMGZpPAdLEEBlcGM0YHBiBo\n4FwAJFkmcIM4TAV8IN66BXwHgJQ0A68BkGpn4DRgAADO5AwIf9stDwAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\pi$$" ], "text/plain": [ "π" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.integrate(sym.exp(-x**2 - y**2), \\\n", " (x, -sym.oo, sym.oo), (y, -sym.oo, sym.oo))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Differentiation" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x,y,z = sym.symbols('x,y,z')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": true }, "outputs": [], "source": [ "g = sym.cos(x)**2" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJMAAAAUBAMAAAB7fhJGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiKZu6uJRO92\nVGZ6zyUAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACk0lEQVQ4EZ1UTWgTQRT+9s9ttkm6FMEWe1iK\nIughQelNae4qXakoWNAcpNCL5CJeiolIPUgxUTDQIhrwJAq2qCB62QoWC6FGRC8KLoqCUGrFkv6g\nxPeS3dldrEV8MDPf972Zt+/NzgywuWluy5+0N5530pM/h9za8LmMRw86gX7ch2M+iIxazqNtoU91\nIbbuyQOlYPpOH3b6IDLKfgTJCvQLwNOA+SiZ9VHM8VF4/CLIDYHwAChmAuohxf8qpKk/nCT0CXG7\nQEiZItTRjJAHBcLuAAqkpQWUKwIS6DeBQ4vPtHxB3XO6Os6uWWo9L07MOUCZoDRSrqG7Ogl1fsEi\nHs+SVh27R9XFCAoz1kjPQYFcgDKKU1zbeZJKyf2KBXwkOlRTH6l90J1tACeku0A3Pjl7gaSFwJQC\nYEwjDr0AfQodLrkO0OfM2PcEhX1NtBeJZaUEdfmuCYe4UgOu4pb5Bkik0bmPbQfpw9TQP2o3Q1no\ncIg+oawg59gzQLDOIy1fU1aes9ZeAUzsYqgucd8yrpvSTdWboXIiFFqIQxk/acaHCrAiXWtkCXMo\ngNVIqLfQbGgmvlW4QC8UFUh5ZLi/HcqqfgRJPtBcIJXLbiPNfdPULOI2Eg7a3FAo2vaE+RJxs7Xt\nvUTbszDW3wNXaJnuAq/iS5iJbPvgRPkiTZyGblNKflZ0Au7X8uBLO0JtyMV19SHk0jsTZ4nTCTB+\n6Ut857eUiLcs1Wj8oDRvzk+qxdWtxdXD+cfkoKq6qj1nXIL8Z6RLczaOTVzGnYWvFeJUlTQ+M7tI\nUM5Qt5kFFyd0sEMLgosTuhchfwj+13UOrQ9D3pGmbfzI6LbnliwP/H0QT5+IGZkrnj4RM+KOEP45\nbP/wIP8Gj66hMBv7/+gAAAAASUVORK5CYII=\n", "text/latex": [ "$$- 2 \\sin{\\left (x \\right )} \\cos{\\left (x \\right )}$$" ], "text/plain": [ "-2⋅sin(x)⋅cos(x)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.diff(g,x) # First derivative (or sym.diff(g,x,1))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAL4AAAAcBAMAAAAtjhhLAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADFklEQVRIDa1VTWgTQRT+trtp0k2aLOipBxuL\n4sEKweKt0BxbUbqItEgPjYgXqSQWtB6K5iB6URqECgpKFUXQQwOK4kG6FIqIRaogeBGjB0EPNYpW\nEUt8b3d2M7vdtBX6IDPf+973vczO7A/QKEZ3m41KYfx/yhE1msthfRpw65D3+qy6oX3zEasnoXJL\n9mgZOYNeVH77iNWTUPl52RMPbnfrT7m8Jg6RRyuSq1PCNtQte9oi+A9ibjSFye8ASkdXli2KWG2f\nxRnHqD0q7rY1G3becAiTzwIDiNr7HE07zv6C6JB0iLjbNlIWhfApVN4OHAWusqNlIeC7gHPMfPTo\ncQ+FgVC5XsE1IJ8lQ7/pd2lP3+1h5qZHH/JQCAiXN2UwYzr9PwvT5qwDWmq1KiFlyklpjBc9uBKE\nyxMlVk7z0nfSb9/iC6Unpz3ZNj/CPEciDUTmD1+kzXFPyOZpODC2C5HxZ0W2uVxAHuObJvaLq13U\nJwMd8Rz0brQbwqFWgEF8se4DybLgnEm5jj5jr4Fu2xYu134Qr+e4+Ij+aBIJqDmoJaQqRHHoC8BJ\nnDVfAa1TNuMO8TLeZ+/SwfWyTURAbr8COuzaLRqnuw2o1L+MlEUpR0sRMPGAoValYegex0NCw2mi\nloFUgW0iAnKF6rxlFLR+DM58h0r9M/7+wF8qOv0ZODFh0SXRo5PKsE0E95fkvP7XUPjvqb9i4mtR\n9ffnC4a9jYhNEayHt/6tbBN8QE6vYC2NBPc/Qqux0FxR/f35fN8kqphbcb60/1i4DExcYhucCMjp\n/mkbGz3GtefUfxKqQZsj7w/dlLFltapUgKaC00OMyg36BvVl8di2CTIgT5YwU6v94eKEidiZl6e1\n/NLB/NL+nivCQJsSGZmbXaQ0nhWcmAY6T0DZcarINrcSkNPz64ZzMm5Wn+vvh7Y62Rj55XHLUwau\n3uPX+34TBr982PT6aCUP+oBqiHSN97NQ+eWfpFbHJSxB7/viOaXiSuiX35YEQxKW4Xq/j8Ijy5MF\nqVFrWko2Bm7ytXnryzYi2b4RTVbv8Q+tj9hdpD5SrAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$2 \\left(\\sin^{2}{\\left (x \\right )} - \\cos^{2}{\\left (x \\right )}\\right)$$" ], "text/plain": [ " ⎛ 2 2 ⎞\n", "2⋅⎝sin (x) - cos (x)⎠" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.diff(g,x,2) # Higher order derivative (or sym.diff(g,x,x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Evaluate \n", "$$\\frac{\\partial^3}{\\partial^2x\\partial y} e^{xyz}$$" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJ8AAAAZBAMAAADd3OEWAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHaZIu+JVM27RDKr\nZt2dj8xZAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC/ElEQVQ4EaVVTWgTQRh9m2z+dtN0kVoQCqYJ\nij2oofXQ4sH1UEWxpQqKKEhsQT34E63iRSGejCI01lOhh6WHIljaIPTgQRuLFkHQULXgQemhhVIp\nRikK9Sd+O/s3u81ByAeZ+d57M293vpmdAFz0PVA4VHsaVKPZ2l04h5gqr3Kw9jSmiWu1u7gcQt9c\n8D9BMPn4tXQeMUVcatDcc2JxhrvcbFX03mGbo9nlYL0yCf/NXodlWR9rxbyH9kCxbaiAqGqzhXAJ\ne8fRAggZm2RJXYp1YdVNe1ETgmsQsg5drwIzmAYOOhzLRvFI7995aBteMbLnwFGAW90UCljGSYia\n7DrI8u3r9/UpC7aDJzENTwFvC9hoiWL5ItL4IpVx6OxHi2R9oFIpUyLOu1gOmIYDim4Y1kxFmB7d\nqmCsJYv45C2qYzKOTgXjJ+SSOcBHlRQSL0Z6saEV4mFIi9pTQzINCXxVEKRhQGNiF9MENWLOD4Z6\nsBPCYLKDCdToSiM+x5eQvgZfGZsSbXlDsw2lH0BdlkhpAfuYFk0/NMZgvz+LIQhwzkosA5zGJeWq\nmGlHJA8FB8yxtmGsCITmAXRmhN3UkfNcmvWAEojjO+VPFJNAQCMWd2jdOIL6OCCzrTqXyy3mcveg\nRxv95DI1L2e32/N0QY8JVf5FTygyoDcBjRr2EGkVUwVgTMd6WG+oV9kw/M14d9MOXw9wwyH1JUN/\nCKgaW2htRUuzDPshqpDmiaZarothRIoIpRC1FH1TLtNmNOvCMNAPFA3NNJRT8KnGphwDfIbmtB2Y\nKOHZ3OyyRdF5kH5GymIJ/rz0B/LKhR2aoZmG3Wf63tDrp4ncBsE4NpRb0dS7R0Wq7rhmEbQWYbo5\n+Yl2ZSa5Cj8+3DUl03CgUvkLhAvE+lpp2Lpo9zDcp0dV5MKqIaO6OYFPo1nBe03bl8MrbNb4sQ08\n4C4HnkasFIm7CPpUVJNYwaBHciB/fTksZVLCOOocaX80I0m9TtXDfmp12c12uWFVxP0FuPR/tiek\nrRdcB1kAAAAASUVORK5CYII=\n", "text/latex": [ "$$y z^{2} \\left(x y z + 2\\right) e^{x y z}$$" ], "text/plain": [ " 2 x⋅y⋅z\n", "y⋅z ⋅(x⋅y⋅z + 2)⋅ℯ " ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h = sym.exp(x*y*z)\n", "sym.diff(h,x,x,y)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def m(x):\n", " return 3*x**4" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACcAAAAVBAMAAAA3P+qgAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWYiuzKJ\nRN0MreaOAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA0ElEQVQYGWNgQAM8qc5oIkBuBEMUpmAMQz+m\nIAM2lQzM2lhUpidABTlDV22Ay4MsYlRmYDBh4PkLF5wvwGAS8pmBAeg0JYgg0MT5DQwMbEBBPQYG\nf6j+lwxJBhDBegO44J4cT6AekEogeG/AnOZ57RiYDRPk/cNgw9CX8BxFkM+B4TDDeQNJFMFQBgYD\nhiqoEFQ7WwCI/w1VUJSBcwID928UQe4ABrYJwmwfGJKhwiAnzTtz1I/3I9cHzgaIIKvTdw+G+v//\n/zG7Jad2wPVjMgDBETUVhn8LIAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$12 x^{3}$$" ], "text/plain": [ " 3\n", "12⋅x " ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.diff(m(x),x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Evaluating sympy expressions numerically" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x,y,z = sym.symbols('x,y,z')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Evaluation at a single point" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "a = 12*x**3" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAOBAMAAADd6iHDAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJqyLvZs27djJE\nVN3lLQH2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAlklEQVQIHWNgEDJ2ZWBgMF68gYExnSEsgEHi\nAFMDA0sCA4sCwyQGzgkM/A0MzB94vgLVMMhPYOD6zZkAYrIBRf/wd1vpMABlGTi+y7czsF1gYOhi\nuPxX/iMDUyIDA/uqzb/5HzCw/wEpZ/nI18DA/h3E5HAAGg4UZU9l2B/ADVSbwMDVyNjOwODMIAY0\nwUjpANBIJW8GAJUiI6YyMpH0AAAAAElFTkSuQmCC\n", "text/latex": [ "$$96$$" ], "text/plain": [ "96" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.subs(x,2) # or a.sub({x:2}). In general, the argument is a dictionary" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADwAAAAVBAMAAADocZC/AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWYiuzKJ\nRN0MreaOAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABPklEQVQoFWNgQAM8qc5oIijcCIYoFD4aJ4ah\nH00EjYtXNwOzNlT5HQeGx2g6gdz0BKjYgc/cChAmZ+iqDVBBBpjTOG0fsC1gYGBUZmAwYeD5C5ee\nLwBhshxgSWAwCfnMwAD0qhJEDGjz/AYIk+8CE9BINqC0HgODP9T0lwxJBlDpDfeBDJB0vQFcek+O\nJ0SWgddtOVQaSL03YE7zvHYMKmWTFslgybACLs37h8GGoS/hOUSa9yXDHAYf3gK4NJ8Dw2GG8waS\nEOlJAszRDDfOgDgguxkYQhkYDBiqQCwQcGrLgLoPIs0WABL9BiJA4AuEApFg3aIMnBMYuH/DRP/A\nGBBp7gAGtgnCbB8YkiHiOkBhqAqQ7nlnjvrxfuT6wNkAEUxnYI6EsFidvnsw1P///4/ZLTm1A6Yl\nDMaCCuCgAGYDTBHA4wr8AAAAAElFTkSuQmCC\n", "text/latex": [ "$$12 x^{3} e^{y}$$" ], "text/plain": [ " 3 y\n", "12⋅x ⋅ℯ " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = a*sym.exp(y)\n", "b" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACcAAAAQBAMAAABn8nsTAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJqyLvZs27djJE\nVN3lLQH2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABAElEQVQYGWNgQAU8Jgx8AqhCDAzM/ALbgGJC\nxq5A0njxBrB84DmGlQwMjOkMYQEMEgeYGsCCDM4MXgwMLAkMLAoMkxg4J0AE3zBkMzDwNzAwf+D5\nChEBkq95PjAwyE9g4PrNmQAXPLKygYGBDajyD3+3lQ7QeKtFAYwBnAVAN3xg4Pgu387AdoHhXACr\nAYvBCZCmLobLf+U/MjAlsuYyCG3gKTYACbKv2vyb/wED+x+W9FWFIAEIYPnI18DA/p3fASYAojkc\ngI5l/8MP1giWYE9l2B/ADTQzgQ0ouAAsxsDVyNjOAPSc2AWuBgahAIggg5HSAaDDlLwZGBYtL4CI\nAQD8NTgUSpRkOQAAAABJRU5ErkJggg==\n", "text/latex": [ "$$96 e^{y}$$" ], "text/plain": [ " y\n", "96⋅ℯ " ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b.subs(x,2)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACQAAAAPBAMAAAB+RXBeAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMpndu3bvImbNiRBU\nq0Qb3U6NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA4UlEQVQYGV2PL2tCURjGfw7dLte7q9iFmw3D\nsLiBzWqxWFywWW606UdYuE2DA4NxTFywuC8g3AXBIgr7CipuCvq82nbg8Dznx/vnOQA5GNceZOBj\n+HbRRwi4/zLfYxRKUg28Dnevss4Lrmkrwi2RLsomY7yDtB/hb97djmwmxj+qOIxgtR+KMA3wt1qG\nkHvqGmr3Sfypz9DsZ7c2FBjyskJOTL0pdG2cIHQbktBYG+8dmS2Xu/lUz4VusoRjIWhYFWU5Rb2x\nqGzwuziV9C888ZkVGZwW5Av69jNMqt9W9P+cAXKhPXUuND10AAAAAElFTkSuQmCC\n", "text/latex": [ "$$48.0$$" ], "text/plain": [ "48.0000000000000" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b.subs({x:2,y:sym.log(1/2)})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Turn sympy expression into a python function for subsequent use" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "f = sym.lambdify(x,a) # Creates a python function f(x)\n", "g = sym.lambdify((x,y),b) # Creates a python function g(x,y)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " this.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('