#!/usr/bin/env python # coding: utf-8 # > This is one of the 100 recipes of the [IPython Cookbook](http://ipython-books.github.io/), the definitive guide to high-performance scientific computing and data science in Python. # # # 15.1. Diving into symbolic computing with SymPy # SymPy is a pure Python package for symbolic mathematics. # First, we import SymPy, and enable rich display LaTeX-based printing in the IPython notebook (using the MathJax Javascript library). # In[ ]: from sympy import * init_printing() # With NumPy and the other packages we have been using so far, we were dealing with numbers and numerical arrays. With SymPy, we deal with symbolic variables. It's a radically different shift of paradigm, which mathematicians may be more familiar with. # To deal with symbolic variables, we need to declare them. # In[ ]: var('x y') # The var function creates symbols and injects them into the namespace. This function should only be used in interactive mode. In a Python module, it is better to use the symbol function which returns the symbols. # In[ ]: x, y = symbols('x y') # We can create mathematical expressions with these symbols. # In[ ]: expr1 = (x + 1)**2 expr2 = x**2 + 2*x + 1 # Are these expressions equal? # In[ ]: expr1 == expr2 # These expressions are mathematically equal, but not syntactically identical. To test whether they are equal, we can ask SymPy to simplify the difference algebraically. # In[ ]: simplify(expr1-expr2) # A very common operation with symbolic expressions is substitution of a symbol by another symbol, expression, or a number. # In[ ]: expr1.subs(x, expr1) # In[ ]: expr1.subs(x, pi) # A rational number cannot be written simply as "1/2" as this Python expression evaluates to 0. A possibility is to use a SymPy object for 1, for example using the function S. # In[ ]: expr1.subs(x, S(1)/2) # Exactly-represented numbers can be evaluated numerically with evalf: # In[ ]: _.evalf() # We can transform this *symbolic* function into an actual Python function that can be evaluated on NumPy arrays, using the `lambdify` function. # In[ ]: f = lambdify(x, expr1) # In[ ]: import numpy as np f(np.linspace(-2., 2., 5)) # > You'll find all the explanations, figures, references, and much more in the book (to be released later this summer). # # > [IPython Cookbook](http://ipython-books.github.io/), by [Cyrille Rossant](http://cyrille.rossant.net), Packt Publishing, 2014 (500 pages).