Podobno kot enačb, se tudi neenačb lotimo s knjižnico Sympy. Bolj konkretno z modulom solvers.inequalities.
import sympy as sym
sym.init_printing() # lepši izpis formul
Reši neenačbo \begin{equation} x^2-2\ge x \end{equation}
Za neenačbe z eno neznanko uporabimo splošno funkcijo solve_univariate_inequality
, ki prepozna tip neeenačbe in uporabi primerno metodo. Ko definiramo spremenljivko x
, posebej označimo, da gre za realno število.
from sympy.solvers.inequalities import solve_univariate_inequality
from sympy import Symbol
x = Symbol('x', real=True) # x simbol, ki je realno število
neenacba = x**2 -2 >= x
solve_univariate_inequality(neenacba,x)
Če želimo rešitev v obliki intervalov, ukazu solve_univariate_inequality
dodamo parameter relational=False
.
solve_univariate_inequality(neenacba, x, relational=False) # rešitev neenačbe v obliki intervala
# grafična rešitev
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
t = np.linspace(-3,3) # zaporedje x-ov, v katerih bomo tabelirali funkcijo
leva_f = sym.lambdify(x,neenacba.lhs)
desna_f = sym.lambdify(x,neenacba.rhs)
plt.plot(t,leva_f(t))
plt.plot(t,desna_f(t))
plt.title("Rešitev neenačbe sta intervala, kjer je modra črta nad zeleno")
plt.plot([-3,-1],[-3.9,-3.9],'ro-')
plt.plot([2,3],[-3.9,-3.9],'ro-')
plt.show()
Funkcija solve_univariate_inequality
nima težav niti z enačbami z absolutno vrednostjo. Poglejmo si rešitev enačbe
\begin{equation}
\left|x^2-2\right|\ge x
\end{equation}
nen2 = abs(x**2 -2) >= x
solve_univariate_inequality(nen2, x, relational=False)
# grafična rešitev
leva_f = sym.lambdify(x,nen2.lhs)
t = np.linspace(-3,3) # zaporedje x-ov, v katerih bomo tabelirali funkcijo
plt.plot(t,[leva_f(ti) for ti in t])
plt.plot(t,sym.lambdify(x,nen2.rhs)(t))
plt.title("Rešitev neenačbe sta intervala, kjer je modra črta nad zeleno")
plt.plot([-3,1],[-3.9,-3.9],'-or')
plt.plot([2,3],[-3.9,-3.9],'-or')
plt.show()
# Prav tako ni težav, če je več absolutnih vrednosti
solve_univariate_inequality(abs(x-1) <= 2*abs(x)-2, x, relational=False)
# težave se pojavijo, če so absolutne vrednosti gnezdene
solve_univariate_inequality(abs(x-1) <= abs(2*abs(x)-2), x, relational=False)
--------------------------------------------------------------------------- NotImplementedError Traceback (most recent call last) <ipython-input-56-0c43f1a8780f> in <module>() 1 # težave se pojavijo, če so enačbe gnezdene ----> 2 solve_univariate_inequality(abs(x-1) <= abs(2*abs(x)-2), x, relational=False) /usr/local/lib/python3.4/dist-packages/sympy/solvers/inequalities.py in solve_univariate_inequality(expr, gen, relational) 389 from sympy.solvers.solvers import solve 390 --> 391 solns = solve(expr.lhs - expr.rhs, gen) 392 oo = S.Infinity 393 /usr/local/lib/python3.4/dist-packages/sympy/solvers/solvers.py in solve(f, *symbols, **flags) 907 ########################################################################### 908 if bare_f: --> 909 solution = _solve(f[0], *symbols, **flags) 910 else: 911 solution = _solve_system(f, symbols, **flags) /usr/local/lib/python3.4/dist-packages/sympy/solvers/solvers.py in _solve(f, *symbols, **flags) 1167 result = set() 1168 for n, (expr, cond) in enumerate(f.args): -> 1169 candidates = _solve(expr, *symbols, **flags) 1170 1171 for candidate in candidates: /usr/local/lib/python3.4/dist-packages/sympy/solvers/solvers.py in _solve(f, *symbols, **flags) 1167 result = set() 1168 for n, (expr, cond) in enumerate(f.args): -> 1169 candidates = _solve(expr, *symbols, **flags) 1170 1171 for candidate in candidates: /usr/local/lib/python3.4/dist-packages/sympy/solvers/solvers.py in _solve(f, *symbols, **flags) 1412 if result is False: 1413 raise NotImplementedError(msg + -> 1414 "\nNo algorithms are implemented to solve equation %s" % f) 1415 1416 if flags.get('simplify', True): NotImplementedError: multiple generators [x, Abs(2*x - 2)] No algorithms are implemented to solve equation x - Abs(2*x - 2) - 1
Poskusimo rešiti še enačbe s trigonometričnimi funkcijami \begin{equation} \cos(x)\le\frac{1}{2} \end{equation}
nen3 = sym.cos(x)<=1/2
nen3
solve_univariate_inequality(nen3,x,relational=False)
Rešitev smo dobili v obliki decimalnih števil. Če želimo rešitev v obliki ulomkov, lahko uporabimo sympy.S
ali sympy.Rational
.
from sympy import S
nen3 = sym.cos(x)<= S(1)/2
nen3
solve_univariate_inequality(nen3,x,relational=False)
# grafična rešitev
t = np.linspace(0,7)
leva_f = sym.lambdify(x,nen3.lhs)
desna_f = sym.lambdify(x,nen3.rhs)
plt.plot(t,[leva_f(ti) for ti in t])
plt.plot(t,[desna_f(ti) for ti in t])
plt.title("Rešitev neenačbe je interval, kjer je modra črta pod zeleno")
plt.show()
Simbolično in grafično rešite neenačbe:
$$ x^3-1>x;\quad\left|x+1\right| \le \left|2x-1\right|;\quad \sin(x)<\frac{\sqrt{3}}{2}\text{ na intervalu } [0,2\pi)$$
import disqus
%reload_ext disqus
%disqus matpy