In [1]:
from __future__ import unicode_literals #ékezetes betűk

Egszerű egyenletrendszerek analitikus megoldása

Az alábbi példákban a sympy csomag formula manipulációs készségeivel fogunk egy kicsit megismerkedni.

In [2]:
from sympy import * # a sympy csomag rutinjainak betöltése
init_printing()     # "szép" kimenet kérése, próbáljátok ki mi történik ha ezt a sort kiveszitek!

Ahogy már az integrálós példákból is láttuk, ahoz 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 leg egyszerűbben így tehetjük meg:

In [3]:
x = Symbol('x') # Az x változó legyen "matematikai szimbólum" !!!

Ezek után már használhatjuk sympy rutinok által manipulált formulákban az x-et mint változót. Oldjuk meg például az $$x^2-3x+2=0$$ másod fokú egyenletet! Ezt legegyszerűbben a solve rutin segítségével tudjuk megtenni:

In [4]:
solve(x**2-3*x+2,x) #Egyenleteket a solve parancsal oldunk meg.
#figyeljük meg hogy az első bemenetre a megoldandó egyenlet 0-ra rendezett alakja kerül 
#a második bemenet pedig az a változó amire meg akarjuk oldani az egyenletet.
Out[4]:
$$\begin{bmatrix}1, & 2\end{bmatrix}$$

A megoldások természetesen lehetnek komplex-ek is például:

In [6]:
x = Symbol('x')
solve(x**2+1,x)
Out[6]:
$$\begin{bmatrix}- i, & i\end{bmatrix}$$

Előfordul sokszr hogy bizonyos változókról biztosan hogy valósak (azaz nincs képzetes részük), esetleg pozitívak például két test távolsága, vagy egy test tömege. Ekkor a Symbol() rutinnal közölhetjük ezeket a tulajdonságokat:

In [7]:
x = Symbol('x',positive=True) # legyen x változó pozitív
solve(x**2-1,x) # Ennek az egyenletnek +1 és -1 is megoldása de mi csak a pozitívokat fogadjuk el!!
Out[7]:
$$\begin{bmatrix}1\end{bmatrix}$$
In [8]:
x = Symbol('x',real=True) # legyen x valós
solve(x**2+1,x) # itt +i és -i a megoldás, de nekünk egyik se jó ilyenkor az eredmény egy üres list
Out[8]:
$$\begin{bmatrix}\end{bmatrix}$$

Egyszerre több változót is definiálhatunk:

In [9]:
x, y, z=symbols('x, y, z') # legyen x y és z változó!
solve(x**2+y*x+z,x)        # ezek után mind a három szerepelhet!
Out[9]:
$$\begin{bmatrix}- \frac{y}{2} - \frac{1}{2} \sqrt{y^{2} - 4 z}, & - \frac{y}{2} + \frac{1}{2} \sqrt{y^{2} - 4 z}\end{bmatrix}$$

Egy változóhoz tartozó rész a Symbol() illetve a symbols() függvények hasában azt mondja meg hogy a kiíratásnál hogy fog az adott változó megjelenni. Ha páldául az "a" változót $\alpha$ ként illetve a "b" változót $b_1$ ként szeretnénk megjeleníteni akkor így kell eljárni:

In [10]:
x, y, a, b=symbols('x, y, alpha, b1') # x és y a megszokott módon jelenik meg
                                      # a \alpha-ként b pedig b_1-ként
b*sin(a) # próbáljuk meg!
Out[10]:
$$b_{1} \sin{\left (\alpha \right )}$$

Végezetül vizsgálju meg hogy több ismeretlenes egyenletrendszert hogy kell megoldani! Oldjuk meg például az $$x+y^2=a$$ $$x-y=b$$ egyenletrendszert $x$-re és $y$-ra

In [11]:
solve([x + y**2 - a, x - y - b],[x,y]) # Így kell egyenletrendszert megoldani
#Az eredmény 2 (x,y) páros! Ezt várjuk is hiszen y-ban másodfokú az egyenletrendszerünk!!
Out[11]:
$$\begin{bmatrix}\begin{pmatrix}b_{1} - \frac{1}{2} \sqrt{4 \alpha - 4 b_{1} + 1} - \frac{1}{2}, & - \frac{1}{2} \sqrt{4 \alpha - 4 b_{1} + 1} - \frac{1}{2}\end{pmatrix}, & \begin{pmatrix}b_{1} + \frac{1}{2} \sqrt{4 \alpha - 4 b_{1} + 1} - \frac{1}{2}, & \frac{1}{2} \sqrt{4 \alpha - 4 b_{1} + 1} - \frac{1}{2}\end{pmatrix}\end{bmatrix}$$

A következő feladatsorban szükségünk lesz a leg általánosabb két ismeretlenes lineáris egyenletrenszer megoldására. Oldjuk meg hát sympy-al az alábbi egyenletrendszert! $$ a_{11}x_1+a_{12}x_2=y_1 $$ $$ a_{21}x_1+a_{22}x_2=y_2 $$

In [12]:
x1, x2, y1, y2=symbols('x1,x2, y1,y2')
a11, a12, a21, a22=symbols('a11,a12, a21,a22')

solve([a11*x1+a12*x2-y1,
       a21*x1+a22*x2-y2],{x1,x2})
Out[12]:
$$\begin{Bmatrix}x_{1} : \frac{- a_{12} y_{2} + a_{22} y_{1}}{a_{11} a_{22} - a_{12} a_{21}}, & x_{2} : \frac{a_{11} y_{2} - a_{21} y_{1}}{a_{11} a_{22} - a_{12} a_{21}}\end{Bmatrix}$$
In []: