{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Symbolic mathematics with Sympy\n", "\n", "[Sympy](http://www.sympy.org/en/index.html) is described as a:\n", "\n", "> \"... Python library for symbolic mathematics.\"\n", "\n", "This means it can be used to:\n", "\n", "- Manipulate symbolic expressions;\n", "- Solve symbolic equations;\n", "- Carry out symbolic Calculus;\n", "- Plot symbolic function.\n", "\n", "It has other capabilities that we will not go in to in this handbook. But you can read more about it here: http://www.sympy.org/en/index.html\n", "\n", "## Manipulating symbolic expressions\n", "\n", "Before we can start using the library to manipulate expressions, we need to import it." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sympy as sym" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above imports the library and gives us access to it's commands using the shortand `sym` which is conventially used.\n", "\n", "If we wanted to get Python to check that $x - x = 0$ we would get an error if we did not tell Python what $x$ was." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is where Sympy comes in, we can tell Python to create $x$ as a symbolic variable:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "x = sym.symbols('x')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can calculate $x - x$:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x - x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can create and manipulate expressions in Sympy. Let us for example verify:\n", "\n", "$$(a + b) ^ 2 = a ^ 2 + 2ab + b ^2$$\n", "\n", "First, we create the symbolic variables $a, b$:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "a, b = sym.symbols('a, b')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's create our expression:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(a + b)**2" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr = (a + b) ** 2 \n", "expr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note** we can get Sympy to use LaTeX so that the output looks nice in a notebook:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "sym.init_printing()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAbBAMAAAA35TSjAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIma7zZnddlTvRIkQMqvFy5UvAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABaElEQVQoFYWSP0sDQRDF34VLSHIXORAs5Qo/QBTTWSicIqJiIVikSWkl16SxSiV2ERELsbASRASblEIgWlid38A/TdpoJTEQ3+7kFkKO3MDO3rz57e7s7QDTrVVpTwfgeDOrKUjOK32nITdWPwUB8oNUJBemIi0Slk+XZBmPamaPbjYp3bmk+slxjwdgLQnBLtVnoLR5uiI7GSofF/dLyQlRGA57yKkTjcVIUV3VPRN9zqTVR4w4NRVtKQfUOazqwbUODGJ36w1AXZi2xHHn2T0dGCTadvk2CyIe8sxzZMvjSLONP+BExCsgO4D+zU4QbFwEwQcT+3CJvBukUEb0JlFc7jqKvPYI4UHRI5pCmFp+1Na4FZXlRg0s5z0dxrv08eqbcnkxO8wcObIgRr5QoVAVkZu53af543Hkpe5T2BEx+QF0zqoJohtCPuldKUliPqPY4mienNgMYoktpVNmseULOuF1Y1L9BzY2Rf4ZABYpAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\left(a + b\\right)^{2}$$" ], "text/plain": [ " 2\n", "(a + b) " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us expand our expression:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHYAAAAWBAMAAADnfXV4AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpmJdu8QRM1mu90yVKvMIHo8AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABu0lEQVQ4EZWSP0vDUBTFbxvyp7Qp0Q+gBUWkg9S6OAjWLq5OojgYBReXFsRNUBwkIIr4CaSDODhUVNxKcXKzg5NQ2qGDboqQIijxJffd21AV2jfknpxzf7mP9wIQLCU9hqLnZ7Zky95JeOmZChoVK7kniSt4tPqC41biXQJ3MFzsjy1G2gw0bJa9CdPlvhtWPYp4jhqVFClZB9OXUm2udEVoZNk9ZYVCa8IsncBxVwa+EUuRq2f0KuonLEkb1AWZfstq5kLGFuzIt4f6s41SsmoZkl/o6HQoxPpG4qh+LtlVz5NKsobLrFKWEbG+oXreG0BkZHRRhn6RrFBxFzOjla8FDcSyAduWIb7Aq8PuZjArHGj4CxHLhrYM0TMmw3MrgJn4az6CBmLZiLrQueVpx7l1HLyTaAowGwdNsIrjHC45TlN8BQ0h1DMoVEWlxXvOU7YPOt4SzWWjkIEGcX4l1kzBAGaf/nx/EctGoQYXphVkwYPYe4A5zNqwcRJExLJh5GIVpYPS3Mj11EQZs1coYU4sG1prZmj+N2t4nlfGbD2PY3nPbISwQNKeu33xTnP/iNBa+zcBLXQsftcPGl9+pvSkZG4AAAAASUVORK5CYII=\n", "text/latex": [ "$$a^{2} + 2 a b + b^{2}$$" ], "text/plain": [ " 2 2\n", "a + 2⋅a⋅b + b " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expr.expand()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we can also get Sympy to produce the LaTeX code for future use:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'a^{2} + 2 a b + b^{2}'" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.latex(expr.expand())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "**EXERCISE** Use Sympy to verify the following expressions:\n", "\n", "- $(a - b) ^ 2 = a ^ 2 - 2 a b + b^2$\n", "- $a ^ 2 - b ^ 2 = (a - b) (a + b)$ (instead of using `expand`, try `factor`)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solving symbolic equations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use Sympy to solve symbolic expression. For example let's find the solution in $x$ of the quadratic equation:\n", "\n", "$$a x ^ 2 + b x + c = 0$$" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# We only really need to define `c` but doing them all again.\n", "a, b, c, x = sym.symbols('a, b, c, x') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Sympy command for solving equations is `solveset`. The first argument is an expression for which the root will be found. The second argument is the value that we are solving for." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left\\{- \\frac{b}{2 a} - \\frac{1}{2 a} \\sqrt{- 4 a c + b^{2}}, - \\frac{b}{2 a} + \\frac{1}{2 a} \\sqrt{- 4 a c + b^{2}}\\right\\}$$" ], "text/plain": [ "⎧ _____________ _____________⎫\n", "⎪ ╱ 2 ╱ 2 ⎪\n", "⎨ b ╲╱ -4⋅a⋅c + b b ╲╱ -4⋅a⋅c + b ⎬\n", "⎪- ─── - ────────────────, - ─── + ────────────────⎪\n", "⎩ 2⋅a 2⋅a 2⋅a 2⋅a ⎭" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.solveset(a * x ** 2 + b * x + c, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "**EXERCISE** Use Sympy to find the solutions to the generic cubic equation:\n", "\n", "$$a x ^ 3 + b x ^ 2 + c x + d = 0$$\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is possible to pass more arguments to `solveset` for example to constrain the solution space. Let us see what the solution of the following is in $\\mathbb{R}$:\n", "\n", "$$x^2=-1$$" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAASBAMAAACQmVJ4AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAu1SJds0i3ZlEEO9mMqs+5asqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAa0lEQVQIHWNgYGBgBGImE0MgacLgysDAVsAg6MDA0sBQWcDA6MDZ9YuB+wDHrL8M/AfYGX4y8CskMnwCsn2AJPeBKKAIu1cB118GPiMD3g8MPHIXeAQYGMoZWCcwMKhnmQDNtJmTACQVgBgAel4WPlvNWewAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\emptyset$$" ], "text/plain": [ "∅" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.solveset(x ** 2 + 1, x, domain=sym.S.Reals)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "**EXERCISE** Use Sympy to find the solutions to the following equations:\n", "\n", "- $x ^ 2 == 2$ in $\\mathbb{N}$;\n", "- $x ^ 3 + 2 x = 0$ in $\\mathbb{R}$.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Symbolic calculus\n", "\n", "We can use Sympy to compute limits. Let us calculate:\n", "\n", "$$\\lim_{x\\to 0^+}\\frac{1}{x}$$" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAALBAMAAABv+6sJAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEKvvZom7mXYyzVQi3UQ6SGZXAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAaklEQVQIHWNgYBBgAAIQwaj82YGBIayogYGBbQLHLwapDQxTGRg8GRj2J6xkYGA5wACUYP0LJBgcQEyGfBDRAGYm/wNqd2BwZGDgiDE+wMBxgIGdgSGcYb4dgytQolxtAwNjvXEAUDncNgBJUBUwaYAbUgAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\infty$$" ], "text/plain": [ "∞" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.limit(1/x, x, 0, dir=\"+\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "**EXERCISE** Compute the following limits:\n", "\n", "1. $\\lim_{x\\to 0^-}\\frac{1}{x}$\n", "2. $\\lim_{x\\to 0}\\frac{1}{x^2}$\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use also Sympy to differentiate and integrate. Let us experiment with differentiating the following expression:\n", "\n", "$$x ^ 2 - \\cos(x)$$" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGYAAAAUBAMAAACNG1WbAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12VGZoascqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB10lEQVQ4EY2TP0gbURzHv8flmnBekgMdJEMbROgmEVcxWQXFG0oz1OEcuhQhIogdSnUOglki/lncVaLo0DZDjkDaoaHaQpcOklmhleKfIhb9Pu7eixGi/uDufb+/3/vkvfvlPeCRoTX8iTEb0HoGMu2wYa9Z6ZRyAniJ8D9p745jU83MjpSvgNfAirRijHq3ndKxpJRhD6tALiM9xzaMyc/wwyig4rRnujJyIhJK4YOQJceoTyy887NynZHDr1raDX3srU+KQpXP+OfuLx4wTRm5QBZH3gYlI2CMFEx0uDAH8UxsawgwpmKb5jZwTGu6mMGc810QiokUYUF3oRcQbzC9BYSd8FmU/C/aHsDBLgXT5fKntXLZpSwN2tDJbCPu0S5zHXSkqDAGWEkhrsRLhPyebOUvdDIpxcBXgvkBzUboVMwXETCagz/zepPh3rhCRrzzCCVh2T+tE9SEVwzRJw29ybAHUWcfliN6kJidfhP5r5/IMxisEy1Ct7kxuTc2ePEgjaf81eeoXF9fGpO16m86EQETef/tbSh3/iJ3PppeYjrPk1kf72tQ7vFpjYBpTfIPYZP90NalUqOhiiolRMsZbancY/pljXfhsaHunIIfJmVfebdvAGE5bm6nhG4bAAAAAElFTkSuQmCC\n", "text/latex": [ "$$2 x + \\sin{\\left (x \\right )}$$" ], "text/plain": [ "2⋅x + sin(x)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.diff(x ** 2 - sym.cos(x), x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly we can integrate:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGgAAAAvBAMAAAD9b5JGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsyme8Q6PJIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB+UlEQVRIDZ1UPUhbURg9L31Jni8JPhRKBZGHgsVBDOLuHfoHVczYqQbFOkghmzhZOrWCKKLgIDVbOwYpdMzD0cEIQjtowVCcCqXVQSuI3pu87z1Je5N8+SB8J/c7h/Nxc0+Aak0dOj5qvqVyqULzbJ+ZysZ/s0VAC05Aj8d3iqzxNS2uZ16xrXo884ItskSkzBF19D3ud5NT04IhMrLxt9YqQ6CoMSf2xxZMkYE2/qsD2l2mj6KXPLbIdoYQcZiyyXwRT5kadPZ2fMs1IzJ9Vlw0YO+7IeE5wRECml7KhoN1gl0EGvf4AXFiLqGG3RJEMU4I/b+PecH5swBhI4S1aPfjgFlMJz8c9w6r0aD8VAIBvK6lBt+NAiy0pWHtYELI0y8ABWIhINWCaBkRJNJInKBd/UJLYSA+4SYsOTI238l670m4siMqotXqiz6VQz8QJTnV1P3t64qoEIgoEHqR6WAxo9bzRXI9CsQLjQ1gu7iXuyOSF0GB0F+EXUZCSBtykvdMgfiqdYrOPpxJjp53j57vFX9IltyJArGlROarubzqdSt8RuYbRRyH3fjvtfbBDuVxqcT16zONq9F4mTH+0om+ByEkdRPr4Z+4P8jqHXSTJ8uOblTnPCafI79+sa0eAcU81+jGaUH0UyZOcJ3mYZ9xNYh+P8qwRLc2bXTDRdfrVgAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\frac{x^{3}}{3} - \\sin{\\left (x \\right )}$$" ], "text/plain": [ " 3 \n", "x \n", "── - sin(x)\n", "3 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.integrate(x ** 2 - sym.cos(x), x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also carry out definite integrals:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIYAAAAqBAMAAACEiT43AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMnZUZrtE7yKJmatywa77AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACZUlEQVRIDaWUTWgTURDH/5vUbdJN0qV600MIevCDGhA8iF8XPQilQRAPIg2ICJ6CIIKXVrB48JAFb15Mb+rBLuhBqKHBiwpVI/TQg5a9FA8iIX4gonadefvSdXcbsx8D+/a92Znfzry3/wXiWnPlJrBLn6jGBFzWoVh4a2De/h0PoXzu6CjoGGlg35oZjwFMEaCMwjdYcQmCkeomZ1AB6S4+Xl2OWwn1QnavhRtYNGJCHMZRzs6UkzDybc7O/0rCOA8Uisj9TMBQ21gYKSLfTcCYAM7l6XCK8Rna4aXVstbGdfN/DK0mng4Hg1bnx2sp27bLaL55F0Ccqriup1KWn1xXqNlkyw3bC0eWY64r6my4DUeWuV5tF6MikKZ9sDhLafBIFpLx5LiI5uExXRZPsFuMoRgnLp3W6tbQnuUza5xEn6GU5evQDGUGaaQspGexSG3gFl2OLK+EZmTnsAUZC5kGRmuUdVBksiwvDGKMHWDbSWHHZk3BKGK0QssHIpNlOcmz56XSoVJpnKf0dXmMfdJ27P8jGDMbDClLwaCgweei6Zg2uBfJoF6kLO/IlwxmqBUUav8waE+lLMPvqTqHjElF9OqgE5WyfB+6juyLs6+GOuvbOusn648oiztwZMkbzja4FyfOHflbF6bR8QrzMrSll1X5oO+NNSdsQ3PbPbFNqD88js0Wt6Wzj/anqvi6WZrHR/8gYT2W5yFw11C++FzBZf9/oYwN0UuQ6vNsbfkc0ZfPjujRk/wZOUeWfne09cOkhSwA9Wq0dwaibT054z79tcwAOZrjGtTv0TKC0dkPK4bj/QtIgKcpZ5vQfAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$- \\sin{\\left (5 \\right )} + \\frac{125}{3}$$" ], "text/plain": [ "-sin(5) + 125/3" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.integrate(x ** 2 - sym.cos(x), (x, 0, 5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "**EXERCISE** Use Sympy to calculate the following:\n", "\n", "1. $\\frac{d\\sin(x ^2)}{dx}$\n", "2. $\\frac{d(x ^2 + xy - \\ln(y))}{dy}$\n", "3. $\\int e^x \\cos(x)\\;dx$\n", "4. $\\int_0^5 e^{2x}\\;dx$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting with Sympy\n", "\n", "Finally Sympy can be used to plot functions. Note that this makes use of another Python library called [matplotlib](http://matplotlib.org/). Whilst Sympy allows us to not directly need to make use of matplotlib it could be worth learning to use as it's a very powerful and versatile library.\n", "\n", "Before plotting in Jupyter we need to run a command to tell it to display the plots directly in the notebook:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us plot $x^2$:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "tags": [ "nbval-ignore-output" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "expr = x ** 2\n", "p = sym.plot(expr);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can directly save that plot to a file if we wish to:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "tags": [ "nbval-ignore-output" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p.save(\"x_squared.pdf\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "**EXERCISE** Plot the following functions:\n", "\n", "- $y=x + cos(x)$\n", "- $y=x ^ 2 - e^x$ (you might find `ylim` helpful as an argument)\n", "\n", "Experiment with saving your plots to a file.\n", "\n", "---\n", "\n", "## Summary\n", "\n", "This section has discussed using Sympy to:\n", "\n", "- Manipulate symbolic expressions;\n", "- Calculate limits, derivates and integrals;\n", "- Plot a symbolic expression.\n", " \n", "This just touches the surface of what Sympy can do.\n", "\n", "Let us move on to using [Numpy](02 - Linear algebra with Numpy.ipynb) to do Linear Algebra." ] } ], "metadata": { "anaconda-cloud": {}, "celltoolbar": "Tags", "kernelspec": { "display_name": "Python [conda env:mwp]", "language": "python", "name": "conda-env-mwp-py" }, "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.0" } }, "nbformat": 4, "nbformat_minor": 1 }