# My SymPy Cheat-Sheet¶

## Preliminaries¶

First things first. Load in SymPy, the engine to do symbolic calculations, and optionally IPython "display", which lets you render LaTeX equations in IPython notebooks using MathJax, after you execute the "init-(underscore)-printing" command.
In [2]:
from sympy import *
from IPython.display import display
init_printing(use_latex='mathjax')
%matplotlib inline


## Defining Variables and Scoping¶

Symbolic variables need to be defined before they are used. One can also define the type and scope of the variable. This might allow the SymPy engine to apply additional simplifications.
In [3]:
x, y, z = symbols('x, y, z')
m = symbols('m', integer=True)
f = symbols('f', cls=Function)
a, b = symbols('a, b', real=True, positive=True)


## Algebra¶

In [4]:
expr1 = x + 1

In [5]:
print expr1, type(expr1)

x + 1 <class 'sympy.core.add.Add'>

One can plot the expression to see what it looks like
In [6]:
plot(expr1,(x,0,3),title='simple plot', xlabel='x', ylabel='x+1')

Out[6]:
<sympy.plotting.plot.Plot at 0xb06394ac>
Note that, in general, the python variable "x" is different from the SymPy variable "x". You can use the "subs" command to do substitutions.
In [9]:
expr = x+y**2*sin(x); print expr.subs(x,1)

y**2*sin(1) + 1

You can substitute multiple variables at once
In [11]:
print expr.subs({x:1, y:2})

1 + 4*sin(1)

And in case, you need to do non-sequential substitution:
In [13]:
print expr.subs([(x,y), (y,x)], simultaneous=True)

x**2*sin(y) + y


## Polynomials¶

One can take any polynomial, and write it out in the canonical expanded form using "expand", and back factor them using the command "factor". The iPython command "display" lets you typeset using MathJax.
In [9]:
expandedForm = expand((x+2)*(x-3)); display(expandedForm)

$$x^{2} - x - 6$$
In [10]:
display(factor(expandedForm))

$$\left(x - 3\right) \left(x + 2\right)$$
In [11]:
display(factor(expandedForm + 7 - x))

$$\left(x - 1\right)^{2}$$
If you have an expression with multiple variables, you can "collect" or rewrite it in terms of a particular variable.
In [12]:
expr = x*y + x - 3 + 2*x**2 - z*x**2 + x**3; display(expr)

$$x^{3} - x^{2} z + 2 x^{2} + x y + x - 3$$
In [13]:
collected_expr = collect(expr, x); display(collected_expr)

$$x^{3} + x^{2} \left(- z + 2\right) + x \left(y + 1\right) - 3$$

## Trignometry¶

You can use trig identities (sum and double angle identities) to expand out arguments, or carry out simplifications.
In [14]:
display(expand_trig(sin(x + y))) # uses sum/double angle utilities

$$\sin{\left (x \right )} \cos{\left (y \right )} + \sin{\left (y \right )} \cos{\left (x \right )}$$
In [15]:
display(trigsimp(sin(x)**4 - 2*cos(x)**2*sin(x)**2 + cos(x)**4))  # applies trig identities

$$\frac{1}{2} \cos{\left (4 x \right )} + \frac{1}{2}$$

## Manipulation¶

The multi-purpose simplification command is "simplify"
In [16]:
a = (x + 1)**2
b = x**2 + 2*x + 1
display(simplify(a - b))

$$0$$
In [17]:
c = x**2 - 2*x + 1
display(simplify(a - c))

$$4 x$$

## Calculus¶

These are often extremely handy time-savers.

### Derivatives¶

The generic command is "diff", you can take derivatives of different order, and with respect to different variables
In [18]:
f = (x-1)**m * exp(x); display(f)

$$\left(x - 1\right)^{m} e^{x}$$
Usual first ordered derivative
In [19]:
diff(f,x)

Out[19]:
$$\frac{m \left(x - 1\right)^{m} e^{x}}{x - 1} + \left(x - 1\right)^{m} e^{x}$$
Second and higher order order derivatives
In [20]:
diff(f,x,2)

Out[20]:
$$\left(x - 1\right)^{m} \left(\frac{m^{2}}{\left(x - 1\right)^{2}} + \frac{2 m}{x - 1} - \frac{m}{\left(x - 1\right)^{2}} + 1\right) e^{x}$$

Perhaps you want to write out an expression for Newton's rule, where $$x_{n+1} = x_{n} - \frac{f(x_n)}{f'(x_n)}$$

In [21]:
g = simplify(x - f/diff(f,x)); display(g)

$$\frac{m x + x^{2} - 2 x + 1}{m + x - 1}$$
One can generate LaTeX output to embed in a document easily;
In [22]:
latex(diff(f, x))

Out[22]:
'\\frac{m \\left(x - 1\\right)^{m} e^{x}}{x - 1} + \\left(x - 1\\right)^{m} e^{x}'

### Integrals¶

The generic integration command is integrate. Note that "infinity" is represented as "oo". Here we try the integral $I = \int_{-\infty}^{\infty} \sin x^2 dx$

In [23]:
intg = integrate(sin(x**2), (x, -oo, oo)); display(intg)

$$\frac{\sqrt{2} \sqrt{\pi}}{2}$$

Or perhaps another interesting one $\int_0^1 x^{x} dx$

In [24]:
intg = integrate(x**x, (x, 0, 1)); display(intg); plot(x**x, (x,0,1))

$$\int_{0}^{1} x^{x}\, dx$$
Out[24]:
<sympy.plotting.plot.Plot at 0xb03ca6cc>
It couldn't find a closed for expression for the integral. One can evaluate the integral numerically using "N" or "evalf" modules, and optionally request the number of significant digits.
In [25]:
print intg.evalf(10) # Like N[expr,10] in Mathematica
print N(intg, 30)

0.7834305107
0.783430510712134407059264386527


### Taylor Series and Series Summation¶

"series", lets you carry out a taylor series expansion around a point up to a specified order. The "O" notation can be suppressed if required.
In [26]:
expr = exp(sin(x))
display(expr.series(x, 0, 4))

$$1 + x + \frac{x^{2}}{2} + \mathcal{O}\left(x^{4}\right)$$
In [27]:
display(expr.series(x, 0, 4).removeO())

$$\frac{x^{2}}{2} + x + 1$$
One can also do Taylor series of two variables using a one-liner
In [28]:
expr = sin(x*cos(y)); display(expr)

$$\sin{\left (x \cos{\left (y \right )} \right )}$$
In [29]:
expr.series(x, 0, 3).removeO().series(y, 0, 3).removeO()

Out[29]:
$$- \frac{x y^{2}}{2} + x$$
Another handy command is summation
In [30]:
j = symbols('j',integer=True, positive=True)
expr = summation(j**2, (j,1,m)); display(expr)

$$\frac{m^{3}}{3} + \frac{m^{2}}{2} + \frac{m}{6}$$

## Solve Equations¶

In [31]:
expr = x**2 + 3*x + 2
print solve(expr)

[-2, -1]

In [32]:
expr1 = x + y - 2
expr2 = x - y - 4
print solve([expr1, expr2],(x,y))

{x: 3, y: -1}


## Units¶

In [33]:
from sympy.physics import units as u

In [34]:
print u.watt

kg*m**2/s**3

In [35]:
mph = u.mile / u.hour
mps = u.meter / u.second

In [36]:
print N(mps/mph), "mph = 1 mps"

2.23693629205440 mph = 1 mps