Symbolické počty

V tomto tutoriálu je představen modul Sympy, který slouží k počtům se symbolickou proměnnou v Pythonu. Kód pro import Sympy a nastavení Pylabu následuje.


In [1]:
# inline plots 
%matplotlib inline 
# import sympy
import sympy as sp

Aby bylo možné zobrazit výstup ze Sympy pomocí Latex rovnicí v Jupyter Notebook, následující nastavení musí být provedeno.


In [2]:
sp.init_printing(use_latex='mathjax')

Práce se Sympy

Na začátku je potřeba si vytvořit symbolické proměnné. Příklad následuje.


In [3]:
x, y, z = sp.symbols('x y z')

Od teď je možné proměnné x, y, z (Sympy objekty proměnná) používat při počtech.


In [4]:
sp.Eq(x + y, z) # create equation


Out[4]:
$$x + y = z$$

In [5]:
sp.simplify(x**2 + y - 2*z / (x*z)) # simplify expression


Out[5]:
$$x^{2} + y - \frac{2}{x}$$

Některé funkce Sympy dokáží také pracovat s výrazem/rovnicí zadanou jako text. V tomto případě není potřeba proměnné vytvářet předem. V následujícím příkladu užijeme proměnné a a b, které předtím nijak nedefinujeme!


In [6]:
sp.simplify("a + b**2")


Out[6]:
$$a + b^{2}$$

Některé funkce vrací svůj výsledek ve formě objektu, který je možný následně použít. Ukázáno na příkladu.


In [7]:
f = sp.simplify("a + b**2 / (a*b)") # creation of Sympy object - expression
type(f)


Out[7]:
sympy.core.add.Add

In [8]:
f.cancel()


Out[8]:
$$\frac{1}{a} \left(a^{2} + b\right)$$

Poznámka: alternativní použití podobných funkcí je možno přímo s textem jako argument - příklad následuje:


In [9]:
sp.cancel("a + b**2 / (a*b)")


Out[9]:
$$\frac{1}{a} \left(a^{2} + b\right)$$

Úpravy výrazů

Následují příklady úprav výrazů na výrazu: $\frac{z+\frac{x^3 + 1}{y^2}}{2(1-x)+x^2}$


In [10]:
f = '(1+(x**3+1/x**2))/(2*(1-x)+x**2)'

Zjednodušení výrazu


In [11]:
sp.sympify(f)


Out[11]:
$$\frac{x^{3} + 1 + \frac{1}{x^{2}}}{x^{2} - 2 x + 2}$$

Převedení na kanonickou formu


In [12]:
sp.cancel(f)


Out[12]:
$$\frac{x^{5} + x^{2} + 1}{x^{4} - 2 x^{3} + 2 x^{2}}$$

Rozložení na faktory


In [13]:
sp.factor(f)


Out[13]:
$$\frac{x^{5} + x^{2} + 1}{x^{2} \left(x^{2} - 2 x + 2\right)}$$

Rozklad


In [14]:
sp.expand(f)


Out[14]:
$$\frac{x^{3}}{x^{2} - 2 x + 2} + \frac{1}{x^{4} - 2 x^{3} + 2 x^{2}} + \frac{1}{x^{2} - 2 x + 2}$$

Rozklad na parciální zlomky


In [15]:
fs = sp.simplify(f)
sp.apart(fs)


Out[15]:
$$x + \frac{3 x - 5}{2 x^{2} - 4 x + 4} + 2 + \frac{1}{2 x} + \frac{1}{2 x^{2}}$$

Dosazení hodnoty


In [16]:
fs.subs("x", 5)


Out[16]:
$$\frac{3151}{425}$$

Řešení rovnic

Kořeny rovnice

Následují dva příklady jak získat kořeny rovnice.


In [17]:
f = "x**2 +3*x -4"

In [18]:
sp.roots(f)


Out[18]:
$$\left \{ -4 : 1, \quad 1 : 1\right \}$$

Nebo:


In [19]:
sp.solve(f)


Out[19]:
$$\left [ -4, \quad 1\right ]$$

Řešení soustavy rovnic

Pomocí Sympy je možné zadat soustavu rovnic více způsoby. Následuje příklad jak vytvořit soustavu:

$ a + b = 1 $

$ a^4 = c $

$ b - 5/2 = 3 $

pomocí listu rovnic.


In [20]:
a, b, c = sp.symbols("a, b, c")
equations = [
    sp.Eq(a + b, 1),
    sp.Eq(a**4, c),
    sp.Eq(b - 5/2, 3),
]
sp.solve(equations)


Out[20]:
$$\left [ \left \{ a : -4.5, \quad b : 5.5, \quad c : 410.0625\right \}\right ]$$

Poznámka: všiměte si, že vrácen je slovnik uvnitř listu.


Kalkulus

Derivace


In [21]:
fd = sp.Derivative('2*x*sqrt(1/x)',x)
fd


Out[21]:
$$\frac{d}{d x}\left(2 x \sqrt{\frac{1}{x}}\right)$$

In [22]:
fd.doit()


Out[22]:
$$\sqrt{\frac{1}{x}}$$

Integrál


In [23]:
fi = sp.Integral('2*x*sqrt(1/x)',x)
fi


Out[23]:
$$\int 2 x \sqrt{\frac{1}{x}}\, dx$$

In [24]:
fi.doit()


Out[24]:
$$\frac{4 x^{2}}{3} \sqrt{\frac{1}{x}}$$

Limity


In [25]:
fl = sp.Limit('sin(x)/x', x, 0)
fl


Out[25]:
$$\lim_{x \to 0^+}\left(\frac{1}{x} \sin{\left (x \right )}\right)$$

In [26]:
fl.doit()


Out[26]:
$$1$$

Kreslení grafů

Sympy používá Matplotlib ke kreslení grafů. Samotný Matplotlib a jeho pokročilé možnosti jsou předmětem jiného tutoriálů. Následuje několik jednoduchých příkladů, jak použít Matplotlib skrze Sympy.


In [27]:
sp.plot(x**2)


Out[27]:
<sympy.plotting.plot.Plot at 0xad813d2c>

In [28]:
sp.plot(x**3)


Out[28]:
<sympy.plotting.plot.Plot at 0xad747c8c>

Vektory a Matice


In [29]:
A = sp.Matrix([[x, -1], [3, x], [1, 2]])
A


Out[29]:
$$\left[\begin{matrix}x & -1\\3 & x\\1 & 2\end{matrix}\right]$$

In [30]:
B = sp.Matrix([[1, -1, 0], [3, 2, 4]])
B


Out[30]:
$$\left[\begin{matrix}1 & -1 & 0\\3 & 2 & 4\end{matrix}\right]$$

In [31]:
(A * B)**2


Out[31]:
$$\left[\begin{matrix}\left(- x - 2\right) \left(3 x + 3\right) + \left(x - 3\right)^{2} - 28 & \left(- x - 2\right) \left(x - 3\right) + \left(- x - 2\right) \left(2 x - 3\right) - 12 & 4 x \left(- x - 2\right) - 4 x - 20\\28 x + \left(x - 3\right) \left(3 x + 3\right) + \left(2 x - 3\right) \left(3 x + 3\right) & 12 x + \left(- x - 2\right) \left(3 x + 3\right) + \left(2 x - 3\right)^{2} & 4 x \left(2 x - 3\right) + 20 x - 12\\16 x + 44 & - x + 1 & 12 x + 36\end{matrix}\right]$$

In [32]:
2.5 * (B * A)


Out[32]:
$$\left[\begin{matrix}2.5 x - 7.5 & - 2.5 x - 2.5\\7.5 x + 25.0 & 5.0 x + 12.5\end{matrix}\right]$$

Užitečné konstruktory matic


In [33]:
sp.eye(3)


Out[33]:
$$\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]$$

In [34]:
sp.ones(3,2)


Out[34]:
$$\left[\begin{matrix}1 & 1\\1 & 1\\1 & 1\end{matrix}\right]$$

In [35]:
sp.zeros(2,3)


Out[35]:
$$\left[\begin{matrix}0 & 0 & 0\\0 & 0 & 0\end{matrix}\right]$$

Determinant a charakteristický polynom matice

Následuje ukázka jak získat determinand matice.


In [36]:
C = sp.Matrix([[1, -x, 0], [x, 2, 4], [-3, 2, -4]])
C.det()


Out[36]:
$$- 4 x^{2} + 12 x - 16$$

Následující kód získa charakteristický polynom matice C.


In [37]:
p = C.charpoly()
sp.factor(p)


Out[37]:
$$\lambda^{3} + \lambda^{2} + \lambda x^{2} - 18 \lambda + 4 x^{2} - 12 x + 16$$

Vlastní čísla, vektory

Následují příklady jak spočítat vlastní čísla (eigenvalues) a vlastní vektory (eigenvectors) matice.


In [38]:
D = sp.Matrix([[1, -1], [x, 2]])
D.eigenvals()


Out[38]:
$$\left \{ - \frac{1}{2} \sqrt{- 4 x + 1} + \frac{3}{2} : 1, \quad \frac{1}{2} \sqrt{- 4 x + 1} + \frac{3}{2} : 1\right \}$$

In [39]:
D.eigenvects()


Out[39]:
$$\left [ \left ( - \frac{1}{2} \sqrt{- 4 x + 1} + \frac{3}{2}, \quad 1, \quad \left [ \left[\begin{matrix}\frac{1}{\frac{1}{2} \sqrt{- 4 x + 1} - \frac{1}{2}}\\1\end{matrix}\right]\right ]\right ), \quad \left ( \frac{1}{2} \sqrt{- 4 x + 1} + \frac{3}{2}, \quad 1, \quad \left [ \left[\begin{matrix}\frac{1}{- \frac{1}{2} \sqrt{- 4 x + 1} - \frac{1}{2}}\\1\end{matrix}\right]\right ]\right )\right ]$$

Řešení soustavy rovnic

Hledáme $x$ a $y$ pro následující soustavu rovnic pro jakékoliv $z$:

$ 5x -3y = z $

$ -4x + 3y = 2 $

Pro řešení je soustava nejdříve přepsána maticové podoby:

$AX = B$

kde $X = [x, y]$. Řešení je potom:

$X = A^{-1}B$

Realizace pomocí Sympy následuje:


In [40]:
A = sp.Matrix([[5, -3], [-4, 3]])
B = sp.Matrix([z, 2])
X = A**-1 * B
X


Out[40]:
$$\left[\begin{matrix}z + 2\\\frac{4 z}{3} + \frac{10}{3}\end{matrix}\right]$$