Podobno kot enačb, se tudi neenačb lotimo s knjižnico Sympy. Bolj konkretno z modulom solvers.inequalities.
In [1]:
import sympy as sym
sym.init_printing() # lepši izpis formul
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.
In [10]:
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)
Out[10]:
Če želimo rešitev v obliki intervalov, ukazu solve_univariate_inequality
dodamo parameter relational=False
.
In [11]:
solve_univariate_inequality(neenacba, x, relational=False) # rešitev neenačbe v obliki intervala
Out[11]:
In [57]:
# 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()
In [50]:
nen2 = abs(x**2 -2) >= x
solve_univariate_inequality(nen2, x, relational=False)
Out[50]:
In [78]:
# 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()
In [54]:
# Prav tako ni težav, če je več absolutnih vrednosti
solve_univariate_inequality(abs(x-1) <= 2*abs(x)-2, x, relational=False)
Out[54]:
In [56]:
# težave se pojavijo, če so absolutne vrednosti gnezdene
solve_univariate_inequality(abs(x-1) <= abs(2*abs(x)-2), x, relational=False)
In [68]:
nen3 = sym.cos(x)<=1/2
nen3
Out[68]:
In [69]:
solve_univariate_inequality(nen3,x,relational=False)
Out[69]:
Rešitev smo dobili v obliki decimalnih števil. Če želimo rešitev v obliki ulomkov, lahko uporabimo sympy.S
ali sympy.Rational
.
In [70]:
from sympy import S
nen3 = sym.cos(x)<= S(1)/2
nen3
Out[70]:
In [71]:
solve_univariate_inequality(nen3,x,relational=False)
Out[71]:
In [76]:
# 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()
In [1]:
import disqus
%reload_ext disqus
%disqus matpy