Kategória: Python.
Alkategória: Adatkezelés Pythonban.
Table of Contents
|
A SymPy Python csomag szimbolikus számításokra alkalmas. Majd a példákban látni fogjuk, hogy ez mit jelent.
A weboldala ez: https://www.sympy.org/. Ezt az oldalt a https://docs.sympy.org/latest/tutorial/index.html#tutorial alapján készítettem el. Ennek is - ahogy oly sok minden másnak - csak a felszínét érintjük.
Telepítés és használat
Alapvetően kétféle módon lehet használni ezt a csomagot:
- hagyományos Python csomagként,
- interaktív notebook formában.
Hagyományos módszer
A klasszikus módon telepítsük a csomagot:
pip install sympy
Futtassuk le az alábbi kódot:
from sympy import * print(sqrt(9)) # 3
Idáig semmi meglepő: gyököt vont a sympy.sqrt() függvény segítségével. Bár a figyelmes szemlélő számára gyanús lehet, hogy az eredmény 3 és nem 3.0; ez nem véletlen, de ne egyelőre ne rohanjunk előre…
Interaktív notebook használata
Karakteres módban korlátozottak a lehetőségek; képleteket, diagramokat és interaktív elemeket notebook-ok segítségével tudunk létrehozni. Fogalmak:
- IPython (https://ipython.org/): kifejezetten a Python számára készített interaktív parancshéj.
- Jupyter (https://jupyter.org/): nyelvfüggetlen interaktív parancshéj, melynek része az IPython is.
- Anaconda (https://www.anaconda.com/): egy olyan eszköz, melynek segítségével különböző adattudománnyal kapcsolatos szoftverek telepíthetőek és kezelhetőek, többek között a fentiek is.
Az interaktív rendszernek további előnye még az is, hogy a leggyakoribb adattudománnyal kapcsolatos csomagok eleve telepítve vannak.
Indítás:
- Töltsük le az Anacondát a https://www.anaconda.com/products/individual oldalról, és telepítsük fel.
- Indítsuk el az Anaconda Navigator (anaconda3) programot, pl. Windows alatt a Start menüből.
- A Home fülön indítsuk el a Jupyter Notebook-ot a Launch-ra kattintva.
- Böngészőből nyissuk meg a http://localhost:8888/ oldalt
- Hozzunk létre egy új notebook-ot: New → Python3
- Az In [ ]: melletti beviteli mezőbe írjuk be az alábbi két sort (itt tehát nem kell a print(), de eljátszhatunk azzal is, ha oda írjuk):
from sympy import * sqrt(9)
- Kattintsunk felül a Run-ra.
- Ha minden megfelelően zajlott, az alábbihoz hasonló eredményt kell kapnunk:
A vájt szeműek észrevehetik, hogy az eredmény hármas nem teljesen hagyományos karakterként néz ki. Ennek jelentősége lesz hamarosan.
Gyors kitérő: az alábbi módon tudunk Pandas diagramot készíteni Jupyter-ben:
import pandas as pd mydf = pd.DataFrame({ 'id': [1, 2, 3], 'gyümölcs': ['alma', 'banán', 'narancs'], 'érték': [3, 2, 5], }) mydf.plot.bar(x='gyümölcs', y='érték')
Az alábbiakban feltételezzük, hogy valahol beimportáljuk a sympy modult:
from sympy import *
Gyökvonás
A bevezetőben a 9 gyöke "túl kerek" volt; lássuk, mi a helyzet a 8-cal! A "hagyományos" gyökvonás Pythonban így működik:
import math print(math.sqrt(8)) # 2.8284271247461903
Ugyanez Sympy-ban:
import sympy print(sympy.sqrt(8)) # 2*sqrt(2)
Hoppá!
Ugyanez Jupyter-ben:
Hoppá-hoppá! Ez nem kiértékel, hanem szimbolikus számítást hajt végre, egyszerűsít (vagy hát végülis ki tudja…), de talán kezdjük látni most már ennek a csomagnak a lényegét, valamint azt is, hogy miért használunk notebook-ot.
Ha az eredmény hagyományos kiszámolásához az evalf() függvény használható:
sympy.sqrt(8).evalf() # 2.82842712474619
Kiírás
Kiírás alapból
Amint azt fent láttuk, a 8 négyzetgyökének az eredménye alapból ez:
2*sqrt(2)
Formázott kiírás a konzolon
Adjuk ki Python konzolból az alábbi parancsot:
init_printing()
Most írjuk be a gyökvonást:
sqrt(8)
Az eredmény:
2⋅√2
(Néha a szorzásjel nem szépen jelenik meg; minden bizonnyal ez terminál beállítási probléma.)
Notebook-ban
Ugyanezt Jupyter notebook-ban szépen grafikusan megformázza a MathJax formázó segítségével. Fent láttuk már a 8 gyökének ilyen eredményét.
Megjegyzés: az Anaconda Navigator-ból el tudjuk indítani a Qt COnsole nevű programot, és ott konzolon is grafikusan megformázza.
Latex kód generálás
Végül ha a generált Latex kódra vagyunk kíváncsiak, akkor a latex() függvény segítségével tudjuk azt kiíratni:
latex(sqrt(8)) # 2 \sqrt{2}
Furcsa, hogy itt kimarad a szorzásjel… Viszont ezt közvetlenül HTML-be illeszthetjük: $2 \sqrt{2}$.
Kifejezések
Szimbólumok
Ha szimbólumokat (úgymond változókat) szeretnénk használni, akkor azt meg kel mondani a rendszernem a symbols() függvény segítségével. Ha például az x és y szimbólumokat szeretnénk használni, akkor a következőt kell írnunk:
x, y = symbols('x y')
Alapértelmezett szimbólumok
Ha az init_printing() helyett az alábbit használjuk:
init_session()
akkor néhány gyakran használt szimbólumot is kapunk, és a SymPy csomagot is betölti.
Az alábbiakban feltesszük, hogy x és y már létezik szimbólumként.
Zérushelyek
A solve() megkeresi a függvény zérushelyeit:
solve(x**2 - 5*x + 6)
Eredmény:
[2, 3]
Behelyettesítés
A kifejezést értékül tudjuk adni egy másik szimbólumnak:
y = x**2 - 5*x + 6
A subs() függvény segítségével be tudunk helyettesíteni:
y.subs(x, 4)
Az eredmény 2.
Kifejtés
Az expand() függvény kifejti az egyenletet, pl.:
expand((x-3)*(x-2))
Eredmény:
$x^{2} - 5 x + 6$
Egyenletrendszer megoldása
Két egyenletet két ismeretlennel a következőképpen tudunk megoldani:
x, y = symbols('x y') eq1 = Eq(x + y, 7) eq2 = Eq(x - y, 3) solve((eq1, eq2), (x, y))
Az Eq() segítségével adjuk meg az egyenletet; a sima egyenlőségjel nem megfelelő itt.
Az eredmény:
{x: 5, y: 2}
Egyszerűsítés
Az egyenleteket egyszerűsíteni is tudja a simplify() segítségével:
simplify((2*x**2 + 4*x)/2)
Az eredmény:
x*(x + 2)
Tehát kiemelést, osztást el tudott végezni!
Kalkulus
Deriválás
A diff() kiszámolja a paraméterül adott kifejezés (függvény) deriváltát:
diff(x**2 - 3*x + 2)
Ennek eredménye:
2*x - 3
Persze egész "elvadult" függvényekkel is megbirkózik:
diff(cos(x)**ln(x))
Eredmény:
$\left(- \frac{\log{\left(x \right)} \sin{\left(x \right)}}{\cos{\left(x \right)}} + \frac{\log{\left(\cos{\left(x \right)} \right)}}{x}\right) \cos^{\log{\left(x \right)}}{\left(x \right)}$
Integrálszámítás
Integrálni is tud az integrate() függvény segítségével:
integrate(x**2)
Eredménye:
$\frac{x^{3}}{3}$
Ha ki szeretnénk rajzolni az integrált is, akkor azt a következőképpen tudjuk megtenni:
a=Integral(x**2, x) Eq(a, a.doit())
Eredménye:
$\int x^{2}\, dx = \frac{x^{3}}{3}$
Plusz paraméterként megadhatunk határértékeket, és ez esetben határozott integrált kapunk:
integrate(x**2, (x, 0, 3))
Ennek eredménye 9.
Mínusz végtelentől plusz végtelenig is tud integrálni:
integrate(sin(x**2), (x, -oo, oo))
Itt az oo a végtelent jelenti, és ezt a SymPy definiálja. Eredmény:
$\frac{\sqrt{2} \sqrt{\pi}}{2}$
Határérték számítás
Határértéket is számol. Pl.
limit((1+1/x)**x, x, oo)
eredménye $e$.
Összeg határértéke
Sorozat összeget a Sum() függvény segítségével tudunk létrehozni. Végrehajtáshoz kell a doit() hívás. Pl. a klasszikus "ha megeszek egy fél tábla csokit, majd a maradék felét, és így tovább, akkor hány tábla csokit eszek összesen" kérdésre a válasz:
Sum(2**(-x), (x, 1, oo)).doit()
természetesen 1.
Trigonometria
Amint már láttuk, "keni-vágja" a trigonometrikus függvények deriváltját, és nyilván az integrálját is.
Trigonometrikus azonosságok
A trigonometrikus azonosságokkal egyszerűsít:
simplify(sin(x)**2 + cos(x)**2)
Eredmény: 1
Rájön a trigonometrikus azonosságokra:
(cos(x)**2 - sin(x)**2).equals(cos(2*x))
Eredménye igaz.
Kifejtés
Az expand_trig() elvégzi a kifejtést:
expand_trig(cos(2*x))
Eredmény:
$2 \cos^{2}{\left(x \right)} - 1$
Zérushelyek keresése
A trigonometrikus függvények zérushelyeinek a száma tipikusan végtelen vagy üres a ciklikusság miatt. Ezt is jól kezeli:
solveset(cos(x), x, domain=S.Reals)
Eredmény:
$\left\{2 n \pi + \frac{\pi}{2}\; \middle|\; n \in \mathbb{Z}\right\} \cup \left\{2 n \pi + \frac{3 \pi}{2}\; \middle|\; n \in \mathbb{Z}\right\}$
Mátrix műveletek
Tekintsük az alábbi két mátrixot!
M = Matrix([[1, 3], [-2, 4]]) N = Matrix([[3, 2], [3, 5]])
$M = \left[\begin{matrix}1 & 3\\-2 & 4\end{matrix}\right]$
$N = \left[\begin{matrix}3 & 2\\3 & 5\end{matrix}\right]$
Összeadás
M + N
Eredmény:
$\left[\begin{matrix}4 & 5\\1 & 9\end{matrix}\right]$
Szorzás
M * N
Eredmény:
$\left[\begin{matrix}12 & 17\\6 & 16\end{matrix}\right]$
Invertálás
M ** -1
Eredmény:
$\left[\begin{matrix}\frac{2}{5} & - \frac{3}{10}\\\frac{1}{5} & \frac{1}{10}\end{matrix}\right]$
Transzponálás
M.T
Eredmény:
$\left[\begin{matrix}1 & -2\\3 & 4\end{matrix}\right]$
Összefoglalás
A fentiekben ennek is épp, hogy csak a felszínét karcoltuk. Nagy része a matematikának olyan részéhez tartozik, amit én magam sem értek. De talán így is megfelelő képet kaptunk arról, hogy milyen lehetőségek rejlenek ebben a csomagban (is). Akár az olyan professzionális rendszerek vetélytársa lehet, mint pl. a Matlab.