{ "metadata": { "name": "", "signature": "sha256:a8af92a8c641e7042d9850c27a420d6398556a582dddc3d5298f6d06777a7900" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Tutorial Brief" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SymPy is symbolic mathematics library written completely in Python and doesn't require any dependencies.\n", "\n", "Finding Help:\n", "\n", "- http://docs.sympy.org/latest/index.html\n", "- http://sympy.org/en/features.html\n", "- http://nbviewer.ipython.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-5-Sympy.ipynb" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "

NumPy

Base N-dimensional array package

SciPy

Fundamental library for scientific computing

Matplotlib

Comprehensive 2D Plotting

IPython

Enhanced Interactive Console

SymPy

Symbolic mathematics

Pandas

Data structures & analysis
\n", "\n", "> ###SymPy is a Python library for symbolic mathematics. It aims to become a full-featured computer algebra system (CAS) while keeping the code as simple as possible in order to be comprehensible and easily extensible. SymPy is written entirely in Python and does not require any external libraries.\n", "> **http://sympy.org/**" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Import SymPy" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sympy import *" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "3 + math.sqrt(3)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "4.732050807568877" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "expr = 3 * sqrt(3)\n", "expr" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "3*sqrt(3)" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "init_printing(use_latex='mathjax')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "expr" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$3 \\sqrt{3}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ " ___\n", "3\u22c5\u2572\u2571 3 " ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "expr = sqrt(8)\n", "expr" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$2 \\sqrt{2}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ " ___\n", "2\u22c5\u2572\u2571 2 " ] } ], "prompt_number": 6 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "`symbols()` & `Symbol()`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x, y = symbols(\"x y\")" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "expr = x**2 + y**2\n", "expr" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$x^{2} + y^{2}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ " 2 2\n", "x + y " ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "expr = (x+y)**3\n", "expr" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\left(x + y\\right)^{3}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ " 3\n", "(x + y) " ] } ], "prompt_number": 9 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Assumptions for symbols" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = Symbol(\"a\")" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "a.is_imaginary" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "b = Symbol(\"b\", integer=True)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "b.is_imaginary" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "False" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "c = Symbol(\"c\", positive=True)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "c.is_positive" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "True" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "c.is_imaginary" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "False" ] } ], "prompt_number": 16 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Imaginary Numbers" ] }, { "cell_type": "code", "collapsed": false, "input": [ "I" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$i$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "\u2148" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "I ** 2" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$-1$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "-1" ] } ], "prompt_number": 18 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "`Rational()`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "Rational(1,3)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{1}{3}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "1/3" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "Rational(1,3) + Rational(1,2)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{5}{6}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "5/6" ] } ], "prompt_number": 20 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Numerical evaluation" ] }, { "cell_type": "code", "collapsed": false, "input": [ "expr = Rational(1,3) + Rational(1,2)\n", "N(expr)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$0.833333333333333$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ "0.833333333333333" ] } ], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "N(pi, 100)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "3.1415926535897932384626433832795028841971693993751058209749445923078164062862\n", "08998628034825342117068" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "pi.evalf(100)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 23, "text": [ "3.1415926535897932384626433832795028841971693993751058209749445923078164062862\n", "08998628034825342117068" ] } ], "prompt_number": 23 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "`subs()`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "expr = x**2 + 2*x + 1\n", "expr" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$x^{2} + 2 x + 1$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ " 2 \n", "x + 2\u22c5x + 1" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "expr.subs(x, 1)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$4$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "4" ] } ], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "expr = pi * x**2\n", "expr" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\pi x^{2}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 26, "text": [ " 2\n", "\u03c0\u22c5x " ] } ], "prompt_number": 26 }, { "cell_type": "code", "collapsed": false, "input": [ "expr.subs(x, 3)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$9 \\pi$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ "9\u22c5\u03c0" ] } ], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "N(_)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$28.2743338823081$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 28, "text": [ "28.2743338823081" ] } ], "prompt_number": 28 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "`factor()` and `expand()`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "expr = (x + y) ** 2\n", "expr" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\left(x + y\\right)^{2}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ " 2\n", "(x + y) " ] } ], "prompt_number": 29 }, { "cell_type": "code", "collapsed": false, "input": [ "expand(expr)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$x^{2} + 2 x y + y^{2}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ " 2 2\n", "x + 2\u22c5x\u22c5y + y " ] } ], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "factor(_)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\left(x + y\\right)^{2}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 31, "text": [ " 2\n", "(x + y) " ] } ], "prompt_number": 31 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "`simplify()`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "expr = (2*x + Rational(1,3)*x + 4) / x\n", "expr" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{1}{x} \\left(\\frac{7 x}{3} + 4\\right)$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 32, "text": [ "7\u22c5x \n", "\u2500\u2500\u2500 + 4\n", " 3 \n", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", " x " ] } ], "prompt_number": 32 }, { "cell_type": "code", "collapsed": false, "input": [ "simplify(expr)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{7}{3} + \\frac{4}{x}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 33, "text": [ "7 4\n", "\u2500 + \u2500\n", "3 x" ] } ], "prompt_number": 33 }, { "cell_type": "code", "collapsed": false, "input": [ "expr = \"(2*x + 1/3*x + 4)/x\"\n", "simplify(expr)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{7}{3} + \\frac{4}{x}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 34, "text": [ "7 4\n", "\u2500 + \u2500\n", "3 x" ] } ], "prompt_number": 34 }, { "cell_type": "code", "collapsed": false, "input": [ "expr = sin(x)/cos(x)\n", "expr" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{\\sin{\\left (x \\right )}}{\\cos{\\left (x \\right )}}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ "sin(x)\n", "\u2500\u2500\u2500\u2500\u2500\u2500\n", "cos(x)" ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "simplify(expr)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\tan{\\left (x \\right )}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 36, "text": [ "tan(x)" ] } ], "prompt_number": 36 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "`apart()` and `together()`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "expr = 1/(x**2 + 2*x)\n", "expr" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{1}{x^{2} + 2 x}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 37, "text": [ " 1 \n", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", " 2 \n", "x + 2\u22c5x" ] } ], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "apart(expr)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$- \\frac{1}{2 x + 4} + \\frac{1}{2 x}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 38, "text": [ " 1 1 \n", "- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\n", " 2\u22c5(x + 2) 2\u22c5x" ] } ], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "together(_)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{1}{x \\left(x + 2\\right)}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ " 1 \n", "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "x\u22c5(x + 2)" ] } ], "prompt_number": 39 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Calculus" ] }, { "cell_type": "code", "collapsed": false, "input": [ "diff(sin(x), x)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\cos{\\left (x \\right )}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 40, "text": [ "cos(x)" ] } ], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "diff(log(x**2 + 1) + 2*x, x)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{2 x}{x^{2} + 1} + 2$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 41, "text": [ " 2\u22c5x \n", "\u2500\u2500\u2500\u2500\u2500\u2500 + 2\n", " 2 \n", "x + 1 " ] } ], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "integrate(cos(x), x)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\sin{\\left (x \\right )}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 42, "text": [ "sin(x)" ] } ], "prompt_number": 42 }, { "cell_type": "code", "collapsed": false, "input": [ "Integral(sin(x), (x,0,pi))" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\int_{0}^{\\pi} \\sin{\\left (x \\right )}\\, dx$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 43, "text": [ "\u03c0 \n", "\u2320 \n", "\u23ae sin(x) dx\n", "\u2321 \n", "0 " ] } ], "prompt_number": 43 }, { "cell_type": "code", "collapsed": false, "input": [ "N(_)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$2.0$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 44, "text": [ "2.00000000000000" ] } ], "prompt_number": 44 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "`Sum()`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "expr = Sum(1/(x**2 + 2*x), (x, 1, 10))\n", "expr" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\sum_{x=1}^{10} \\frac{1}{x^{2} + 2 x}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 45, "text": [ " 10 \n", " ____ \n", " \u2572 \n", " \u2572 1 \n", " \u2572 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", " \u2571 2 \n", " \u2571 x + 2\u22c5x\n", " \u2571 \n", " \u203e\u203e\u203e\u203e \n", "x = 1 " ] } ], "prompt_number": 45 }, { "cell_type": "code", "collapsed": false, "input": [ "expr.doit()" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{175}{264}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 46, "text": [ "175\n", "\u2500\u2500\u2500\n", "264" ] } ], "prompt_number": 46 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "`Product()`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "expr = Product(1/(x**2 + 2*x), (x, 1, 10))\n", "expr" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\prod_{x=1}^{10} \\frac{1}{x^{2} + 2 x}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 47, "text": [ " 10 \n", "\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c \n", "\u2502 \u2502 1 \n", "\u2502 \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "\u2502 \u2502 2 \n", "\u2502 \u2502 x + 2\u22c5x\n", "\u2502 \u2502 \n", " x = 1 " ] } ], "prompt_number": 47 }, { "cell_type": "code", "collapsed": false, "input": [ "expr.doit()" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{1}{869100503040000}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 48, "text": [ "1/869100503040000" ] } ], "prompt_number": 48 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "`Solve()`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "expr = 2*x + 1\n", "solve(expr)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\begin{bmatrix}- \\frac{1}{2}\\end{bmatrix}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 49, "text": [ "[-1/2]" ] } ], "prompt_number": 49 }, { "cell_type": "code", "collapsed": false, "input": [ "expr = x**2 - 1\n", "solve(expr)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\begin{bmatrix}-1, & 1\\end{bmatrix}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 50, "text": [ "[-1, 1]" ] } ], "prompt_number": 50 }, { "cell_type": "code", "collapsed": false, "input": [ "expr_1 = 2*x + y + 3\n", "expr_2 = 2*y - x\n", "solve([expr_1, expr_2],(x,y))" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\begin{Bmatrix}x : - \\frac{6}{5}, & y : - \\frac{3}{5}\\end{Bmatrix}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 51, "text": [ "{x: -6/5, y: -3/5}" ] } ], "prompt_number": 51 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Units" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from sympy.physics import units as u" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 52 }, { "cell_type": "code", "collapsed": false, "input": [ "5. * u.milligram" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$5.0 \\cdot 10^{-6} kg$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 53, "text": [ "5.0e-6\u22c5kg" ] } ], "prompt_number": 53 }, { "cell_type": "code", "collapsed": false, "input": [ "1./2 * u.inch" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$0.0127 m$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 54, "text": [ "0.0127\u22c5m" ] } ], "prompt_number": 54 }, { "cell_type": "code", "collapsed": false, "input": [ "1. * u.nano" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$1.0 \\cdot 10^{-9}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 55, "text": [ "1.00000000000000e-9" ] } ], "prompt_number": 55 }, { "cell_type": "code", "collapsed": false, "input": [ "u.watt" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{kg m^{2}}{s^{3}}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 56, "text": [ " 2\n", "kg\u22c5m \n", "\u2500\u2500\u2500\u2500\u2500\n", " 3 \n", " s " ] } ], "prompt_number": 56 }, { "cell_type": "code", "collapsed": false, "input": [ "u.ohm" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\frac{kg m^{2}}{A^{2} s^{3}}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 57, "text": [ " 2\n", "kg\u22c5m \n", "\u2500\u2500\u2500\u2500\u2500\n", " 2 3\n", "A \u22c5s " ] } ], "prompt_number": 57 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Converting from Kilometers/hours to Miles/hours" ] }, { "cell_type": "code", "collapsed": false, "input": [ "kmph = u.km / u.hour\n", "mph = u.mile / u.hour\n", "\n", "N(mph / kmph)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$1.609344$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 58, "text": [ "1.60934400000000" ] } ], "prompt_number": 58 }, { "cell_type": "code", "collapsed": false, "input": [ "80 * N(mph / kmph)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$128.74752$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 69, "text": [ "128.747520000000" ] } ], "prompt_number": 69 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Working with NumPy / Pandas and Matplotlib" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def sympy_expr(x_val):\n", " expr = x**2 + sqrt(3)*x - Rational(1,3)\n", " return expr.subs(x, x_val)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 59 }, { "cell_type": "code", "collapsed": false, "input": [ "sympy_expr(3)" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$3 \\sqrt{3} + \\frac{26}{3}$$" ], "metadata": {}, "output_type": "pyout", "prompt_number": 60, "text": [ " ___ 26\n", "3\u22c5\u2572\u2571 3 + \u2500\u2500\n", " 3 " ] } ], "prompt_number": 60 }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 61 }, { "cell_type": "code", "collapsed": false, "input": [ "list1 = np.arange(1,1000)\n", "list2 = pd.Series(list1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 62 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit [sympy_expr(item) for item in list1]\n", "%timeit [sympy_expr(item) for item in list2]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 103 ms per loop\n", "10 loops, best of 3: 105 ms per loop" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 63 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit np.vectorize(sympy_expr)(list1)\n", "%timeit list2.apply(sympy_expr)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "10 loops, best of 3: 776 ms per loop\n", "1 loops, best of 3: 1.09 s per loop" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 64 }, { "cell_type": "code", "collapsed": false, "input": [ "expr = x**2 + sqrt(3)*x - Rational(1,3)\n", "\n", "lf = lambdify(x, expr)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 65 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit lf(list1)\n", "%timeit lf(list2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000 loops, best of 3: 242 \u00b5s per loop\n", "100 loops, best of 3: 4.8 ms per loop" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 66 }, { "cell_type": "code", "collapsed": false, "input": [ "fig = plt.figure()\n", "axes = fig.add_subplot(111)\n", "\n", "x_vals = np.linspace(-5.,5.)\n", "y_vals = lf(x_vals)\n", "\n", "axes.grid()\n", "axes.plot(x_vals, y_vals)\n", "\n", "plt.show();" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nREQQHx/P3r17NUflnK+++opXX32V4cOHGzeZcP/+/WzatIns7GwAwsPDadmyZYOv93sB/+STT3j9\n9de57rrrSEtL47333vP3KQNqxYoVxMTEkJSUpDsUv3vuuee45ZZbdIfhsz179tC+ffv645iYGPbs\n2aMxIv8pKSlh27ZtpKam6g7FMQ8++CCPP/54/YWFST7//HPatGnDfffdx9VXX83999/PoUOHGnx9\nk4cR/lBGRgZlZWWnPD916lRqamr47rvvePvtt3n33Xe56667+Oyzz5w4bcD8VH7Tp09n9erV9c+5\n8YqgofymTZtW32OcOnUq55xzDoMHDw50eI4LCwvTHUJAHDhwgIEDB1JQUEBERITucBzx8ssv07Zt\nW1JSUoxczKqmpoatW7fy1FNP0a1bN0aNGkV+fj6PPPLI6b/B3/2cvn37Wl6vt/64Y8eO1jfffOPv\n0wbEjh07rLZt21qxsbFWbGysFR4ebl122WVWeXm57tActWDBAqtHjx7W4cOHdYfiiLfeesvq06dP\n/fG0adOs/Px8jRE5r6qqyurdu7c1e/Zs3aE4avz48VZMTIwVGxtrRUdHW82bN7eGDBmiOyzHlJaW\nWrGxsfXHmzZtsvr379/g6/1ewJ955hlr4sSJlmVZ1s6dO6327dv7+5TamHgTc9WqVVZCQoK1b98+\n3aE4prq62rr88sutzz//3Dp69KhxNzHr6uqsIUOGWKNGjdIdil95vV5rwIABusNwXK9evaydO3da\nlmVZkyZNssaNG9fgax1pofyU7OxssrOzSUxM5JxzzmHx4sX+PqU2Jn40f+CBB6iqqiIjIwOA7t27\n8/TTT2uOyjfh4eE89dRT9OnTh9raWnJycoiPj9cdlmM2b97MkiVLSEpKIiUlBYDp06cbueSzib9z\nhYWF3HPPPVRVVdGxY0cWLFjQ4GtlIo8QQriUebdxhRAiREgBF0IIl5ICLoQQLiUFXAghXEoKuBBC\nuJQUcCGEcCkp4EII4VJSwIUQwqX+H67cpRQGSCAQAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 67 } ], "metadata": {} } ] }