2017年12月31日 星期日

天母圓環切仔麵

要等
外面等一次
裡面又等一次
效率很低,下次不吃

2017年12月26日 星期二

sympy quick tutorial & example


SymPy notebook

This is a note about learning SymPy library

http://docs.sympy.org/latest/index.html

import sympy and other library

In [1]:
import sympy
import numpy as np
import matplotlib.pyplot as plt
sympy.plotting
%matplotlib inline

pretty printing (as latex) setting

In [2]:
sympy.init_printing()

define variables

In [3]:
x, y, k, t = sympy.symbols('x y k t')

symbolic expression

sqrt example

In [4]:
sympy.sqrt(9)
Out[4]:
$$3$$
In [5]:
sympy.sqrt(8)
Out[5]:
$$2 \sqrt{2}$$

derivative

In [6]:
expr = sympy.sin(k*x)
expr
Out[6]:
$$\sin{\left (k x \right )}$$
In [7]:
sympy.diff(expr, x)
Out[7]:
$$k \cos{\left (k x \right )}$$
In [8]:
sympy.diff(expr, x, x)
Out[8]:
$$- k^{2} \sin{\left (k x \right )}$$

integrate

In [9]:
expr = sympy.exp(x)*sympy.sin(x) + sympy.exp(x)*sympy.cos(x)
expr
Out[9]:
$$e^{x} \sin{\left (x \right )} + e^{x} \cos{\left (x \right )}$$
In [10]:
sympy.integrate(expr, x)
Out[10]:
$$e^{x} \sin{\left (x \right )}$$
In [11]:
expr = sympy.sin(sympy.pi*x)
expr
Out[11]:
$$\sin{\left (\pi x \right )}$$
In [12]:
sympy.integrate(expr, (x, 0, 1))
Out[12]:
$$\frac{2}{\pi}$$

limit

In [13]:
sympy.limit(sympy.sin(2*x)/x, x, 0)
Out[13]:
$$2$$

slove equation

In [14]:
sympy.solve(x**2 - 2, x)
Out[14]:
$$\left [ - \sqrt{2}, \quad \sqrt{2}\right ]$$

ODE

In [15]:
sympy.Eq(y(t).diff(t, t) - y(t))
Out[15]:
$$- y{\left (t \right )} + \frac{d^{2}}{d t^{2}} y{\left (t \right )} = 0$$
In [16]:
sympy.dsolve(sympy.Eq(y(t).diff(t, t) - y(t), sympy.exp(t)), y(t))
Out[16]:
$$y{\left (t \right )} = C_{2} e^{- t} + \left(C_{1} + \frac{t}{2}\right) e^{t}$$
In [17]:
eq = sympy.Eq(y(t).diff(t) - y(t))
In [18]:
sympy.dsolve(eq, y(t))
Out[18]:
$$y{\left (t \right )} = C_{1} e^{t}$$

print latex forma

In [19]:
sympy.latex(sympy.Integral(sympy.cos(x)**2, (x, 0, sympy.pi)))
Out[19]:
'\\int_{0}^{\\pi} \\cos^{2}{\\left (x \\right )}\\, dx'
In [20]:
%%latex
$\int_{0}^{\pi} \cos^{2}{\left (x \right )}\, dx$
$\int_{0}^{\pi} \cos^{2}{\left (x \right )}\, dx$
In [21]:
pwd
Out[21]:
'/Users/ap9035/Documents/ScientificComputing/sympy'

substitute symbol with value

In [22]:
expr = x+y**2
expr
Out[22]:
$$x + y^{2}$$

method 1

In [23]:
expr.subs({x:2, y:3})
Out[23]:
$$11$$

method 2

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

method 3

In [25]:
expr.subs([(x, 2), (y, 3)])
Out[25]:
$$11$$

Symbolic Equation

using sympy.Eq to create equation

In [26]:
eq1 = sympy.Eq(x**2, 1)
eq1
Out[26]:
$$x^{2} = 1$$
In [27]:
sympy.solve(eq1, x)
Out[27]:
$$\left [ -1, \quad 1\right ]$$

Equals signs

In [28]:
eq1 = (x+y)**2
eq1
Out[28]:
$$\left(x + y\right)^{2}$$
In [29]:
eq2 = x**2+2*x*y+y**2
eq2
Out[29]:
$$x^{2} + 2 x y + y^{2}$$
In [30]:
sympy.simplify(eq1-eq2)
Out[30]:
$$0$$
In [31]:
eq1.equals(eq2)
Out[31]:
True

Cover string to SymPy expressions

In [32]:
# a and b must define first
a, b = sympy.symbols('a b')
express_string = "a**2+b**2+5"
expr = sympy.simplify(express_string)
In [33]:
expr
Out[33]:
$$a^{2} + b^{2} + 5$$
In [34]:
expr.subs(a, 2)
Out[34]:
$$b^{2} + 9$$

Evaluate SymPy expressions into float number

In [35]:
expr.subs([(a, 2), (b, 3)]).evalf()
Out[35]:
$$18.0$$
In [36]:
sympy.pi.evalf(100)
Out[36]:
$$3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068$$

lambdify

In [37]:
expr = a**2+b
expr
Out[37]:
$$a^{2} + b$$
In [38]:
f = sympy.lambdify([a, b], expr, "numpy")
In [39]:
a = np.arange(5)
b = 1
print(a)
print(b)
f(a, b)
[0 1 2 3 4]
1
Out[39]:
array([ 1,  2,  5, 10, 17])
In [40]:
p1 = sympy.plotting.plot(x**3)
p2 = sympy.plotting.plot(sympy.sin(x))
p3 = sympy.plotting.plot(sympy.sin(x), sympy.cos(x))
p3[0].line_color = 'green'
p3[1].line_color = 'red'
p3.xlabel='x'
p3.ylabel='y'
p3.show()

sympy.stats.Die(name, items)

Create a dice which have [items] face

In [41]:
from sympy.stats import Die, density, Normal, Uniform
from sympy import symbols, Symbol
In [42]:
D6 = Die('D6', 6)
density(D6).dict
Out[42]:
$$\left \{ 1 : \frac{1}{6}, \quad 2 : \frac{1}{6}, \quad 3 : \frac{1}{6}, \quad 4 : \frac{1}{6}, \quad 5 : \frac{1}{6}, \quad 6 : \frac{1}{6}\right \}$$

sympy.stats.Normal(name, mean, std)

normal distrubution

In [43]:
z, mu = symbols('z mu')
sigma = Symbol("sigma", positive=True)
X = Normal("X", mu, sigma)
expr = density(X)(z)
expr
Out[43]:
$$\frac{\sqrt{2}}{2 \sqrt{\pi} \sigma} e^{- \frac{\left(- \mu + z\right)^{2}}{2 \sigma^{2}}}$$
In [44]:
ee = expr.subs([(mu, 0), (sigma, 5)])
sympy.plot(ee, (z, -30, 30))
ee.subs(z, 5)
Out[44]:
$$\frac{\sqrt{2}}{10 \sqrt{\pi} e^{\frac{1}{2}}}$$
In [45]:
sympy.integrate(expr, (z, -sympy.oo, mu))
Out[45]:
$$\frac{1}{2}$$

Uniform distrubution

In [46]:
a = Symbol("a", negative=True)
b = Symbol("b", positive=True)
X = Uniform("x", a, b)
expr = density(X)(x)
expr
Out[46]:
$$\begin{cases} \frac{1}{- a + b} & \text{for}\: a \leq x \wedge x \leq b \\0 & \text{otherwise} \end{cases}$$
In [47]:
sympy.integrate(expr, (x, a, b))
Out[47]:
$$- \frac{a}{- a + b} + \frac{b}{- a + b}$$
In [48]:
sympy.simplify(sympy.integrate(expr, (x, a, b)))
Out[48]:
$$1$$
In [49]:
expr2 = expr.subs([(a, 0), (b, 10)])
expr2
Out[49]:
$$\begin{cases} \frac{1}{10} & \text{for}\: 0 \leq x \wedge x \leq 10 \\0 & \text{otherwise} \end{cases}$$
In [50]:
sympy.simplify(expr2)
print(type(expr2))
Piecewise