Enačbe in neenačbe

V tem delu si bomo ogledali različne pristope, kako se spopademo z enačbami. Spoznali bomo nekaj dodatnih knjižnic za python: SymPy, matplotlib in SciPy.

Simbolično reševanje s SymPy

Simbolično reševanje je reševanje enačb s simboli. Ločimo ga od numeričnega reševanja enačb, pri katerem računamo z decimalnimi približki števil. Na vajah navadno uporabljamo simbolično reševanje. Enačbo, ki jo rešujemo, mrcvarimo, dokler ni zapisana v obliki, iz katere lahko preprosto razberemo njeno rešitev. V Pythonu lahko nekaj podobnega počnemo s SymPy.

Primer

Poišči vse rešitve enačbe $$x+\frac{2}{x}=3.$$

Rešitev

Enačbo najprej pomnožimo z $x$ in preoblikujemo v polinomsko enačbo $$ x^2+2-3x=0,$$ v kateri faktoriziramo levo stran $$(x-2)(x-1)=0.$$ Sklepamo, da je leva stran enaka $0$, če je en od faktorjev enak $0$.

Tako dobimo dve možnosti \begin{eqnarray} x-2=0 & \implies & x=2\\ x-1=0 & \implies & x=1. \end{eqnarray}

Sympy

Poskusimo priti do rešitve še s Pythonom. Najprej naložimo knjižnico za simbolično računanje SymPy, nato pa deklariramo, naj se spremenljivka x obravnava kot matematični simbol.


In [1]:
import sympy as sym
x = sym.symbols("x") # spremenljivka x je matematični simbol

Za začetek povsem sledimo korakom, ki smo jih naredili „na roke“. Povzamimo „algoritem“

  • vse člene damo na levo stran
  • enačbo pomnožimo z $x$
  • levo stran faktoriziramo
  • iz faktorjev preberemo rešitev

In [2]:
enacba = sym.Eq(x+2/x,3)
enacba


Out[2]:
x + 2/x == 3

Vključimo izpis formul v lepši obliki, ki ga omogoča SymPy.


In [3]:
sym.init_printing() # lepši izpis formul
enacba


Out[3]:
$$x + \frac{2}{x} = 3$$

In [4]:
# vse člene damo na levo stran in pomnožimo z x
leva = (enacba.lhs - enacba.rhs)*x
leva


Out[4]:
$$x \left(x - 3 + \frac{2}{x}\right)$$

In [5]:
# levo stran razpišemo/zmnožimo
leva = sym.expand(leva)
leva


Out[5]:
$$x^{2} - 3 x + 2$$

In [6]:
# levo stran faktoriziramo
leva = sym.factor(leva)
leva


Out[6]:
$$\left(x - 2\right) \left(x - 1\right)$$

Od tu naprej postane precej komplicirano, kako rešitve programsko izluščiti iz zadnjega rezultata. Če nas zanimajo le rešitve, lahko zgornji postopek izpustimo in preprosto uporabimo funkcijo solve.


In [7]:
# rešitve enačbe najlažje dobimo s funkcijo solve
resitve = sym.solve(enacba)
resitve


Out[7]:
$$\left [ 1, \quad 2\right ]$$

Grafična rešitev

Rešitve enačbe si lahko predstavljamo grafično. Iščemo vrednosti $x$, pri katerih je leva stran enaka desni. Če narišemo graf leve in desne strani na isto sliko, so rešitve enačbe ravno x-koordinate presečišča obeh grafov. Za risanje grafov uporabimo knjižnico matplotlib. Graf funkcije narišemo tako, da funkcijo tabeliramo v veliko točkah. Da lažje računamo s tabelami, uporabimo tudi knjižnico numpy, ki je namenjena delu z vektorji in matrikami.


In [8]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
t = np.arange(-1,3,0.01) # zaporedje x-ov, v katerih bomo tabelirali funkcijo
leva_f = sym.lambdify(x,enacba.lhs) # lambdify iz leve strani enačbe naredi python funkcijo, ki jo uporabimo na t
desna_f = sym.lambdify(x,enacba.rhs) # podobno za desno stran (rhs - right hand side, lhs - left hand side)
plt.plot(t,leva_f(t)) # leva stran /funkcija leva_f deluje po komponentah seznama t 
plt.plot(t,[desna_f(ti) for ti in t]) # funkcija desna_t je konstanta (število 3) in zato ne vrne seznama iste dolžine kot t 
plt.ylim(0,5)
plt.plot(resitve,[leva_f(r) for r in resitve],'or')
plt.show()


Naloga

Poišči vse rešitve enačbe $$x^2-2=1/x.$$ Uporabi sympy.solve in grafično predstavi rešitve.


In [ ]:
import disqus
%reload_ext disqus
%disqus matpy