# Symbolické počty
V tomto tutoriálu je představen modul [Sympy](http://www.sympy.org/en/index.html), který slouží k počtům se symbolickou proměnnou v Pythonu. Kód pro import Sympy a nastavení Pylabu následuje.


```python
# 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.


```python
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.


```python
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.


```python
sp.Eq(x + y, z) # create equation
```




$$x + y = z$$




```python
sp.simplify(x**2 + y - 2*z / (x*z)) # simplify expression
```




$$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!


```python
sp.simplify("a + b**2")
```




$$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.


```python
f = sp.simplify("a + b**2 / (a*b)") # creation of Sympy object - expression
type(f)
```




    sympy.core.add.Add




```python
f.cancel()
```




$$\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:


```python
sp.cancel("a + b**2 / (a*b)")
```




$$\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}$


```python
f = '(1+(x**3+1/x**2))/(2*(1-x)+x**2)'
```

### Zjednodušení výrazu


```python
sp.sympify(f)
```




$$\frac{x^{3} + 1 + \frac{1}{x^{2}}}{x^{2} - 2 x + 2}$$



### Převedení na kanonickou formu


```python
sp.cancel(f)
```




$$\frac{x^{5} + x^{2} + 1}{x^{4} - 2 x^{3} + 2 x^{2}}$$



### Rozložení na faktory


```python
sp.factor(f)
```




$$\frac{x^{5} + x^{2} + 1}{x^{2} \left(x^{2} - 2 x + 2\right)}$$



### Rozklad


```python
sp.expand(f)
```




$$\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


```python
fs = sp.simplify(f)
sp.apart(fs)
```




$$x + \frac{3 x - 5}{2 x^{2} - 4 x + 4} + 2 + \frac{1}{2 x} + \frac{1}{2 x^{2}}$$



### Dosazení hodnoty


```python
fs.subs("x", 5)
```




$$\frac{3151}{425}$$



***
## Řešení rovnic
### Kořeny rovnice
Následují dva příklady jak získat kořeny rovnice.


```python
f = "x**2 +3*x -4"
```


```python
sp.roots(f)
```




$$\left \{ -4 : 1, \quad 1 : 1\right \}$$



Nebo:


```python
sp.solve(f)

```




$$\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.


```python
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)
```




$$\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


```python
fd = sp.Derivative('2*x*sqrt(1/x)',x)
fd
```




$$\frac{d}{d x}\left(2 x \sqrt{\frac{1}{x}}\right)$$




```python
fd.doit()
```




$$\sqrt{\frac{1}{x}}$$



### Integrál


```python
fi = sp.Integral('2*x*sqrt(1/x)',x)
fi
```




$$\int 2 x \sqrt{\frac{1}{x}}\, dx$$




```python
fi.doit()
```




$$\frac{4 x^{2}}{3} \sqrt{\frac{1}{x}}$$



### Limity


```python
fl = sp.Limit('sin(x)/x', x, 0)
fl
```




$$\lim_{x \to 0^+}\left(\frac{1}{x} \sin{\left (x \right )}\right)$$




```python
fl.doit()
```




$$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.


```python
sp.plot(x**2)
```


```python
sp.plot(x**3)
```

***
## Vektory a Matice


```python
A = sp.Matrix([[x, -1], [3, x], [1, 2]])
A
```




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




```python
B = sp.Matrix([[1, -1, 0], [3, 2, 4]])
B
```




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




```python
(A * B)**2
```




$$\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]$$




```python
2.5 * (B * A)
```




$$\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


```python
sp.eye(3)
```




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




```python
sp.ones(3,2)
```




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




```python
sp.zeros(2,3)
```




$$\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.


```python
C = sp.Matrix([[1, -x, 0], [x, 2, 4], [-3, 2, -4]])
C.det()
```




$$- 4 x^{2} + 12 x - 16$$



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


```python
p = C.charpoly()
sp.factor(p)
```




$$\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.


```python
D = sp.Matrix([[1, -1], [x, 2]])
D.eigenvals()
```




$$\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 \}$$




```python
D.eigenvects()
```




$$\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:


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




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



38e7de86d64dc306d990dbd044cb8327d7ab91c8
ipynb
Jupyter Notebook
podklady/notebooks/symbolicke-pocty.ipynb
matousc89/PPSI
f4e65d84048a10f4ebb19ae288027046013546e6
MIT
podklady/notebooks/symbolicke-pocty.ipynb
matousc89/PPSI
f4e65d84048a10f4ebb19ae288027046013546e6
MIT
podklady/notebooks/symbolicke-pocty.ipynb
matousc89/PPSI
f4e65d84048a10f4ebb19ae288027046013546e6
MIT
Qwen/Qwen-72B
1. YES
2. YES