# Tutorial Brief¶

SymPy is symbolic mathematics library written completely in Python and doesn't require any dependencies.

Finding Help:

#### 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

http://sympy.org/

# Import SymPy¶

In [1]:
from sympy import *

In [2]:
3 + math.sqrt(3)

Out[2]:
4.732050807568877
In [3]:
expr = 3 * sqrt(3)
expr

Out[3]:
3*sqrt(3)
In [4]:
init_printing(use_latex='mathjax')

In [5]:
expr

Out[5]:
$$3 \sqrt{3}$$
In [6]:
expr = sqrt(8)
expr

Out[6]:
$$2 \sqrt{2}$$

# symbols() & Symbol()¶

In [7]:
x, y = symbols("x y")

In [8]:
expr = x**2 + y**2
expr

Out[8]:
$$x^{2} + y^{2}$$
In [9]:
expr = (x+y)**3
expr

Out[9]:
$$\left(x + y\right)^{3}$$

## Assumptions for symbols¶

In [10]:
a = Symbol("a")

In [11]:
a.is_imaginary

In [12]:
b = Symbol("b", integer=True)

In [13]:
b.is_imaginary

Out[13]:
False
In [14]:
c = Symbol("c", positive=True)

In [15]:
c.is_positive

Out[15]:
True
In [16]:
c.is_imaginary

Out[16]:
False

# Imaginary Numbers¶

In [17]:
I

Out[17]:
$$i$$
In [18]:
I ** 2

Out[18]:
$$-1$$

# Rational()¶

In [19]:
Rational(1,3)

Out[19]:
$$\frac{1}{3}$$
In [20]:
Rational(1,3) + Rational(1,2)

Out[20]:
$$\frac{5}{6}$$

# Numerical evaluation¶

In [21]:
expr = Rational(1,3) + Rational(1,2)
N(expr)

Out[21]:
$$0.833333333333333$$
In [22]:
N(pi, 100)

Out[22]:
$$3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068$$
In [23]:
pi.evalf(100)

Out[23]:
$$3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068$$

# subs()¶

In [24]:
expr = x**2 + 2*x + 1
expr

Out[24]:
$$x^{2} + 2 x + 1$$
In [25]:
expr.subs(x, 1)

Out[25]:
$$4$$
In [26]:
expr = pi * x**2
expr

Out[26]:
$$\pi x^{2}$$
In [27]:
expr.subs(x, 3)

Out[27]:
$$9 \pi$$
In [28]:
N(_)

Out[28]:
$$28.2743338823081$$

# factor() and expand()¶

In [29]:
expr = (x + y) ** 2
expr

Out[29]:
$$\left(x + y\right)^{2}$$
In [30]:
expand(expr)

Out[30]:
$$x^{2} + 2 x y + y^{2}$$
In [31]:
factor(_)

Out[31]:
$$\left(x + y\right)^{2}$$

# simplify()¶

In [32]:
expr = (2*x + Rational(1,3)*x + 4) / x
expr

Out[32]:
$$\frac{1}{x} \left(\frac{7 x}{3} + 4\right)$$
In [33]:
simplify(expr)

Out[33]:
$$\frac{7}{3} + \frac{4}{x}$$
In [34]:
expr = "(2*x + 1/3*x + 4)/x"
simplify(expr)

Out[34]:
$$\frac{7}{3} + \frac{4}{x}$$
In [35]:
expr = sin(x)/cos(x)
expr

Out[35]:
$$\frac{\sin{\left (x \right )}}{\cos{\left (x \right )}}$$
In [36]:
simplify(expr)

Out[36]:
$$\tan{\left (x \right )}$$

# apart() and together()¶

In [37]:
expr = 1/(x**2 + 2*x)
expr

Out[37]:
$$\frac{1}{x^{2} + 2 x}$$
In [38]:
apart(expr)

Out[38]:
$$- \frac{1}{2 x + 4} + \frac{1}{2 x}$$
In [39]:
together(_)

Out[39]:
$$\frac{1}{x \left(x + 2\right)}$$

# Calculus¶

In [40]:
diff(sin(x), x)

Out[40]:
$$\cos{\left (x \right )}$$
In [41]:
diff(log(x**2 + 1) + 2*x, x)

Out[41]:
$$\frac{2 x}{x^{2} + 1} + 2$$
In [42]:
integrate(cos(x), x)

Out[42]:
$$\sin{\left (x \right )}$$
In [43]:
Integral(sin(x), (x,0,pi))

Out[43]:
$$\int_{0}^{\pi} \sin{\left (x \right )}\, dx$$
In [44]:
N(_)

Out[44]:
$$2.0$$

# Sum()¶

In [45]:
expr = Sum(1/(x**2 + 2*x), (x, 1, 10))
expr

Out[45]:
$$\sum_{x=1}^{10} \frac{1}{x^{2} + 2 x}$$
In [46]:
expr.doit()

Out[46]:
$$\frac{175}{264}$$

# Product()¶

In [47]:
expr = Product(1/(x**2 + 2*x), (x, 1, 10))
expr

Out[47]:
$$\prod_{x=1}^{10} \frac{1}{x^{2} + 2 x}$$
In [48]:
expr.doit()

Out[48]:
$$\frac{1}{869100503040000}$$

# Solve()¶

In [49]:
expr = 2*x + 1
solve(expr)

Out[49]:
$$\begin{bmatrix}- \frac{1}{2}\end{bmatrix}$$
In [50]:
expr = x**2 - 1
solve(expr)

Out[50]:
$$\begin{bmatrix}-1, & 1\end{bmatrix}$$
In [51]:
expr_1 = 2*x + y + 3
expr_2 = 2*y - x
solve([expr_1, expr_2],(x,y))

Out[51]:
$$\begin{Bmatrix}x : - \frac{6}{5}, & y : - \frac{3}{5}\end{Bmatrix}$$

# Units¶

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

In [53]:
5. * u.milligram

Out[53]:
$$5.0 \cdot 10^{-6} kg$$
In [54]:
1./2 * u.inch

Out[54]:
$$0.0127 m$$
In [55]:
1. * u.nano

Out[55]:
$$1.0 \cdot 10^{-9}$$
In [56]:
u.watt

Out[56]:
$$\frac{kg m^{2}}{s^{3}}$$
In [57]:
u.ohm

Out[57]:
$$\frac{kg m^{2}}{A^{2} s^{3}}$$

## Converting from Kilometers/hours to Miles/hours¶

In [58]:
kmph = u.km / u.hour
mph = u.mile / u.hour

N(mph / kmph)

Out[58]:
$$1.609344$$
In [69]:
80 * N(mph / kmph)

Out[69]:
$$128.74752$$

# Working with NumPy / Pandas and Matplotlib¶

In [59]:
def sympy_expr(x_val):
expr = x**2 + sqrt(3)*x - Rational(1,3)
return expr.subs(x, x_val)

In [60]:
sympy_expr(3)

Out[60]:
$$3 \sqrt{3} + \frac{26}{3}$$
In [61]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

In [62]:
list1 = np.arange(1,1000)
list2 = pd.Series(list1)

In [63]:
%timeit [sympy_expr(item) for item in list1]
%timeit [sympy_expr(item) for item in list2]

1 loops, best of 3: 103 ms per loop
10 loops, best of 3: 105 ms per loop

In [64]:
%timeit np.vectorize(sympy_expr)(list1)
%timeit list2.apply(sympy_expr)

10 loops, best of 3: 776 ms per loop
1 loops, best of 3: 1.09 s per loop

In [65]:
expr = x**2 + sqrt(3)*x - Rational(1,3)

lf = lambdify(x, expr)

In [66]:
%timeit lf(list1)
%timeit lf(list2)

1000 loops, best of 3: 242 µs per loop
100 loops, best of 3: 4.8 ms per loop

In [67]:
fig = plt.figure()