Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 452
Kernel: Python 3 (Anaconda)

Sympy

Sympy je Python biblioteka za simboličku matematiku. Prednost Sympy-ja je što je potpuno napisan u Pythonu (što je katkad i mana). Mi ćemo u nastavku kolegiju obraditi i puno moćniji Sage, koji je CAS u klasi Mathematice i Maplea. No Sage nije biblioteka u Pythonu, već CAS koji koristi Python kao programski jezik.

Korištenje Sympy-ja počinje kao i kod ostalih biblioteka, s importiranjem.

from sympy import *

Da bi dobili lijepi LaTeX\LaTeX izlaz:

from sympy import init_printing init_printing()

Koristit ćemo i interaktivne widgete, pa ih ovdje učitavamo

from IPython.display import display from ipywidgets import interact, fixed, interact_manual import ipywidgets as widgets

Simboličke varijable

Kako je Sympy samo Python paket, trebamo deklarirati koje simbole ćemo koristiti kao simboličke vatrijable. To možemo napraviti na više načina:

x = Symbol('x') # ili x,y,z = symbols('x,y,z') # ili from sympy.abc import x,y,z # ili var(x:z)
(pi + x)**2
(x+π)2\left(x + \pi\right)^{2}
a, b, c = symbols("stranica_a, stranica_b, stranica_c")
type(a)
sympy.core.symbol.Symbol
a
stranicaastranica_{a}
a, b, c = symbols("alpha, beta, gamma") a**2+b**2+c**2
α2+β2+γ2\alpha^{2} + \beta^{2} + \gamma^{2}
symbols("x:5")
(x0,x1,x2,x3,x4)\left ( x_{0}, \quad x_{1}, \quad x_{2}, \quad x_{3}, \quad x_{4}\right )

Možemo navoditi i dodatne pretpostavke:

x = Symbol('x', real=True)
x.is_imaginary
False
x = Symbol('x', positive=True)
x > 0
True\mathrm{True}

Možemo kreirati i apstraktne funkcije:

f = Function('f') f(0)
f(0)f{\left (0 \right )}
g = Function('g')(x) g.diff(x), g.diff(a)
(ddxg(x),0)\left ( \frac{d}{d x} g{\left (x \right )}, \quad 0\right )

Kompleksni brojevi

Imaginarna jedinica se označava s I.

1+1*I
1+i1 + i
I**2
1-1
(x * I + 1)**2
(ix+1)2\left(i x + 1\right)^{2}

Razlomci

Postoje tri numerička tipa: Real, Rational, Integer:

r1 = Rational(4,5) r2 = Rational(5,4)
r1
45\frac{4}{5}
r1+r2
4120\frac{41}{20}
r1/r2
1625\frac{16}{25}
denom(r1)
55

Numerička evaluacija

SymPy može računati u proizvoljnoj točnosti te ima predefinirane matematičke konstante kao: pi, e te oo za beskonačnost.

Funkcija evalf ili metoda N s ulaznom varijablom n računaju izraz na n decimala.

pi.evalf(n=50)
3.14159265358979323846264338327950288419716939937513.1415926535897932384626433832795028841971693993751
y = (x + pi)**2
N(y, 5)
(x+3.1416)2\left(x + 3.1416\right)^{2}

Ukoliko želimo zamijeniti varijablu s konkretnim brojem, to možemo učiniti koristeći funkciju subs:

y.subs(x, 1.5)
(1.5+π)2\left(1.5 + \pi\right)^{2}
N(y.subs(x, 1.5))
21.544382361858721.5443823618587

No subs možemo korisiti i općenitije:

y.subs(x, a+pi)
(α+2π)2\left(\alpha + 2 \pi\right)^{2}

Sympy i Numpy se mogu simultano koristiti:

import numpy
x_vec = numpy.arange(0, 10, 0.1)
y_vec = numpy.array([N(((x + pi)**2).subs(x, xx)) for xx in x_vec])
from matplotlib.pyplot import subplots %matplotlib inline fig, ax = subplots() ax.plot(x_vec, y_vec);
Image in a Jupyter notebook

Efikasniji kod se postiže funkcijom lambdify koja kompajlira Sympy izraz u funkciju:

# prvi argument je lista varijabli funkcije f, u ovom slučaju funckcija je x -> f(x) f = lambdify([x], (x + pi)**2, 'numpy')
y_vec = f(x_vec)

Razlika u brzini izvođenja:

%%timeit y_vec = numpy.array([N(((x + pi)**2).subs(x, xx)) for xx in x_vec])
10 loops, best of 3: 22.6 ms per loop
%%timeit y_vec = f(x_vec)
The slowest run took 19.02 times longer than the fastest. This could mean that an intermediate result is being cached. 1000000 loops, best of 3: 1.73 µs per loop

Ovdje smo mogli koristiti i theano ili uFuncify.

Pretvaranje stringa u Sympy izraz:

string = '1/(x-1) + 1/(x+1) + x + 1' izraz = sympify(string) izraz
x+1+1x+1+1x1x + 1 + \frac{1}{x + 1} + \frac{1}{x - 1}

Jedan interaktivan primjer:

x = Symbol('x') def factorit(n): return display(Eq(x ** n - 1, factor(x ** n - 1)))

Eq kreira matematičke jednakosti, tj. jednadžbe.

factorit(18)
x181=(x1)(x+1)(x2x+1)(x2+x+1)(x6x3+1)(x6+x3+1)x^{18} - 1 = \left(x - 1\right) \left(x + 1\right) \left(x^{2} - x + 1\right) \left(x^{2} + x + 1\right) \left(x^{6} - x^{3} + 1\right) \left(x^{6} + x^{3} + 1\right)
interact(factorit,n=(2,20));
x171=(x1)(x16+x15+x14+x13+x12+x11+x10+x9+x8+x7+x6+x5+x4+x3+x2+x+1)x^{17} - 1 = \left(x - 1\right) \left(x^{16} + x^{15} + x^{14} + x^{13} + x^{12} + x^{11} + x^{10} + x^{9} + x^{8} + x^{7} + x^{6} + x^{5} + x^{4} + x^{3} + x^{2} + x + 1\right)
interact(factorit,n=(1,20,2));
x111=(x1)(x10+x9+x8+x7+x6+x5+x4+x3+x2+x+1)x^{11} - 1 = \left(x - 1\right) \left(x^{10} + x^{9} + x^{8} + x^{7} + x^{6} + x^{5} + x^{4} + x^{3} + x^{2} + x + 1\right)
interact(factorit,n=widgets.widget_int.IntSlider(min=2,max=20,step=1,value=2));
x91=(x1)(x2+x+1)(x6+x3+1)x^{9} - 1 = \left(x - 1\right) \left(x^{2} + x + 1\right) \left(x^{6} + x^{3} + 1\right)

Algebarske manipulacije

together(izraz)
1(x1)(x+1)(x(x1)(x+1)+2x+(x1)(x+1))\frac{1}{\left(x - 1\right) \left(x + 1\right)} \left(x \left(x - 1\right) \left(x + 1\right) + 2 x + \left(x - 1\right) \left(x + 1\right)\right)
cancel(together(izraz))
1x21(x3+x2+x1)\frac{1}{x^{2} - 1} \left(x^{3} + x^{2} + x - 1\right)
(x+1)*(x+2)*(x+3)
(x+1)(x+2)(x+3)\left(x + 1\right) \left(x + 2\right) \left(x + 3\right)
expand((x+1)*(x+2)*(x+3))
x3+6x2+11x+6x^{3} + 6 x^{2} + 11 x + 6

expand prima dodatne argumente. Npr. trig=True:

sin(a+b)
sin(α+β)\sin{\left (\alpha + \beta \right )}
expand(sin(a+b), trig=True)
sin(α)cos(β)+sin(β)cos(α)\sin{\left (\alpha \right )} \cos{\left (\beta \right )} + \sin{\left (\beta \right )} \cos{\left (\alpha \right )}
simplify(sin(a)**2 + cos(a)**2)
11
simplify(cos(x)/sin(x))
1tan(x)\frac{1}{\tan{\left (x \right )}}
f1 = 1/((a+1)*(a+2))
apart(f1)
1α+2+1α+1- \frac{1}{\alpha + 2} + \frac{1}{\alpha + 1}
f2 = 1/(a+2) + 1/(a+3)
together(f2)
2α+5(α+2)(α+3)\frac{2 \alpha + 5}{\left(\alpha + 2\right) \left(\alpha + 3\right)}

Analiza

Deriviranje

y
(x+π)2\left(x + \pi\right)^{2}
diff(y**2, x)
4(x+π)34 \left(x + \pi\right)^{3}

Više derivacije:

diff(y**2, x, x)
12(x+π)212 \left(x + \pi\right)^{2}
diff(y**2, x, 2)
12(x+π)212 \left(x + \pi\right)^{2}
from sympy.abc import x,y,z # ili npr. symbols ('x:z')
f = sin(x*y) + cos(y*z)

Želimo izračunati 3fxy2\frac{\partial^3f}{\partial x \partial y^2}

diff(f, x, 1, y, 2)
x(xycos(xy)+2sin(xy))- x \left(x y \cos{\left (x y \right )} + 2 \sin{\left (x y \right )}\right)
def deriv(f): display(diff(f,x)) interact_manual(deriv, f='x');
sin(x)- \sin{\left (x \right )}

Integracija

f
sin(xy)+cos(yz)\sin{\left (x y \right )} + \cos{\left (y z \right )}
integrate(f, x)
xcos(yz)+{0fory=01ycos(xy)otherwisex \cos{\left (y z \right )} + \begin{cases} 0 & \text{for}\: y = 0 \\- \frac{1}{y} \cos{\left (x y \right )} & \text{otherwise} \end{cases}

Definitni integrali:

integrate(f, (x, -1, 1))
2cos(yz)2 \cos{\left (y z \right )}

Nepravi integrali:

integrate(exp(-x**2), (x, -oo, oo))
π\sqrt{\pi}

Sume i produkti

n = Symbol("n")
Sum(1/n**2, (n, 1, 10))
n=1101n2\sum_{n=1}^{10} \frac{1}{n^{2}}
Sum(1/n**2, (n,1, 10)).evalf()
1.549767731166541.54976773116654
Sum(1/n**2, (n, 1, oo)).evalf()
1.644934066848231.64493406684823
Product(n, (n, 1, 10))
n=110n\prod_{n=1}^{10} n

Limesi

limit(sin(x)/x, x, 0)
11
f
sin(xy)+cos(yz)\sin{\left (x y \right )} + \cos{\left (y z \right )}
diff(f, x)
ycos(xy)y \cos{\left (x y \right )}
f(x,y)x=limh0f(x+h,y)f(x,y)h\frac{\partial f(x,y)}{\partial x} = \lim_{h\to 0}\frac{f(x+h,y)-f(x,y)}{h}
h = Symbol("h")
limit((f.subs(x, x+h) - f)/h, h, 0)
ycos(xy)y \cos{\left (x y \right )}
limit(1/x, x, 0, dir="+")
\infty
limit(1/x, x, 0, dir="-")
-\infty

(Taylorovi) redovi

series(exp(x), x)
1+x+x22+x36+x424+x5120+O(x6)1 + x + \frac{x^{2}}{2} + \frac{x^{3}}{6} + \frac{x^{4}}{24} + \frac{x^{5}}{120} + \mathcal{O}\left(x^{6}\right)

Rastav oko x=1x=1:

series(exp(x), x, 1)
e+e(x1)+e2(x1)2+e6(x1)3+e24(x1)4+e120(x1)5+O((x1)6;x1)e + e \left(x - 1\right) + \frac{e}{2} \left(x - 1\right)^{2} + \frac{e}{6} \left(x - 1\right)^{3} + \frac{e}{24} \left(x - 1\right)^{4} + \frac{e}{120} \left(x - 1\right)^{5} + \mathcal{O}\left(\left(x - 1\right)^{6}; x\rightarrow1\right)
series(exp(x), x, 1, 10)
e+e(x1)+e2(x1)2+e6(x1)3+e24(x1)4+e120(x1)5+e720(x1)6+e5040(x1)7+e40320(x1)8+e362880(x1)9+O((x1)10;x1)e + e \left(x - 1\right) + \frac{e}{2} \left(x - 1\right)^{2} + \frac{e}{6} \left(x - 1\right)^{3} + \frac{e}{24} \left(x - 1\right)^{4} + \frac{e}{120} \left(x - 1\right)^{5} + \frac{e}{720} \left(x - 1\right)^{6} + \frac{e}{5040} \left(x - 1\right)^{7} + \frac{e}{40320} \left(x - 1\right)^{8} + \frac{e}{362880} \left(x - 1\right)^{9} + \mathcal{O}\left(\left(x - 1\right)^{10}; x\rightarrow1\right)
tan(x).series(x,pi/2)
1xπ2π6+145(xπ2)3+2945(xπ2)5+x3+O((xπ2)6;xπ2)- \frac{1}{x - \frac{\pi}{2}} - \frac{\pi}{6} + \frac{1}{45} \left(x - \frac{\pi}{2}\right)^{3} + \frac{2}{945} \left(x - \frac{\pi}{2}\right)^{5} + \frac{x}{3} + \mathcal{O}\left(\left(x - \frac{\pi}{2}\right)^{6}; x\rightarrow\frac{\pi}{2}\right)
s1 = cos(x).series(x, 0, 5) s1
1x22+x424+O(x5)1 - \frac{x^{2}}{2} + \frac{x^{4}}{24} + \mathcal{O}\left(x^{5}\right)
s2 = sin(x).series(x, 0, 2) s2
x+O(x2)x + \mathcal{O}\left(x^{2}\right)
expand(s1 * s2)
x+O(x2)x + \mathcal{O}\left(x^{2}\right)

S metodom removeO se možemo riješiti O\mathcal{O} dijela:

expand(s1.removeO() * s2.removeO())
x524x32+x\frac{x^{5}}{24} - \frac{x^{3}}{2} + x

Ali oprezno s time:

(cos(x)*sin(x)).series(x, 0, 6)
x2x33+2x515+O(x6)x - \frac{2 x^{3}}{3} + \frac{2 x^{5}}{15} + \mathcal{O}\left(x^{6}\right)

Reziduumi:

residue(2/sin(x), x, 0)
22

Linearna algebra

Matrice

m11, m12, m21, m22 = symbols("m11, m12, m21, m22") b1, b2 = symbols("b1, b2")
A = Matrix([[m11, m12],[m21, m22]]) A
[m11m12m21m22]\left[\begin{matrix}m_{11} & m_{12}\\m_{21} & m_{22}\end{matrix}\right]
b = Matrix([[b1], [b2]]) b
[b1b2]\left[\begin{matrix}b_{1}\\b_{2}\end{matrix}\right]
A**2
[m112+m12m21m11m12+m12m22m11m21+m21m22m12m21+m222]\left[\begin{matrix}m_{11}^{2} + m_{12} m_{21} & m_{11} m_{12} + m_{12} m_{22}\\m_{11} m_{21} + m_{21} m_{22} & m_{12} m_{21} + m_{22}^{2}\end{matrix}\right]
A * b
[b1m11+b2m12b1m21+b2m22]\left[\begin{matrix}b_{1} m_{11} + b_{2} m_{12}\\b_{1} m_{21} + b_{2} m_{22}\end{matrix}\right]
def funkcija(A,f): return display(getattr(A,f)()) interact(funkcija,A = fixed(A), f=['det','inv','adjoint','charpoly']);
m11m22m12m21m_{11} m_{22} - m_{12} m_{21}

Rješavanje jednadžbi

solve(x**2 - 1, x)
[1,1]\left [ -1, \quad 1\right ]
solve(x**4 - x**2 - 1, x)
[i12+52,i12+52,12+52,12+52]\left [ - i \sqrt{- \frac{1}{2} + \frac{\sqrt{5}}{2}}, \quad i \sqrt{- \frac{1}{2} + \frac{\sqrt{5}}{2}}, \quad - \sqrt{\frac{1}{2} + \frac{\sqrt{5}}{2}}, \quad \sqrt{\frac{1}{2} + \frac{\sqrt{5}}{2}}\right ]
eq = Eq(x**3 + 2*x**2 + 4*x + 8, 0) eq
x3+2x2+4x+8=0x^{3} + 2 x^{2} + 4 x + 8 = 0
solve(eq, x)
[2,2i,2i]\left [ -2, \quad - 2 i, \quad 2 i\right ]

Sustavi jednadžbi:

solve([x + y - 1, x - y - 1], [x,y])
{x:1,y:0}\left \{ x : 1, \quad y : 0\right \}
solve([x + y - a, x - y - c], [x,y])
{x:α2+γ2,y:α2γ2}\left \{ x : \frac{\alpha}{2} + \frac{\gamma}{2}, \quad y : \frac{\alpha}{2} - \frac{\gamma}{2}\right \}

Više o interaktivnim widgetima možete naučiti preko primjera koji se nalaze ovdje.

from verzije import * from IPython.display import HTML HTML(print_sysinfo()+info_packages('sympy,matplotlib,IPython,numpy, ipywidgets'))
Python verzija3.5.3
kompajlerGCC 4.8.2 20140120 (Red Hat 4.8.2-15)
sustavLinux
broj CPU-a8
interpreter64bit
sympy verzija1.0
matplotlib verzija2.0.0
IPython verzija5.3.0
numpy verzija1.11.3
ipywidgets verzija6.0.0

Zadaci za vježbanje

  1. Napišite funkciju koja prima listu izraza, varijablu i točku, a ispisuje vrijednost svakog izraza s liste u toj točki. Funkcija treba izgledati ovako

def evaluiraj(izrazi, x, x0): """ Za svaki izraz iz izrazi funkcija ispisuje vrijednost izraza za x = x0 """
  1. Izračunajte ddxsin(x)ex,xsin(xy)ex,2xysin(xy)ex.\frac{d}{dx}\sin(x)e^x,\, \frac{\partial}{\partial x}\sin(xy)e^x,\, \frac{\partial^2}{\partial x\partial y}\sin(xy)e^x.

  1. Izraz (x**2 + 3*x + 1)/(x**3 + 2*x**2 + x) pojednostavite do izraza 1/(x**2 + 2*x + 1) + 1/x

  2. Izraz (a**b)**c) pojednostavite do izraza a**(b*c)

  3. Napišite funkciju koja rješava (egzaktno) kvadratnu jednadžbu.

  4. Napišite funkciju koja za ulazne parametre prima funkciju (danu simboličkim izrazom) te točku (tj. broj) a crta danu funkciju i njenu tangentu u danoj točki. Učinite funkciju interaktivnom na način da se može birati funkcija (upisivanjem u polje) te točka (klizačem).

  1. Izračunajte vektorski produkt vektora (a,b,b)(a,b,b) i (b,a,a)(b,a,a)

  2. Riješite Cauchyjev problem u(t)=au(t)+b,u(0)=I\begin{align} u'(t)&=-au(t)+b,\\ u(0)&=I \end{align} i pojednostavite dobijeno rješenje. Ovdje su aa, bb i II nepoznate konstante.

  1. Riješite diferencijalnu jednadžbu y(t)+d2dt2y(t)=0 y(t) + \frac{d^2}{dt^2}y(t) = 0 i nacrtajte partikularna rješenja koristeći sympy modul za crtanje.