This is one of the 100 recipes of the IPython Cookbook, the definitive guide to high-performance scientific computing and data science in Python.
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).
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.
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.
x, y = symbols('x y')
We can create mathematical expressions with these symbols.
expr1 = (x + 1)**2
expr2 = x**2 + 2*x + 1
Are these expressions equal?
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.
simplify(expr1-expr2)
A very common operation with symbolic expressions is substitution of a symbol by another symbol, expression, or a number.
expr1.subs(x, expr1)
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.
expr1.subs(x, S(1)/2)
Exactly-represented numbers can be evaluated numerically with evalf:
_.evalf()
We can transform this symbolic function into an actual Python function that can be evaluated on NumPy arrays, using the lambdify
function.
f = lambdify(x, expr1)
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, by Cyrille Rossant, Packt Publishing, 2014 (500 pages).