SymPy

Kategória: Python.
Alkategória: Adatkezelés Pythonban.

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:
jupyter.png

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')
diagram.png

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:

sqrt.png

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.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License