{ "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": 2, "metadata": {}, "outputs": [], "source": [ "import sympy as sym\n", "sym.init_printing() # for LaTeX formatted output\n", "\n", "import numpy as np\n", "\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Following is an Ipython magic command that puts figures in the notebook.\n", "%matplotlib notebook\n", "\n", "# M.L. modification of matplotlib defaults\n", "# Changes can also be put in matplotlibrc file, \n", "# or effected using mpl.rcParams[]\n", "mpl.style.use('classic')\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 2019 we're using `sympy<` 1.4. 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": 4, "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[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": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle 20.0855369231877$" ], "text/plain": [ "20.0855369231877" ] }, "execution_count": 5, "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": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABIAAAATCAYAAACdkl3yAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABQ0lEQVQ4EZ2T0U0DMRBEE0QBQXQAHRCogJRARAnpgCh/9xeRDkIJQAcJFaCkA0IFIDo43jN2ZATH+RhpvWN7d269Z/fruu6VoqqqE2JH2Dsmv8DmrG8PIV1wS/COxDuT8De4J+yoq9BcgQzHcKvrdRLyCJmI9Aqzym5CJoh4pGvoEh6O2e/S7KASBwQG0AdsBV/8W0g9BM5wG2xY3KNYwStJl/DUqw/m4vzgy7ePJJvkH9pl0SO46/fFFcXkMX6G6FuceyGHfuRbj1iwgTMsBZ7Cp7EaaDP2FRFsmUtsDA89wNtMhafYnwhCJPhuVtgkicQsxV1vRarISsQAId+P8Pp7R9Zh1jIkIb/8SNKiJb5xO//9z41RBRtJyLvhUX6AKn2YrUhH8wVP8mgEvAquh9ed7/3G9/eIRJtsVS8x0MYX9+wTyvFnnBOF5i8AAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle e^{3}$" ], "text/plain": [ " 3\n", "ℯ " ] }, "execution_count": 6, "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": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle 20.0855369231877$" ], "text/plain": [ "20.0855369231877" ] }, "execution_count": 7, "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": 8, "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[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": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle 20.0855369231877$" ], "text/plain": [ "20.0855369231877" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = sym.symbols('x')\n", "sym.exp(x).subs({x:3.})" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "sympy.core.symbol.Symbol" ] }, "execution_count": 10, "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": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 11, "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": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADMAAAAVCAYAAADrVNYBAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACd0lEQVRYCdWX0VEbMRCGHSYFOKGCXDpwQge4A0gJuAMzebJfkw6gAxI6gA4Y0oHdQQgdON930Z2FfHecZpyZ886sJa2k1b/aXe15tNlsRjEvFosiHg+134TzaBTRcrmcM5xEoiF3i4C3xlgbw8QZ0mPa23p2wB1w3guP9qKGaRjhsjH8ONSQ6sIlbvG7pvLMN6y7qi08rI64xT96o0W46g/87rBs2KIVP6MPR3TMlfV26iB74v/ylp8pXCZTkxkYqwtNsnHTfJBds27WMZ89hT7P+wr/Dps/0l4ifw7juBH/VGM+w435Egxx0zms8hP4BnaP4+pF+UV/b8S5pygT0zn9UjetJUPjLuGUVghONUZQT+ls2PxAWz7VtNagK9o17GH3tHs1QgzoLGju4Fmi3zOVN5H4C415D++4LiiKwU6RfQ+a9NB16O+7qaJkzHleoHQM3zFuSwdzZqwxrxJKdHFs8ARZPH5VR8YCPXCL/uri+mwtHWKd0UWGWheZ3LGLDYX/SQ+ZysX/pDG6qBUcN+RCX7MfcE3IvcFGCnsa53oIxWNY7RB6LSNNpGfWGmNemANtpCEmfRpWPuk7FAyxCD/uTPYTWApeXJQ6YXMpzuFY2yfnzBmf2p/xTNIXdPoctn6McugzXCZkAJFeQqL+5ZA91izBa5RPruS4q45p/Kz8L8OH2gqedH3Q5c6h76z6AMzdm7OeMwp45R7DTPIWuiwvF2X+nHCbWV7J1F8tN2rE/88YDrVm+Gen9SFwcV9Cj49G9RnSd1v2uoBX3GXNqzyjIj9ZqoKVrTjZcMEBOXUi2d57KN5tRMXxGeJvHsuG2gfrXLwxvr/HVv0vH7YtqwAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle \\left( \\pi, \\ e\\right)$" ], "text/plain": [ "(π, ℯ)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.pi, sym.E" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV4AAAAVCAYAAAAOw4YBAAAACXBIWXMAAA7EAAAOxAGVKw4bAAALn0lEQVR4Ae2c4XEWNxCGDw8FOKaChA6C6QA6IKQCoINk+AX/mNBBQgVAOkhSAcQdhFQAcQfkfWStRqfTnVZ3Nsae2xl9klard1craaW777NvfP78ecjp+fPn3yl9yHl7effA7oHdA7sH1nmgFlMPcigJ/KT69znvqpY1lsk4xDvECV/TmC7CzovA9PgM3yo9Vjr0yF8Vmes6rqvi/5admp9L2+tO3ewLYmuim1ZSwwOVbyl/aTxy1QlUTyKPDUX9F/H/jDxXJnmc81bpjsqnrU5R/oly0z3q4sD7SzLYexI7WjC4MwKKFcn+mvGPVH4k3shO1Rn7z1HuWPkn6uKbjth0lon/y4gxDK8rsi47o27zBWNZmgcvJjhPMxupv5WuydyK1/SP+jLHyP0qeWUTOhX/G+M6MU18Uy5dXXNXKOsaF32lb3G9q93le6/dXrx8XF/axugX17hzO2M//DkXD1zrPeJ41vEg39je/ah+t5WIebU3AU3d6ven0vdKXEp+w44QeFUJzlA+CkqRT2CxDT+oTID+Q/kPSr8DMkdqB/eVEgGKQMXi9xJBehTQOvHQCTFhOAxbXwjjVHmiiPm3GASLcOgop8+/yjkkgrOVYzsy962zykzO3/CUUrBSGVnsx3eBr5w6iUnMqWmn+uLHnnloYkYDWExpbuFhJ/qUwtxSFrvpn4h3VznjrS3Qe+KHQ6sTM0Kvz6TPPXczWnrG5V3vHt/32N3EY2zR95dlIya47ESwoEk8yNqb671nzUmW9U6sGO0B1dnn5dpu6sZO9XupRKx4o3RqN14CSH4SIAs9JkmQQGtB1gLMU7UZD9kJoUDMH2hQ2f0aI8puxTsRTtA9ARozWIRHkk03fZXp+158fGKBFh+VQYpgiI9YFOkmF+uv1Wa+EmsggJWTBt9jZ+88NDGj3Sywkh6J8ZeSza3XPwFHuOavhCseAWRQvgozAa0v9MxdVYtnXJJxrXfJMZ8e37vs7sAbLstGnNpjZz4J6jd6TM/bYrm53iXnWsfRxnTxAF88ntRYu3k8oAny6D6TPOsf5vQgch4KOFyBTSLmJ8pZTKRAGGHli8iFz21zpPMi9GSY3OCrAVH8e7LnMMpyY/snq0d2uOExURZcwGMMI3+qndNyEpQMpJFfxDxw8/bY4/UPQ3g3M47yltODOQPZxXbN3QKid1wLEKMmr++9dnvxRkY0Kl5Mr42o82Im07RnziseeNcclzX2W0msgTwelO3NusZCTCDWHh7oY86gQW28m/iG3FBVRh6q3ZDPWrZ9/igdo6C1DW6+t/RYULXHhVz4Y6wcxzw8QqvP3MFjWNyKOSHn5HIdrrKwLmIeWEgPhM3TjNmOPZzIYW4zvsc/g+TtRgtOIPHAexGryJguF6b125h7566qxjOuasd5ZtP3savXbi/evEXTFi+m10Y0eDFzazbHg841x0FSW5t2OaN9C4Hz8KY+uPXgvCZpACgNV2WVzz04CpNHinML6MLjkY6NfkuJGynvbU6UB1KZAEn5KDDGH/SB7CY799qCE3nIcAnUH1SH/6MSAZyTvvqllfj0XbQTmZwk35yHFqbafycJl4P0P5V5/4qd6bWSeG7/qN+E1B/f8aWCfSE5bMWcKHEwpNM7dw60MF+Tcbk6RiHZ0/Q9ol67vXiXaWMcj2vcZqfG5Y4Hkp3dQ2pzrWPJ2aXATKjlk1ixpLsCQKy9f6APAsU/FYHEEjCbBydwmyNwvU+N51QQPosZB9nJshUZJ/Iim5fabHwSL7cJWjkRfNBdUgioYs5OhrCQoW8KLJn8MXqV0I/fCLwEuZK8dg7q750HF6bwCEh2gHKg4pt0MEVDV/tH/cEklbQFs8RaVceX6ljOnRdrblze/sylx/cTvDm71+JNFGSMtZhzNgLtxZRcTzzwrHfPmrOgepq5oSyiKyeP7lyeWPvdgT7oWLtaJ2E5gRfIBBAWy2slAlgtiKQ+Kwr8VMSCwIru4y7C4p1qcqDKBHROm/JG/Yieak8BWWU2pfVdOgjeSo5T3H4NgS8hAmQ5ljfivxLfZIKg6l47B8m65sGLKTnmkHFy08U3LHbeY+dzu8o/wgDrnvLa09QqTOGdJ43mzgvcGJcXZhCOx/c1vKrdG/BqOgJvA2bVRkA7MN3xQJiePXRea86ehM1HHt1BNn4Qa0PgJcpbkMkFqmUNkpMD+fCzo6pQJ1OYPCaUAbETxSVOEOXHzASFQCozlm+V+HncT0rcZmh/pwRVA6/ksJdXCrXH2FofvsU+VDpWatHEzrKD9PbOwwhT/fE5i4ZbOeO4r7qNJR0Q4q/yj7C45df8MGzAFOR2kv6luWspmB1Xq6O1S7/L9yZv+Zzda/EMt5avxZyzER1ezCi3NR6U692zjpcuoHYbtu9+am4z3ki3MWNO2+HNgjmqygHc/HBY+fj5XmxuiCQCwGoSNkHuUHl1k64BFtYf6nekfPS75AyLAJhIckwKGyqRePaIPLFLbWwc8AlWicBRog7eHOVB32WnMN3zIFkXpoxjfBw4idSX2zu3Xx6H0tyK1+WfCMiNbuK72DasxLTuq3Pprc5dB+DiuJw4bt8bXsPubjzDXci7MRs2oqqJKQxijTseSN673gfJLq5j2pWw85CPgoyX1rRk3bozrHDRvSkGUd5As/ZQ5JY2SAG/bMDoiyAC0V3h83iSE8GG2yl8bmT5e9RcrlbmVlk7vRj0IKzyIKlhoJ9fE4zGrTob77Zyux0OKodgqpxJsUf2Gia8NHEqe+3smYcmpuxkvlnco7FhHGNQ4jANvoI3Q1X/IKv+4OMTj5/pYjSLaQJbctnVmrtF+A3jSrgRo8v3S3YLOOxfyWyZy2QfhfO2UXisKe+a640HzfU+Gty0Uq65uf1r+yF/dbZGN374ROAlEITAMbVpYDInwUc8FEK5EWeczk9NCBgTHPH/g688BbgO6N/UrxaoucWNdEmOzfhK6VuVw+JVjnOQHd2YxWeSOCRKbDDsnS6PSOUhIlbA4kTN9Xvt7JmHJqZswA4SB1t+EGAnxPiDnWp3+yf0PPuw9VE7/IZeTMlXA1Wmr1kUhmfuWjiL42p1pl12uH0f5Rft7sW7DBt7xq3x2OVlZKr4c/Ggud6jfu86Zu9yMy+JWMB3LCFGxEaX7gKIAP7hADClu0WjVQkwXKcTSTEDYGPy8jsYoZyN8Vkp3MyS8LhgL6VR7CF0kOZoCY8/7R29I1Ld/vqlDOQcOmWAwPmMD98EUhk5+Iw14FsuXu4LboscGGnyVGYcD5XCC37lRl47XfMQQb2Y+GHynl628ijOT8osILv8YwOKuc3bacG3qhsz+o6fuy2tLcOt5urrnbvWOm6NK9e/tD5dvvfaLaUuvNy4WP6SNqJyrZ30xffmf+pG3vXuWnPyOReoT8qJc4FURu+W/RuRQnZHnyc3nj17xonKBuTd3oTE5+aHw4wYAH+JlN/cBtV5L0jAKd+V2u0PHAZAMGNTs7ntlqjqGYlHwEQH8hCB7J349ssBF57kwbCbKcGe4MoXSafKRySeBUmbWPxRGx+YNeIkxKGJIqbhof+FeCmQm6B4Ljsl55oHcDswmfunSvjGqDb2pn+sM3nUT6B8pHL1OwDx3ZiStZ87uv7BUm5LtCf8hKfkx/po7qKuyTqOOMxVa1ze9dn0fbTFteYk28Sz8Uv2UmyMPnTbGeUX40GU8e4h15qTf9i3yBIrPirdVdq0f9U/UJzTJzf4f7yxwrf6k8BgHfZ898BlekBrkxsIAZHNsNPugSvnAa1dDggunLcPovVE99FN9cqNajf4unuAd+t70L3us3y9x8cTeLh1h8CrBc0j/+j3rdd7/PvorpIHtD559OORb6fdA1fSA1rD3HaJseH1qt14GQzvcUdfSMHcaffAV+CBx1qw6d92fgX27CbsHuj1ALE1vVUI73gNIUZl/mPVvsjNKXu+e2D3wO6BDR5QPOUXVfxxkv1SaPgfdYp59X01yO4AAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\left( 3.14159265358979, \\ 2.71828182845905\\right)$" ], "text/plain": [ "(3.14159265358979, 2.71828182845905)" ] }, "execution_count": 13, "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": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA9UlEQVQoFXWS3RGCQAyEwbEAxxKODqxBOtASlA7wEV61A1sQO8Aa7EBrsAP8FnM3J56ZWZLbbO4nIW+aps+ybA2e4A6m5iAWQF5WzvlU4AFElm3bqvjH4LVxB9zMRAdTiUwauhuJHShmUkCccCJXxLW4lJG7wi/GIhNszR9JrlJFxvX5MAwhj3jDQld8EhchMQnikzKEOl5wxOeJNiy/iozVY1+GIIyDVJFDcOEk39FY/4n1Jg8G7UDn1ylPvtZwR2NnTf2ML4365z5zsqy65tueLGBDzfAxnsRCBRVeDfgxeN1iD46gyrmjWisi9c8t4VUQW/kGCM5lc7D9sqYAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\Sigma$" ], "text/plain": [ "Σ" ] }, "execution_count": 14, "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": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEAAAAAWCAYAAABwvpo0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACzklEQVRYCd2X7VEbMRCGDZMCPCnBdGBCB7gD4lQQ3IEz+WX/y0AH0AEJHSQpAXdgdxDiDpznuZwc36E735cZws7sSbdaafeVVivpaLPZ9F4jzefzIbh+wqfUV0UYj/MNKA/ysv/0f4Lfffgx+B/DlpkAFKYoO3OvgcaAuAXTegfMIMW4FR2FLUDDBdIzyk+hlfp36uewIbQI8p3SaHGWQ9SM6PNjp71xtY1t+rqID/AJ9Uz48+8irylvde6NH34E8Zny1P8dMoyWsAAFlxks6CF3kr6lekHctmxj+wPG72P+IruGH+Cv8DpsgSs63OQ9RkHAISIEGCX0XPWP8ElUoYGwpW2j+UuJWbGKuRcmYIzBJCTynZBfIxPgkLrhEyXa7mkwkjqjJrbpY7SuKGNbNvGNNrGKuX/Mx9mKhnai/ffzPq1foV+WJM0ZXVMt2/gnltCnzBf1xkbACC5NXAxqJg2Dlm0Fo6BTamI77bPPDzGPnIB3sImulBhUcLJHyZN8Udq5ZeOBbCfJ3Qlw324vC3t8NdEZDfJzU9e2xTxwAt7CVQEN0PX4CCcDv89GXds2B/SdgEoEaB3wruD5HCXaCk+JaIeKwgPZThbei5Ch4DYoJByw/YbShFlGnd0DgpED2hbToxFgKLi6ZWTmD6dAVA9HXf1MMk2dj+rXEDayXWF8I2BlBHhhOCvqAAgdmFBG80QK8hIdb1bb7ZHKf1Mu4PwVu8hcRk6/RrYzgxT/6NPCCbiDNfSEcMDjzouSt8B8uzOY3zpGU0Lo++BIEg1l3//QVqVEv7HtKuOjcw5Per4GZ7PZEh5a75oZ9wLudz1um/HwZwAvHSOcApnwrTiDVdV8Ytda/aoDt9DzGP/3GMJBHwfe8PYlw1o2Gc8t8qtWpwMrpxjFmjz+QgRo1izf9RX3EkO+Jl8SiXGbrDN7Pt0b0zb76yX3Bd9UjLs+/gGQPYcbvXA/EQAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle \\left( \\Sigma, \\ \\Sigma^{\\prime}\\right)$" ], "text/plain": [ "(Σ, \\Sigma__{\\prime})" ] }, "execution_count": 15, "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": 16, "metadata": {}, "outputs": [], "source": [ "x,y,z = sym.symbols('x,y,z')" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "f = sym.sin(x*y) + sym.cos(y*z) # scipy trig functions won't work!" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle x \\cos{\\left(y z \\right)} + \\begin{cases} - \\frac{\\cos{\\left(x y \\right)}}{y} & \\text{for}\\: y \\neq 0 \\\\0 & \\text{otherwise} \\end{cases}$" ], "text/plain": [ " ⎛⎧-cos(x⋅y) ⎞\n", " ⎜⎪────────── for y ≠ 0⎟\n", "x⋅cos(y⋅z) + ⎜⎨ y ⎟\n", " ⎜⎪ ⎟\n", " ⎝⎩ 0 otherwise⎠" ] }, "execution_count": 18, "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": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFAAAAAVCAYAAADRhGlyAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEeElEQVRYCd2Y61EcMQyAF+YKYEgFOTogpIJABzwqADpIJr/gXwY6SFJBhnQQUgHDdQAdJKED8n0+y+wu3iOP4XJEM17ZsizJkiz7rrm9vW3+h3Z0dDR+7H3UdCw3/wEcHx+/Zhvrc9jKOOsqqpaMGsQxlDeZugH+7hj6JNMWFmHjNsa9BIf9j2oregzWDfiDipZMS/B7CFsSBPonIBm36J9LW0TAthXs+gp+MU/70HeJvlfgG4+wzjpsG8CE0byhnbXpC9jX9vf/wC51qrvRgZu0K5xmNNtg5q1AN0MXFXaxLx2leRqYdap7RQfqqGsGZlwN+o6t8cydhr3Wvuu5K75TqO7dEYbs3NE6vXSrMT94kTCnc03ltvMvoH8OSS2eq0xbA59BL7WVvro8CcqJgO1Bn1XbrNlFBv0CWecBBHVdMi5Zmuc+gjv7ZqwNUbJ2GE9onr5NcFnPOEDdW6MYtXEW5uLBmy0Lt5ju008OA+sEnWNGa0AY5WVUsoX+F+dop7QUBHC5xLSFcacuS+uBr4Wh+veW9b4izNKPtLYDdhlLLwCfNsinvGe0E2gmjs+WjqOhBZgQm1UHMmEkPrP4NLgrWB4dVbKNcWTPTeYPOcV5mW5gzAyjuErboG+9jXWyDTnHOUFdPrc6gAyDdpGJBqXPU8tcbUi3al7XIMeTtR/jClbu+J4DWajhOmbI8wrXeA3tOBi6zoxsdN4sjs3QnQJ8ZqcDj6mZojE/wDr0C+2h4MGSHN92uDQhZf+025ht73I/kKekQ0NvCTB99/ZWHvo1+SHHNekSCULDAuvGKrhznArDXUfHCN+mqPoNnllG6GTBWmcwXGPkfRU8lIGw3QfWJX1gHaUzyvGFpj5pQ7VT/QfwGdRZdsM2DeCyPYEF1oU1cMk8+taAcETiy5+ImEV6CIJHg4fAbEnywRqt/iWYrX9uJBxcW2/WzpLtPsz0tiN0qr8iJn2B0Jzzwiiniv4s+c59Tw6EUUNrP4d0qoZ2AH6N0oiNzkQeML9Nc16+e9nMnMYK1kh1m/kFmDdrLAVV+ZnRANWCm6fTXAQxaLX616DPfVqDS7bmBV4sQ7DKxPWIRRrhRs7p949NJyI9SUbYi8BMKYrpewRDziv6/tTyp2I76vJ4A6tT4701P9B0eIARrh61zKC8l8FcwTrPTSZAdsowBp3bHboBlGa2iq3B3sTaVU4j/T5YdiYjPi7QiZ0sYCy0Nz2l5C/KPH7PGXrl67B45+msFHmwRqmoXVPU5Tico9MMgIEAJXADyu1nUJ5O6BNfAz8E3vS+9wyWtTrKTeiNdXvwpFMC1mlmnXoPGQ/un3kDcvik/wvkj5Ar2vqv/A8I3wnt8ld4H+JBzph2Jd8yXnzKYHZ1jqSbIXPMXh/5CehbDjxh76aUv/6a3ep+2g7EMR792kvBo+gRD/BYWmPbj/6Y+y2MDEuQOlPdtwY+dbDQWwvbt70Z4nvW/zStfdblfu2D/EdgvS9Zn/6R/iMxC7QoZ4VPp/KGewzzckD8lVQut58SHpHP4hiBGQAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 2 \\cos{\\left(y z \\right)}$" ], "text/plain": [ "2⋅cos(y⋅z)" ] }, "execution_count": 19, "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": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAJCAYAAAAGuM1UAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAtUlEQVQYGXWQsQ3CMBREE2AAZmCECHpLkI45YARat1BSpqUCsQEpPAElZVpaOkrzTvKPTKR86XT/7t+345QxxkLlvT9COzCXHqmm1EIKK/MAWliBK1gm3cLKPadwBb6Is3OuCyFs0Rf0i35N3yrI7E1fzCRgwarGOyWhmxobiCe5IKjbPplX4eX6f4HgHugdVgtrjPsbOEmP1V+62VCMv8l1v4CpcDf8BLx6bEGDQz6kvw908QNYwThArcyywAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle \\pi$" ], "text/plain": [ "π" ] }, "execution_count": 20, "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": 21, "metadata": {}, "outputs": [], "source": [ "x,y,z = sym.symbols('x,y,z')" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "g = sym.cos(x)**2" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJMAAAAVCAYAAABCDNzQAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFS0lEQVRoBeWa7VHcMBCGjxsKIKSCQAd8VBDogI8KgA6S4Rf8y0AHkAoS6ABSAR8dQAch1wF5H52kkX2SD1vWcMztjJC80q52V6/Wko/B6+vrYJ7LycnJSlf/c2S7ztmnXI79MdnhYI7p9PT0m9xfywjBitWRoeJ9REv4vgDSc0mGrUjHd6tnQ/ULz+I/Wl7ryup8sHouWyuYIiD9OxqyqdrZPUUi3i15ADlS3buN8RnzuaV8z85MMgwgXag+smVdz4DoQc9bGa6jd0kFfb2S7ELvseosIGGUdJyrwnd0zjxZO4v4ng0mRe9M5SiMogxmkUYqVyG/TVs6bjX+k+qK7jY6GsZi80VDf9sudKHzI1Ax3/sAE9nnySI+DCZgWBKfDNOJJAsgS9CedPf2WrK60PkRslMx3/sAE6B5blj4mQqw7OSs9FwAoejcK6C3N5WlfV/MtVQG7iZ0mFuS+qOHcPHpJ6uRfRzg9sVfVyGb8YqkvtWzmcPK/LT836pJ2YAD2lS50xjOME20rU42QJQkjy2HthOdByrYsW95zHFt22GFTnQnM57Vjc347KiiLxjzZAesqr4S39usdjJ2TmmiLup7NphiRltnWYDoAdcFTDXOedKzOR+pZpcDKm5znvQMMOET6GWVNbUNeFQTYA791ypNmYfbZtN56Uzyzg5uaoCXBed26s5GMTBhE5sjSpIlHvhzoLaRV814gEJmf1TBBzbRNjzVhtS+oU/lXAWwY2M0dlYkVRX1fZiaNZNPQFjUVJbAqQ0bmHCq+iK/hJ1Bm0BvSd4vqtouAyYX1MqzGFG90kFGCg/SZBAyn8s2ADjs16MndAKYFBETQONt1jO2QMwDubh5II3ZZlMCIMD21thZ0UpV1PdFGcgEf1ScY5XZEw+7knOLVxkiPoAgaKnX30B9vLoI/j/aqm9UmsCn7gm6n+CMGdP8ABCjhOy97AkX0nzmEM+MV530SfqQi84tOfgAobK5xAdYBlxq0w8Y71QqpD6yFjyOAWTIrrEr6jtgIlC9fMuRLnb2supKCiYKEWLOYxV2PrudnXepUuJTgNRPJ81d3yAcqH9MlzQjmhbKZay/DbrcGAPcxDgAB/Ueuz58H45ty/8rYwDFqmq/e9Xm5wYXJD+J46lmlyGzoE5AdKi2C5gf33ODXR3NIOE8soPXJeP8a0k8PnWkZOGjO0Yu23GYTpEbk9KPHBnfxFN1l9gV9b0XMMkxABD7aQKAxQLMeHdjUtN8SeZcwsJxJihJLFoM4ACFg647cwFufiZxi4xNfDke0YjQsnjhWD/EyjyKEfVN/Tsq9KN7Iqurz9nEmSondkV9zwaTHGVhcJLF4GcVX8TjZ4ZU8FmY+i7k2V+B1YbqY+CxcF2JRePKXycWjPJi7apsAvHomzjPBErM+Sp4rjfJ2GTq+ibiFY9N0FcVPioCmJAYw03OxeatsQt10C7q+2J9tg7PHJ4BVCVIVo8LUl0tACMTHSpAru+zGpybSOUEk/OU2cl6BqwHKswDn36yBnzONPDJJBCBJkv61+2Y7f/+Ugu5OrFQ2ARoBpJnI5CpuFBwpQdk/pXHmBoh52yodRl9+PVFHfiITvcdic1nMppqDtqAklcYMYLwjWcHpMbYGYn0n6K+9/JfA2nbZ7NHC8NCJm+kba2WPhYc4DWdidqqLTK+pO/DIhbPvlJeG8ks0sF8Ps6i8yNQMd/nEkzanbzOojfNtmiwWQld6Jx5Kun7XILJrjhnKs4uuYSOPrNcrj1vkS/i+1yemVy0bVbhWl75Mu36p9WS47e7ab8FTlPzLv0lfP8PZHxQA0JXEwwAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle - 2 \\sin{\\left(x \\right)} \\cos{\\left(x \\right)}$" ], "text/plain": [ "-2⋅sin(x)⋅cos(x)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.diff(g,x) # First derivative (or sym.diff(g,x,1))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle 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": 24, "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": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle 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": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h = sym.exp(x*y*z)\n", "sym.diff(h,x,x,y)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "def m(x):\n", " return 3*x**4" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACcAAAATCAYAAAATSBSOAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACXElEQVRIDc2W7TEEQRCG75QAHBmQgSMCJwMfESADyq+7f4oMjgh8ZIAIfGSACFzJ4DzPmNkaa7F7fpyu6pve7unud7t7Zq89Ho9b06TBYLBI/h48gpVX4SP0j7MI06ZjADwD5lQgrPsst3DnP4A7ElRGC8hWsTV1cLYvA6a4AVvN6YMThBTbuY04RA4tbucHAuUyxku4i/zG+onQObAHUbnCavkP0JffPm5pthBnDg/zXyOftPv9vooz2EQmFGAH4ydwPAvMt1pnDYRs+R3gdeSbD+3ffolj/ge4O8uDIDYNiWwijVUkkL3cwH6rtovOt+3ktjoyvhbmBV5DTtVPRVmZqRMk7vEueooBczcrNofeyjYifARix54zR/Oov2hyWgWxHANmsQrRKkxCdu2QuK/R2Us4zHxtcDiH1ldkD2OAPbWlhSxQ2y2ZbAe2sp5G6Y49Vwqs+hW+6hI1aWvyKVYCC8yk6QQn2zG2ExnFHeyB6/HsPoGHe4z1R6pduW+ieBCuIoiwBdmK5cmdHy9WqyfNw7k9KKt+JgYHiCEB/SaW232PLh/wLvse0QmyVbFfdSVN1FYSWJ151uLOS9HRlednC9t5sjdZG4MjuS1aYi0qhrwolxOj66FzxsLwa0fntaPuV2rUVoJ6AFZZywdAwKcxqXPogfDq8dJ+Q87b7LVR9mfbVyqD8++K5NCGGQlP/BDQypj4Btl5y8mT6OkUpNXyy2F1RvkmdNo8vbUogMPJpJLO0iU639YPcPiHoAwLMN1fiAWlObNa7g9x8N2DjeHL+L0cIRct5vlHegfUJdr6kUXmvAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 12 x^{3}$" ], "text/plain": [ " 3\n", "12⋅x " ] }, "execution_count": 27, "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": 28, "metadata": {}, "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": 29, "metadata": {}, "outputs": [], "source": [ "a = 12*x**3" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABiElEQVQ4EW2U3VFCQQxGgaEABisAOgA6UDvwpwKGDuSVN0c7QCpQKIEOVEq4VqDSAZ6zbHYud8xMzJdvs9kkN9g+Ho+tkOVyuQqM7aMzuEONKxD+qTgn8Aq374oBPcwnugI/Z26M/cKfoJWcAh5iNugCvMucvjrqSCBrtE9ASiYB3mM+0HrVHnnRalIyCcSC0qOpQpwb1ARNkXvgcg89oMZZ+WU9EP46/I7B2fkJsma/M55mO8ea+N+5GtP1EBX7EZpykQnnppi4It4q71EfHKEbuDSCaHkLeYU2xYtKdBF2SoLF6SjN+xffjdjGR5l5CFGSgk0WrVlVJBuDXyJZtm/YtTEpIcCLA/QW7Edwx2zzHVXK2jRwOuSPK+eD02i5lZM69CI5sb4Vxqyj6hJXA8NoucadQdve5cc8cPDRun5TqlQhF9wvl3sQl7FedKYTNMQld7GbYowd7KJC59XcQy/OCSoLD3YbrLj8jsE+fIemD9uOfw61oGip7BbBZ5JjI67P4SNcevgPs2+dy2Be4FMAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle 96$" ], "text/plain": [ "96" ] }, "execution_count": 30, "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": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADwAAAATCAYAAADMBm6RAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADU0lEQVRYCc2Y7VEcMQyGlwwFEOgAOoBQQUgHJKkgoQMY/t0/BjqAVJBAB5AK+OgAUkFurgPyPI6149s7kvVyGaIZn2xZli3ptbyw9Pj42LwkjUajdfbfoY1p9rdpR8jv4Aun5YVbrDd4zJIHHDxzKXwf9p322vGi6X9w+Kjj1Bpjs/1P6MUdngPdXTw164MIe16PTdo2/fdhhP6541cheGnOYfZpt5zjFJ7gXXsm1q2wZhN+At/N4wZuAAxEM5XhPHGOfIv+RIWSkFlUDrLsDVzoHSB/doHBxglNR81E4zjvU8NWUT5jrSixLoQPOnujoWWERuULzcPrhE7NEHrKjf67mKQv9G6V0a5CPpRjY0IzoNq8olUFEv0H94Z/hF3Yz2Tlv7Svw0YhYZ2+FdL0zyOd2ysn0De7n5GJiuqqylqD/YP2ln44F1kx+CGjW0X6cFqsMMOpONbcYRfd50MWthozu4J8LjJKxW6fNTonslJm8rz7KP+Wx0OZdhv20J7nS8FbrrCmYxaEyEB36UpX0HMsug6x+zPrC7+5NaSnPdW8FnvYtAhqv0VKb4dZnGDP4i6lK8B8a5S+zgt1SQc+0USAd0u6RifdsbyuXft7+unfbPsQjQjQBn2vVkpEnr+Dh33P3cK7BtIzp8CozuqIES3pmDmrrpX2mmZR3GGsnsEY9M6yXniata+FfZ0xAEHuZZVusv4qvH3memc4rHW4xerCzUNO38yWDhl5D2CWpVVaOZ+Ef/vBroG10grVEhEGIVXgbMMArKNjAV6Db2V5YoMdxpCGfeu6UL9BVhYhNxRiAbmufnmeP/XdT7IA6YzkZ+gl4/ZJLPtJo/MzyGGMmkWh0r7JYRdZGX3FH2jd7+VQr+FmcgpNNYtDt/oO45Dw3IC3maIvhITcFCHzkN7Z9iMAmRlSNoSsB8+iKoc5qEXKj/JukTII4+yMENNRyQ+VCeMS4j5BCd5Jo/+PNoTwDGEvFamZiTmCLqTDoIVl6lAYNYMWKT/54j6FSSuwVdmNddZnwiyOQ0GOzLmhWZr3peceynsXwSX/48FBdETyQBrxHhpRsxV/mN8znoEtMsmi5MdCHEDdhnEEwbvucyIKWnirU0OsTZWXNck+3OvRvhB9bP0CYa9MpROeytUAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle 12 x^{3} e^{y}$" ], "text/plain": [ " 3 y\n", "12⋅x ⋅ℯ " ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = a*sym.exp(y)\n", "b" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACcAAAAQCAYAAACV3GYgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACkUlEQVRIDcWW601UURCAL4YCNmsFagc8KlA6AK0A7QDiv/1noAOgAl06gA5UOhArUOlg/b7hzOR4WcyiiU4yO48zZ97nwtpisRj+F8xmsxfE3gC34fcyD/i58qNU/GtK8AkxN6DH0N0mD1CTNelh3Z8EDk6Sh07BfXQ3na5Y9Ecl3DLv0V2NdL8T9X/KnV3odRfHxD55MZLjwCo+gyfwVjJAreArdBO8VifAP4XMwUP4y6ZTFp8prwLpE/oK+/Puzjb8hXKO9Qx+imEk5gG8XbCCvpsemYRdisRUABZXBYRm9R+bEMm0K3YufOdYbe2ykag7IJEJeANqp7PnYAH6nRL+jPnuNfyYmLEil3UYqxbC4Jat32+N24JazRvQJJfuYbN9KDnULz5dK19sJKYTkzOYvAs6hsdN4Z4JJuny2j13xeTdM59+P2ZU0QkLfwtmkdq6q1Ec1PMraOwc1ORqjXKsHtrSMZiEoBMh6RaOrDgA/gfoy67FhtefgfbgoxtQ/Zls3nXXP4LHzd69P0UOyAexr9QM4gBeR1Eh1G5lYn6bykEYD8MH6FnaQO20S34EX2NCNuF++U3eyR1Ad6Cb0ILoHEoNnqDVmUk5TisSfQT9S+x5jgLcl9dg7maOZoI/Awv6vECu8fd8WIx+Ijl1GNolF74AXX5o4yOJ7Fl2s+w6JnfTDp1jX5+mzmZlNsd63wW7eNkS18aqc7zKY+i7atf/CiI5gvu3zaWuwI23A7m8BnJc2R3lBHfF1ciRmaRjvAPYuCYrQXbOgOPv3Byd359aaHhfo53McQ/wFvQSjEcFFTy3sALtQIsrf3V4D7OW/zJxMQNm95Z+u/TTbNNuiuodul+CIvsQ7N4XUDC5B+3gT1aFBywDZdSIAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle 96 e^{y}$" ], "text/plain": [ " y\n", "96⋅ℯ " ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b.subs(x,2)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACQAAAAOCAYAAABHN77IAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACH0lEQVQ4EaWV7U3DMBCGU8QAFWwAG4DYoGzAxwTQDUD86z8EGwAjlA3oBohu0G5A2w3K84Rc5CROJYSly9nvffh8d44H2+22yI3JZHICPoaPUznrIeuHBHM9BZ8l2M4puk+Vwjf8GHoCW4rt++kZU/B5RqZxO0gDGkLvGf0GhM4XwGPoasf6C34OLfca2tUCwV0PfqtxRnYDlmYto1IU+NW+ETjYBsyDvGjUCQgFS6WS1B6m97wN/mF9iW4u65/gI/YedgJCcI3gtWcTDS+Qf2ic6NgT5QkTLDcdAa4ygrJ/wEeNHmITS9XrGPm7hM4FtGZ+DzdrBrizf5CnB8AkOw7qDGFwhMoGHtFmLZCb9sigmfHUuTK07Q8qINcKodsomVc8NgqFDkfH7OjUzHjVPciiwpn+axyWGcKZ3d9bqtii0vN63kNLyAY3Y4431rvKkuudX8uiiOx97+HEE3oVd5aqsrRE9k09sLN3zJbBWL7sQC9KlQs6sKVNbUBnGPgjTIfX/6jCDfYRMvBwXOuCmS0Di5PWstYkStyCa7vZPo5UkhoDfA0wg0dJCuY2vUHmsukpO34aTnliWMezkYpOWcz1X/ZQKknmbhCpDNjgymciADmO7EGvfhko3ExuocZfnbWXZgX3YpSDuXtcQf7ti0H7cUXB5raM0Q+W4hP8GV7ALeUDlDZp53FFb4GOGW6/ewZgljaQj+sZ5NtW/jp+ACRs1sYSUZl/AAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle 48.0$" ], "text/plain": [ "48.0000000000000" ] }, "execution_count": 33, "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": 34, "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": 38, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "/* global mpl */\n", "window.mpl = {};\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(\n", " '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", "\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 = document.createElement('div');\n", " this.root.setAttribute('style', 'display: inline-block');\n", " this._root_extra_style(this.root);\n", "\n", " parent_element.appendChild(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", " fig.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 = document.createElement('div');\n", " titlebar.classList =\n", " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", " var titletext = document.createElement('div');\n", " titletext.classList = 'ui-dialog-title';\n", " titletext.setAttribute(\n", " 'style',\n", " 'width: 100%; text-align: center; padding: 3px;'\n", " );\n", " titlebar.appendChild(titletext);\n", " this.root.appendChild(titlebar);\n", " this.header = titletext;\n", "};\n", "\n", "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", "\n", "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", "\n", "mpl.figure.prototype._init_canvas = function () {\n", " var fig = this;\n", "\n", " var canvas_div = (this.canvas_div = document.createElement('div'));\n", " canvas_div.setAttribute(\n", " 'style',\n", " 'border: 1px solid #ddd;' +\n", " 'box-sizing: content-box;' +\n", " 'clear: both;' +\n", " 'min-height: 1px;' +\n", " 'min-width: 1px;' +\n", " 'outline: 0;' +\n", " 'overflow: hidden;' +\n", " 'position: relative;' +\n", " 'resize: both;'\n", " );\n", "\n", " function on_keyboard_event_closure(name) {\n", " return function (event) {\n", " return fig.key_event(event, name);\n", " };\n", " }\n", "\n", " canvas_div.addEventListener(\n", " 'keydown',\n", " on_keyboard_event_closure('key_press')\n", " );\n", " canvas_div.addEventListener(\n", " 'keyup',\n", " on_keyboard_event_closure('key_release')\n", " );\n", "\n", " this._canvas_extra_style(canvas_div);\n", " this.root.appendChild(canvas_div);\n", "\n", " var canvas = (this.canvas = document.createElement('canvas'));\n", " canvas.classList.add('mpl-canvas');\n", " canvas.setAttribute('style', 'box-sizing: content-box;');\n", "\n", " this.context = canvas.getContext('2d');\n", "\n", " var backingStore =\n", " this.context.backingStorePixelRatio ||\n", " this.context.webkitBackingStorePixelRatio ||\n", " this.context.mozBackingStorePixelRatio ||\n", " this.context.msBackingStorePixelRatio ||\n", " this.context.oBackingStorePixelRatio ||\n", " this.context.backingStorePixelRatio ||\n", " 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", " 'canvas'\n", " ));\n", " rubberband_canvas.setAttribute(\n", " 'style',\n", " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", " );\n", "\n", " var resizeObserver = new ResizeObserver(function (entries) {\n", " var nentries = entries.length;\n", " for (var i = 0; i < nentries; i++) {\n", " var entry = entries[i];\n", " var width, height;\n", " if (entry.contentBoxSize) {\n", " width = entry.contentBoxSize.inlineSize;\n", " height = entry.contentBoxSize.blockSize;\n", " } else {\n", " width = entry.contentRect.width;\n", " height = entry.contentRect.height;\n", " }\n", "\n", " // Keep the size of the canvas and rubber band canvas in sync with\n", " // the canvas container.\n", " canvas.setAttribute('width', width * mpl.ratio);\n", " canvas.setAttribute('height', height * mpl.ratio);\n", " canvas.setAttribute(\n", " 'style',\n", " 'width: ' + width + 'px; height: ' + height + 'px;'\n", " );\n", "\n", " rubberband_canvas.setAttribute('width', width);\n", " rubberband_canvas.setAttribute('height', height);\n", "\n", " // And update the size in Python. We ignore the initial 0/0 size\n", " // that occurs as the element is placed into the DOM, which should\n", " // otherwise not happen due to the minimum size styling.\n", " if (width != 0 && height != 0) {\n", " fig.request_resize(width, height);\n", " }\n", " }\n", " });\n", " resizeObserver.observe(canvas_div);\n", "\n", " function on_mouse_event_closure(name) {\n", " return function (event) {\n", " return fig.mouse_event(event, name);\n", " };\n", " }\n", "\n", " rubberband_canvas.addEventListener(\n", " 'mousedown',\n", " on_mouse_event_closure('button_press')\n", " );\n", " rubberband_canvas.addEventListener(\n", " 'mouseup',\n", " on_mouse_event_closure('button_release')\n", " );\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband_canvas.addEventListener(\n", " 'mousemove',\n", " on_mouse_event_closure('motion_notify')\n", " );\n", "\n", " rubberband_canvas.addEventListener(\n", " 'mouseenter',\n", " on_mouse_event_closure('figure_enter')\n", " );\n", " rubberband_canvas.addEventListener(\n", " 'mouseleave',\n", " on_mouse_event_closure('figure_leave')\n", " );\n", "\n", " canvas_div.addEventListener('wheel', function (event) {\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " on_mouse_event_closure('scroll')(event);\n", " });\n", "\n", " canvas_div.appendChild(canvas);\n", " canvas_div.appendChild(rubberband_canvas);\n", "\n", " this.rubberband_context = rubberband_canvas.getContext('2d');\n", " this.rubberband_context.strokeStyle = '#000000';\n", "\n", " this._resize_canvas = function (width, height, forward) {\n", " if (forward) {\n", " canvas_div.style.width = width + 'px';\n", " canvas_div.style.height = height + 'px';\n", " }\n", " };\n", "\n", " // Disable right mouse context menu.\n", " this.rubberband_canvas.addEventListener('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 toolbar = document.createElement('div');\n", " toolbar.classList = 'mpl-toolbar';\n", " this.root.appendChild(toolbar);\n", "\n", " function on_click_closure(name) {\n", " return function (_event) {\n", " return fig.toolbar_button_onclick(name);\n", " };\n", " }\n", "\n", " function on_mouseover_closure(tooltip) {\n", " return function (event) {\n", " if (!event.currentTarget.disabled) {\n", " return fig.toolbar_button_onmouseover(tooltip);\n", " }\n", " };\n", " }\n", "\n", " fig.buttons = {};\n", " var buttonGroup = document.createElement('div');\n", " buttonGroup.classList = 'mpl-button-group';\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", " /* Instead of a spacer, we start a new button group. */\n", " if (buttonGroup.hasChildNodes()) {\n", " toolbar.appendChild(buttonGroup);\n", " }\n", " buttonGroup = document.createElement('div');\n", " buttonGroup.classList = 'mpl-button-group';\n", " continue;\n", " }\n", "\n", " var button = (fig.buttons[name] = document.createElement('button'));\n", " button.classList = 'mpl-widget';\n", " button.setAttribute('role', 'button');\n", " button.setAttribute('aria-disabled', 'false');\n", " button.addEventListener('click', on_click_closure(method_name));\n", " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", "\n", " var icon_img = document.createElement('img');\n", " icon_img.src = '_images/' + image + '.png';\n", " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", " icon_img.alt = tooltip;\n", " button.appendChild(icon_img);\n", "\n", " buttonGroup.appendChild(button);\n", " }\n", "\n", " if (buttonGroup.hasChildNodes()) {\n", " toolbar.appendChild(buttonGroup);\n", " }\n", "\n", " var fmt_picker = document.createElement('select');\n", " fmt_picker.classList = 'mpl-widget';\n", " toolbar.appendChild(fmt_picker);\n", " this.format_dropdown = fmt_picker;\n", "\n", " for (var ind in mpl.extensions) {\n", " var fmt = mpl.extensions[ind];\n", " var option = document.createElement('option');\n", " option.selected = fmt === mpl.default_extension;\n", " option.innerHTML = fmt;\n", " fmt_picker.appendChild(option);\n", " }\n", "\n", " var status_bar = document.createElement('span');\n", " status_bar.classList = 'mpl-message';\n", " toolbar.appendChild(status_bar);\n", " this.message = status_bar;\n", "};\n", "\n", "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", " // which will in turn request a refresh of the image.\n", " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", "};\n", "\n", "mpl.figure.prototype.send_message = function (type, properties) {\n", " properties['type'] = type;\n", " properties['figure_id'] = this.id;\n", " this.ws.send(JSON.stringify(properties));\n", "};\n", "\n", "mpl.figure.prototype.send_draw_message = function () {\n", " if (!this.waiting) {\n", " this.waiting = true;\n", " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", " var format_dropdown = fig.format_dropdown;\n", " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", " fig.ondownload(fig, format);\n", "};\n", "\n", "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", " var size = msg['size'];\n", " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", " fig._resize_canvas(size[0], size[1], msg['forward']);\n", " fig.send_message('refresh', {});\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", " var x0 = msg['x0'] / mpl.ratio;\n", " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", " var x1 = msg['x1'] / mpl.ratio;\n", " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", " x0 = Math.floor(x0) + 0.5;\n", " y0 = Math.floor(y0) + 0.5;\n", " x1 = Math.floor(x1) + 0.5;\n", " y1 = Math.floor(y1) + 0.5;\n", " var min_x = Math.min(x0, x1);\n", " var min_y = Math.min(y0, y1);\n", " var width = Math.abs(x1 - x0);\n", " var height = Math.abs(y1 - y0);\n", "\n", " fig.rubberband_context.clearRect(\n", " 0,\n", " 0,\n", " fig.canvas.width / mpl.ratio,\n", " fig.canvas.height / mpl.ratio\n", " );\n", "\n", " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", "};\n", "\n", "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", " // Updates the figure title.\n", " fig.header.textContent = msg['label'];\n", "};\n", "\n", "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", " var cursor = msg['cursor'];\n", " switch (cursor) {\n", " case 0:\n", " cursor = 'pointer';\n", " break;\n", " case 1:\n", " cursor = 'default';\n", " break;\n", " case 2:\n", " cursor = 'crosshair';\n", " break;\n", " case 3:\n", " cursor = 'move';\n", " break;\n", " }\n", " fig.rubberband_canvas.style.cursor = cursor;\n", "};\n", "\n", "mpl.figure.prototype.handle_message = function (fig, msg) {\n", " fig.message.textContent = msg['message'];\n", "};\n", "\n", "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", " // Request the server to send over a new figure.\n", " fig.send_draw_message();\n", "};\n", "\n", "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", " fig.image_mode = msg['mode'];\n", "};\n", "\n", "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", " for (var key in msg) {\n", " if (!(key in fig.buttons)) {\n", " continue;\n", " }\n", " fig.buttons[key].disabled = !msg[key];\n", " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", " if (msg['mode'] === 'PAN') {\n", " fig.buttons['Pan'].classList.add('active');\n", " fig.buttons['Zoom'].classList.remove('active');\n", " } else if (msg['mode'] === 'ZOOM') {\n", " fig.buttons['Pan'].classList.remove('active');\n", " fig.buttons['Zoom'].classList.add('active');\n", " } else {\n", " fig.buttons['Pan'].classList.remove('active');\n", " fig.buttons['Zoom'].classList.remove('active');\n", " }\n", "};\n", "\n", "mpl.figure.prototype.updated_canvas_event = function () {\n", " // Called whenever the canvas gets updated.\n", " this.send_message('ack', {});\n", "};\n", "\n", "// A function to construct a web socket function for onmessage handling.\n", "// Called in the figure constructor.\n", "mpl.figure.prototype._make_on_message_function = function (fig) {\n", " return function socket_on_message(evt) {\n", " if (evt.data instanceof Blob) {\n", " /* FIXME: We get \"Resource interpreted as Image but\n", " * transferred with MIME type text/plain:\" errors on\n", " * Chrome. But how to set the MIME type? It doesn't seem\n", " * to be part of the websocket stream */\n", " evt.data.type = 'image/png';\n", "\n", " /* Free the memory for the previous frames */\n", " if (fig.imageObj.src) {\n", " (window.URL || window.webkitURL).revokeObjectURL(\n", " fig.imageObj.src\n", " );\n", " }\n", "\n", " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", " evt.data\n", " );\n", " fig.updated_canvas_event();\n", " fig.waiting = false;\n", " return;\n", " } else if (\n", " typeof evt.data === 'string' &&\n", " evt.data.slice(0, 21) === 'data:image/png;base64'\n", " ) {\n", " fig.imageObj.src = evt.data;\n", " fig.updated_canvas_event();\n", " fig.waiting = false;\n", " return;\n", " }\n", "\n", " var msg = JSON.parse(evt.data);\n", " var msg_type = msg['type'];\n", "\n", " // Call the \"handle_{type}\" callback, which takes\n", " // the figure and JSON message as its only arguments.\n", " try {\n", " var callback = fig['handle_' + msg_type];\n", " } catch (e) {\n", " console.log(\n", " \"No handler for the '\" + msg_type + \"' message type: \",\n", " msg\n", " );\n", " return;\n", " }\n", "\n", " if (callback) {\n", " try {\n", " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", " callback(fig, msg);\n", " } catch (e) {\n", " console.log(\n", " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", " e,\n", " e.stack,\n", " msg\n", " );\n", " }\n", " }\n", " };\n", "};\n", "\n", "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", "mpl.findpos = function (e) {\n", " //this section is from http://www.quirksmode.org/js/events_properties.html\n", " var targ;\n", " if (!e) {\n", " e = window.event;\n", " }\n", " if (e.target) {\n", " targ = e.target;\n", " } else if (e.srcElement) {\n", " targ = e.srcElement;\n", " }\n", " if (targ.nodeType === 3) {\n", " // defeat Safari bug\n", " targ = targ.parentNode;\n", " }\n", "\n", " // pageX,Y are the mouse positions relative to the document\n", " var boundingRect = targ.getBoundingClientRect();\n", " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", "\n", " return { x: x, y: y };\n", "};\n", "\n", "/*\n", " * return a copy of an object with only non-object keys\n", " * we need this to avoid circular references\n", " * http://stackoverflow.com/a/24161582/3208463\n", " */\n", "function simpleKeys(original) {\n", " return Object.keys(original).reduce(function (obj, key) {\n", " if (typeof original[key] !== 'object') {\n", " obj[key] = original[key];\n", " }\n", " return obj;\n", " }, {});\n", "}\n", "\n", "mpl.figure.prototype.mouse_event = function (event, name) {\n", " var canvas_pos = mpl.findpos(event);\n", "\n", " if (name === 'button_press') {\n", " this.canvas.focus();\n", " this.canvas_div.focus();\n", " }\n", "\n", " var x = canvas_pos.x * mpl.ratio;\n", " var y = canvas_pos.y * mpl.ratio;\n", "\n", " this.send_message(name, {\n", " x: x,\n", " y: y,\n", " button: event.button,\n", " step: event.step,\n", " guiEvent: simpleKeys(event),\n", " });\n", "\n", " /* This prevents the web browser from automatically changing to\n", " * the text insertion cursor when the button is pressed. We want\n", " * to control all of the cursor setting manually through the\n", " * 'cursor' event from matplotlib */\n", " event.preventDefault();\n", " return false;\n", "};\n", "\n", "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", " // Handle any extra behaviour associated with a key event\n", "};\n", "\n", "mpl.figure.prototype.key_event = function (event, name) {\n", " // Prevent repeat events\n", " if (name === 'key_press') {\n", " if (event.which === this._key) {\n", " return;\n", " } else {\n", " this._key = event.which;\n", " }\n", " }\n", " if (name === 'key_release') {\n", " this._key = null;\n", " }\n", "\n", " var value = '';\n", " if (event.ctrlKey && event.which !== 17) {\n", " value += 'ctrl+';\n", " }\n", " if (event.altKey && event.which !== 18) {\n", " value += 'alt+';\n", " }\n", " if (event.shiftKey && event.which !== 16) {\n", " value += 'shift+';\n", " }\n", "\n", " value += 'k';\n", " value += event.which.toString();\n", "\n", " this._key_event_extra(event, name);\n", "\n", " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", " return false;\n", "};\n", "\n", "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", " if (name === 'download') {\n", " this.handle_save(this, null);\n", " } else {\n", " this.send_message('toolbar_button', { name: name });\n", " }\n", "};\n", "\n", "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", " this.message.textContent = tooltip;\n", "};\n", "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", "\n", "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", "\n", "mpl.default_extension = \"png\";/* global mpl */\n", "\n", "var comm_websocket_adapter = function (comm) {\n", " // Create a \"websocket\"-like object which calls the given IPython comm\n", " // object with the appropriate methods. Currently this is a non binary\n", " // socket, so there is still some room for performance tuning.\n", " var ws = {};\n", "\n", " ws.close = function () {\n", " comm.close();\n", " };\n", " ws.send = function (m) {\n", " //console.log('sending', m);\n", " comm.send(m);\n", " };\n", " // Register the callback with on_msg.\n", " comm.on_msg(function (msg) {\n", " //console.log('receiving', msg['content']['data'], msg);\n", " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", " ws.onmessage(msg['content']['data']);\n", " });\n", " return ws;\n", "};\n", "\n", "mpl.mpl_figure_comm = function (comm, msg) {\n", " // This is the function which gets called when the mpl process\n", " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", "\n", " var id = msg.content.data.id;\n", " // Get hold of the div created by the display call when the Comm\n", " // socket was opened in Python.\n", " var element = document.getElementById(id);\n", " var ws_proxy = comm_websocket_adapter(comm);\n", "\n", " function ondownload(figure, _format) {\n", " window.open(figure.canvas.toDataURL());\n", " }\n", "\n", " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", "\n", " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", " // web socket which is closed, not our websocket->open comm proxy.\n", " ws_proxy.onopen();\n", "\n", " fig.parent_element = element;\n", " fig.cell_info = mpl.find_output_cell(\"
\");\n", " if (!fig.cell_info) {\n", " console.error('Failed to find cell for figure', id, fig);\n", " return;\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_close = function (fig, msg) {\n", " var width = fig.canvas.width / mpl.ratio;\n", " fig.root.removeEventListener('remove', this._remove_fig_handler);\n", "\n", " // Update the output cell to use the data from the current canvas.\n", " fig.push_to_output();\n", " var dataURL = fig.canvas.toDataURL();\n", " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", " // the notebook keyboard shortcuts fail.\n", " IPython.keyboard_manager.enable();\n", " fig.parent_element.innerHTML =\n", " '';\n", " fig.close_ws(fig, msg);\n", "};\n", "\n", "mpl.figure.prototype.close_ws = function (fig, msg) {\n", " fig.send_message('closing', msg);\n", " // fig.ws.close()\n", "};\n", "\n", "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", " // Turn the data on the canvas into data in the output cell.\n", " var width = this.canvas.width / mpl.ratio;\n", " var dataURL = this.canvas.toDataURL();\n", " this.cell_info[1]['text/html'] =\n", " '';\n", "};\n", "\n", "mpl.figure.prototype.updated_canvas_event = function () {\n", " // Tell IPython that the notebook contents must change.\n", " IPython.notebook.set_dirty(true);\n", " this.send_message('ack', {});\n", " var fig = this;\n", " // Wait a second, then push the new image to the DOM so\n", " // that it is saved nicely (might be nice to debounce this).\n", " setTimeout(function () {\n", " fig.push_to_output();\n", " }, 1000);\n", "};\n", "\n", "mpl.figure.prototype._init_toolbar = function () {\n", " var fig = this;\n", "\n", " var toolbar = document.createElement('div');\n", " toolbar.classList = 'btn-toolbar';\n", " this.root.appendChild(toolbar);\n", "\n", " function on_click_closure(name) {\n", " return function (_event) {\n", " return fig.toolbar_button_onclick(name);\n", " };\n", " }\n", "\n", " function on_mouseover_closure(tooltip) {\n", " return function (event) {\n", " if (!event.currentTarget.disabled) {\n", " return fig.toolbar_button_onmouseover(tooltip);\n", " }\n", " };\n", " }\n", "\n", " fig.buttons = {};\n", " var buttonGroup = document.createElement('div');\n", " buttonGroup.classList = 'btn-group';\n", " var button;\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", " /* Instead of a spacer, we start a new button group. */\n", " if (buttonGroup.hasChildNodes()) {\n", " toolbar.appendChild(buttonGroup);\n", " }\n", " buttonGroup = document.createElement('div');\n", " buttonGroup.classList = 'btn-group';\n", " continue;\n", " }\n", "\n", " button = fig.buttons[name] = document.createElement('button');\n", " button.classList = 'btn btn-default';\n", " button.href = '#';\n", " button.title = name;\n", " button.innerHTML = '';\n", " button.addEventListener('click', on_click_closure(method_name));\n", " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", " buttonGroup.appendChild(button);\n", " }\n", "\n", " if (buttonGroup.hasChildNodes()) {\n", " toolbar.appendChild(buttonGroup);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = document.createElement('span');\n", " status_bar.classList = 'mpl-message pull-right';\n", " toolbar.appendChild(status_bar);\n", " this.message = status_bar;\n", "\n", " // Add the close button to the window.\n", " var buttongrp = document.createElement('div');\n", " buttongrp.classList = 'btn-group inline pull-right';\n", " button = document.createElement('button');\n", " button.classList = 'btn btn-mini btn-primary';\n", " button.href = '#';\n", " button.title = 'Stop Interaction';\n", " button.innerHTML = '';\n", " button.addEventListener('click', function (_evt) {\n", " fig.handle_close(fig, {});\n", " });\n", " button.addEventListener(\n", " 'mouseover',\n", " on_mouseover_closure('Stop Interaction')\n", " );\n", " buttongrp.appendChild(button);\n", " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", "};\n", "\n", "mpl.figure.prototype._remove_fig_handler = function () {\n", " this.close_ws(this, {});\n", "};\n", "\n", "mpl.figure.prototype._root_extra_style = function (el) {\n", " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", " el.addEventListener('remove', this._remove_fig_handler);\n", "};\n", "\n", "mpl.figure.prototype._canvas_extra_style = function (el) {\n", " // this is important to make the div 'focusable\n", " el.setAttribute('tabindex', 0);\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " } else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "};\n", "\n", "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager) {\n", " manager = IPython.keyboard_manager;\n", " }\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which === 13) {\n", " this.canvas_div.blur();\n", " // select the cell after this one\n", " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", " IPython.notebook.select(index + 1);\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", " fig.ondownload(fig, null);\n", "};\n", "\n", "mpl.find_output_cell = function (html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i = 0; i < ncells; i++) {\n", " var cell = cells[i];\n", " if (cell.cell_type === 'code') {\n", " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", " var data = cell.output_area.outputs[j];\n", " if (data.data) {\n", " // IPython >= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] === html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "};\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel !== null) {\n", " IPython.notebook.kernel.comm_manager.register_target(\n", " 'matplotlib',\n", " mpl.mpl_figure_comm\n", " );\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xx = np.linspace(-4,4,161) # xx so that it doesn't collide with symbolic x\n", "y = f(xx)\n", "z = g(xx,np.log(1/2))\n", "plt.figure()\n", "plt.plot(xx,y, label='$y$')\n", "plt.plot(xx,z, label='$z$')\n", "plt.xlabel('$x$')\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "#### Version Information\n", "`version_information` is from J.R. Johansson (jrjohansson at gmail.com); see Introduction to scientific computing with Python for more information and instructions for package installation.\n", "\n", "`version_information` is installed on the linux network at Bucknell" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "%load_ext version_information" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "application/json": { "Software versions": [ { "module": "Python", "version": "3.7.7 64bit [GCC 7.3.0]" }, { "module": "IPython", "version": "7.16.1" }, { "module": "OS", "version": "Linux 3.10.0 1062.9.1.el7.x86_64 x86_64 with centos 7.7.1908 Core" }, { "module": "numpy", "version": "1.18.5" }, { "module": "matplotlib", "version": "3.3.0" }, { "module": "sympy", "version": "1.6.1" } ] }, "text/html": [ "
SoftwareVersion
Python3.7.7 64bit [GCC 7.3.0]
IPython7.16.1
OSLinux 3.10.0 1062.9.1.el7.x86_64 x86_64 with centos 7.7.1908 Core
numpy1.18.5
matplotlib3.3.0
sympy1.6.1
Fri Aug 07 15:48:46 2020 EDT
" ], "text/latex": [ "\\begin{tabular}{|l|l|}\\hline\n", "{\\bf Software} & {\\bf Version} \\\\ \\hline\\hline\n", "Python & 3.7.7 64bit [GCC 7.3.0] \\\\ \\hline\n", "IPython & 7.16.1 \\\\ \\hline\n", "OS & Linux 3.10.0 1062.9.1.el7.x86\\_64 x86\\_64 with centos 7.7.1908 Core \\\\ \\hline\n", "numpy & 1.18.5 \\\\ \\hline\n", "matplotlib & 3.3.0 \\\\ \\hline\n", "sympy & 1.6.1 \\\\ \\hline\n", "\\hline \\multicolumn{2}{|l|}{Fri Aug 07 15:48:46 2020 EDT} \\\\ \\hline\n", "\\end{tabular}\n" ], "text/plain": [ "Software versions\n", "Python 3.7.7 64bit [GCC 7.3.0]\n", "IPython 7.16.1\n", "OS Linux 3.10.0 1062.9.1.el7.x86_64 x86_64 with centos 7.7.1908 Core\n", "numpy 1.18.5\n", "matplotlib 3.3.0\n", "sympy 1.6.1\n", "Fri Aug 07 15:48:46 2020 EDT" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "version_information numpy, matplotlib, sympy" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "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.7.7" } }, "nbformat": 4, "nbformat_minor": 1 }