Ismerkedés a sympy modullal

Számos kereskedelmi (Mathematica, Maple) számítógépes algebrai csomag létezik már, melyek bonyolult analitikus formulamanipulációs készséggel rendelkeznek. A sympy csomag egy ingyenes Python-könyvtár, ami lassan használható alternatívát kínál kereskedelmi vetélytársaival szemben. Ebben a notebookban néhány sympy függvénnyel fogunk megismerkedni. Fontos megjegyezni hogy mivel van pár, a sympy függvényeihez hasonló nevű függvény a pylab parancs által importált modulokban, ezért a kellemetlenségek elkerülése végett célszerű mindig külön notebookot indítani a sympy-os problémák megoldásánál!

In [1]:
from sympy import * # a sympy csomag rutinjainak betöltése
init_printing()     # szép kimenet  

Változók, egyenletek és egyenletrendszerek megoldása

Ahhoz, hogy változókat szimbolikusan is manipulálni tudjunk, meg kell mondanunk a Pythonnak, hogy ezentúl tekintsen a változónkra mint valamilyen matematikai formulában előforduló szimbólumra. Ezt a legegyszerűbben így tehetjük meg:

In [2]:
x=symbols('x')

Ezek után az $x$ változót használhatjuk szimbolikus számításokra. Oldjuk meg például a következő egyszerű egyenletet: $$3x=5$$ Ezt a solve függvény segítségével tehetjük meg. A solve függvény első bementete a megoldandó egyenlet 0-ra rendezve, a második pedig a keresett változó:

In [3]:
solve(3*x-5,x)
Out[3]:
$$\left [ \frac{5}{3}\right ]$$

Definiáljunk náhány további változót is!

In [4]:
y,z,a,b,c=symbols('y,z,a,b,c') # Így definiálunk egyszerre több változót

Oldjuk meg most az $$a x+b=y$$ egyenletet $x$ -re!

In [5]:
solve(a*x+b-y,x)
Out[5]:
$$\left [ \frac{1}{a} \left(- b + y\right)\right ]$$

Ha több megoldása is van az egyenletnek, akkor a sympy solve függvénye lehetőség szerint mind a kettőt megtalálja. Jól mutatja ezt a másodfokú egyenlet megoldásának "megtalálása":

In [6]:
solve(a*x**2+b*x+c,x)
Out[6]:
$$\left [ \frac{1}{2 a} \left(- b + \sqrt{- 4 a c + b^{2}}\right), \quad - \frac{1}{2 a} \left(b + \sqrt{- 4 a c + b^{2}}\right)\right ]$$

Természetesen a megoldás nem feltétlenül valós szám! A komplex egységgyököt a sympy I-vel jelöli:

In [7]:
I**2
Out[7]:
$$-1$$

A solve függvényt egyenletrendszerek megoldására is lehet használni. Ilyenkor a nullára rendezett egyenleteket listába foglaljuk. A keresett változókat szintúgy. Oldjuk meg a következő egyenletrendszert az $x$ és $y$ változókra: $$y=x^2+ax-4b$$ $$y=x-b$$ Mivel $x$-ben másodrendű az első egyenlet, ezért két megoldáspárt várunk (A parabola legfeljebb két helyen metszi az egyenest...)

In [8]:
solve([x**2 + a*x - y, x - y - b],[x,y]) # Így kell egyenletrendszert megoldani
Out[8]:
$$\left [ \left ( - \frac{a}{2} - \frac{1}{2} \sqrt{a^{2} - 2 a - 4 b + 1} + \frac{1}{2}, \quad - \frac{a}{2} - b - \frac{1}{2} \sqrt{a^{2} - 2 a - 4 b + 1} + \frac{1}{2}\right ), \quad \left ( - \frac{a}{2} + \frac{1}{2} \sqrt{a^{2} - 2 a - 4 b + 1} + \frac{1}{2}, \quad - \frac{a}{2} - b + \frac{1}{2} \sqrt{a^{2} - 2 a - 4 b + 1} + \frac{1}{2}\right )\right ]$$

A solve függvény kimenete most egy lista, amelynek az elemei a megfelelő $(x,y)$ párok.

Függvényanalízis

A sympy egyik legnagyobb előnye, hogy a Python nyelven belül lehetővé teszi egyszerűbb analízisbeli feladatok elvégzését. Alább a teljesség igénye nélkül összefoglalunk néhány egyszerű függvényt. Vizsgáljuk meg a következő két határértéket: $$\lim_{x\rightarrow 0}\frac{\sin x}{x}=? $$ illetve $$\lim_{x\rightarrow \infty}\frac{1}{1+\mathrm{e}^{-x}}=? $$ A határértéket a limit függvény segítségével tudjuk meghatározni:

In [9]:
limit(sin(x)/x,x,0)# sin(x)/x határértéke az x=0 pontban.
Out[9]:
$$1$$

Ha a végtelenben vagyunk kíváncsiak a határértékre, akkor azt az oo-szimbólummal tudjuk elérni!

In [10]:
limit(1/(1+exp(-x)),x,oo)
Out[10]:
$$1$$

Egy kifejezés deriváltjait a diff függvény segítségével tudjuk meghatározni. Például a $\sin$ függvény első $x$-szerinti deriváltja:

In [11]:
diff(sin(x),x)
Out[11]:
$$\cos{\left (x \right )}$$

A második deriváltat vagy így

In [12]:
diff(sin(x),x,x)
Out[12]:
$$- \sin{\left (x \right )}$$

vagy így, (talán egy kicsit átláthatóbban) írjuk.

In [13]:
diff(sin(x),x,2)
Out[13]:
$$- \sin{\left (x \right )}$$

Természetesen parciális deriváltak elvégzésére is van mód:

In [14]:
diff(sin(x)*cos(y),x,y)
Out[14]:
$$- \sin{\left (y \right )} \cos{\left (x \right )}$$

A magasabb rendű parciális deriváltak legyártása az egyszerű deriváltak általánosításán alapszik:

In [15]:
diff(sin(x)*cos(y),x,2,y,3)
Out[15]:
$$- \sin{\left (x \right )} \sin{\left (y \right )}$$

Az integrate függvény segítségével határozott és határozattlan integrálokat tudunk elvégezni.

Határozzuk meg először az $x^2$ primitív függvényét:

In [16]:
integrate(x**2,x)
Out[16]:
$$\frac{x^{3}}{3}$$

Az $$\int_0^3 x^2\mathrm{d}x$$ határozott integrált pedig az alábbi módon értékelhetjük ki.

In [17]:
integrate(x**2,(x,0,3))
Out[17]:
$$9$$

Természetesen az integrálás során szerepelhetnek a kifejezésben más paraméterek is:

In [18]:
integrate(x**2+y**3,(x,0,3))
Out[18]:
$$3 y^{3} + 9$$

Többváltozós integrált egyszerűen a változók (és ha határozott integrálról van szó, akkor az integrálási határok) egymás után írásával értékelhetünk ki:

A $$\int x^2+y^3 \mathrm{d}x\mathrm{d}y $$ határozatlan integrál:

In [19]:
integrate(x**2+y**3,x,y)
Out[19]:
$$\frac{x^{3} y}{3} + \frac{x y^{4}}{4}$$

A $$\int_0^3\int_{-3}^{5} x^2+y^3 \mathrm{d}x\mathrm{d}y $$ határozott integrál:

In [20]:
integrate(x**2+y**3,(x,0,3),(y,-3,5))
Out[20]:
$$480$$