123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- """Tests for tools for solving inequalities and systems of inequalities. """
- from sympy.concrete.summations import Sum
- from sympy.core.function import Function
- from sympy.core.numbers import (I, Rational, oo, pi)
- from sympy.core.relational import (Eq, Ge, Gt, Le, Lt, Ne)
- from sympy.core.singleton import S
- from sympy.core.symbol import (Dummy, Symbol)
- from sympy.functions.elementary.complexes import Abs
- from sympy.functions.elementary.exponential import (exp, log)
- from sympy.functions.elementary.miscellaneous import (root, sqrt)
- from sympy.functions.elementary.piecewise import Piecewise
- from sympy.functions.elementary.trigonometric import (cos, sin, tan)
- from sympy.integrals.integrals import Integral
- from sympy.logic.boolalg import (And, Or)
- from sympy.polys.polytools import (Poly, PurePoly)
- from sympy.sets.sets import (FiniteSet, Interval, Union)
- from sympy.solvers.inequalities import (reduce_inequalities,
- solve_poly_inequality as psolve,
- reduce_rational_inequalities,
- solve_univariate_inequality as isolve,
- reduce_abs_inequality,
- _solve_inequality)
- from sympy.polys.rootoftools import rootof
- from sympy.solvers.solvers import solve
- from sympy.solvers.solveset import solveset
- from sympy.abc import x, y
- from sympy.core.mod import Mod
- from sympy.testing.pytest import raises, XFAIL
- inf = oo.evalf()
- def test_solve_poly_inequality():
- assert psolve(Poly(0, x), '==') == [S.Reals]
- assert psolve(Poly(1, x), '==') == [S.EmptySet]
- assert psolve(PurePoly(x + 1, x), ">") == [Interval(-1, oo, True, False)]
- def test_reduce_poly_inequalities_real_interval():
- assert reduce_rational_inequalities(
- [[Eq(x**2, 0)]], x, relational=False) == FiniteSet(0)
- assert reduce_rational_inequalities(
- [[Le(x**2, 0)]], x, relational=False) == FiniteSet(0)
- assert reduce_rational_inequalities(
- [[Lt(x**2, 0)]], x, relational=False) == S.EmptySet
- assert reduce_rational_inequalities(
- [[Ge(x**2, 0)]], x, relational=False) == \
- S.Reals if x.is_real else Interval(-oo, oo)
- assert reduce_rational_inequalities(
- [[Gt(x**2, 0)]], x, relational=False) == \
- FiniteSet(0).complement(S.Reals)
- assert reduce_rational_inequalities(
- [[Ne(x**2, 0)]], x, relational=False) == \
- FiniteSet(0).complement(S.Reals)
- assert reduce_rational_inequalities(
- [[Eq(x**2, 1)]], x, relational=False) == FiniteSet(-1, 1)
- assert reduce_rational_inequalities(
- [[Le(x**2, 1)]], x, relational=False) == Interval(-1, 1)
- assert reduce_rational_inequalities(
- [[Lt(x**2, 1)]], x, relational=False) == Interval(-1, 1, True, True)
- assert reduce_rational_inequalities(
- [[Ge(x**2, 1)]], x, relational=False) == \
- Union(Interval(-oo, -1), Interval(1, oo))
- assert reduce_rational_inequalities(
- [[Gt(x**2, 1)]], x, relational=False) == \
- Interval(-1, 1).complement(S.Reals)
- assert reduce_rational_inequalities(
- [[Ne(x**2, 1)]], x, relational=False) == \
- FiniteSet(-1, 1).complement(S.Reals)
- assert reduce_rational_inequalities([[Eq(
- x**2, 1.0)]], x, relational=False) == FiniteSet(-1.0, 1.0).evalf()
- assert reduce_rational_inequalities(
- [[Le(x**2, 1.0)]], x, relational=False) == Interval(-1.0, 1.0)
- assert reduce_rational_inequalities([[Lt(
- x**2, 1.0)]], x, relational=False) == Interval(-1.0, 1.0, True, True)
- assert reduce_rational_inequalities(
- [[Ge(x**2, 1.0)]], x, relational=False) == \
- Union(Interval(-inf, -1.0), Interval(1.0, inf))
- assert reduce_rational_inequalities(
- [[Gt(x**2, 1.0)]], x, relational=False) == \
- Union(Interval(-inf, -1.0, right_open=True),
- Interval(1.0, inf, left_open=True))
- assert reduce_rational_inequalities([[Ne(
- x**2, 1.0)]], x, relational=False) == \
- FiniteSet(-1.0, 1.0).complement(S.Reals)
- s = sqrt(2)
- assert reduce_rational_inequalities([[Lt(
- x**2 - 1, 0), Gt(x**2 - 1, 0)]], x, relational=False) == S.EmptySet
- assert reduce_rational_inequalities([[Le(x**2 - 1, 0), Ge(
- x**2 - 1, 0)]], x, relational=False) == FiniteSet(-1, 1)
- assert reduce_rational_inequalities(
- [[Le(x**2 - 2, 0), Ge(x**2 - 1, 0)]], x, relational=False
- ) == Union(Interval(-s, -1, False, False), Interval(1, s, False, False))
- assert reduce_rational_inequalities(
- [[Le(x**2 - 2, 0), Gt(x**2 - 1, 0)]], x, relational=False
- ) == Union(Interval(-s, -1, False, True), Interval(1, s, True, False))
- assert reduce_rational_inequalities(
- [[Lt(x**2 - 2, 0), Ge(x**2 - 1, 0)]], x, relational=False
- ) == Union(Interval(-s, -1, True, False), Interval(1, s, False, True))
- assert reduce_rational_inequalities(
- [[Lt(x**2 - 2, 0), Gt(x**2 - 1, 0)]], x, relational=False
- ) == Union(Interval(-s, -1, True, True), Interval(1, s, True, True))
- assert reduce_rational_inequalities(
- [[Lt(x**2 - 2, 0), Ne(x**2 - 1, 0)]], x, relational=False
- ) == Union(Interval(-s, -1, True, True), Interval(-1, 1, True, True),
- Interval(1, s, True, True))
- assert reduce_rational_inequalities([[Lt(x**2, -1.)]], x) is S.false
- def test_reduce_poly_inequalities_complex_relational():
- assert reduce_rational_inequalities(
- [[Eq(x**2, 0)]], x, relational=True) == Eq(x, 0)
- assert reduce_rational_inequalities(
- [[Le(x**2, 0)]], x, relational=True) == Eq(x, 0)
- assert reduce_rational_inequalities(
- [[Lt(x**2, 0)]], x, relational=True) == False
- assert reduce_rational_inequalities(
- [[Ge(x**2, 0)]], x, relational=True) == And(Lt(-oo, x), Lt(x, oo))
- assert reduce_rational_inequalities(
- [[Gt(x**2, 0)]], x, relational=True) == \
- And(Gt(x, -oo), Lt(x, oo), Ne(x, 0))
- assert reduce_rational_inequalities(
- [[Ne(x**2, 0)]], x, relational=True) == \
- And(Gt(x, -oo), Lt(x, oo), Ne(x, 0))
- for one in (S.One, S(1.0)):
- inf = one*oo
- assert reduce_rational_inequalities(
- [[Eq(x**2, one)]], x, relational=True) == \
- Or(Eq(x, -one), Eq(x, one))
- assert reduce_rational_inequalities(
- [[Le(x**2, one)]], x, relational=True) == \
- And(And(Le(-one, x), Le(x, one)))
- assert reduce_rational_inequalities(
- [[Lt(x**2, one)]], x, relational=True) == \
- And(And(Lt(-one, x), Lt(x, one)))
- assert reduce_rational_inequalities(
- [[Ge(x**2, one)]], x, relational=True) == \
- And(Or(And(Le(one, x), Lt(x, inf)), And(Le(x, -one), Lt(-inf, x))))
- assert reduce_rational_inequalities(
- [[Gt(x**2, one)]], x, relational=True) == \
- And(Or(And(Lt(-inf, x), Lt(x, -one)), And(Lt(one, x), Lt(x, inf))))
- assert reduce_rational_inequalities(
- [[Ne(x**2, one)]], x, relational=True) == \
- Or(And(Lt(-inf, x), Lt(x, -one)),
- And(Lt(-one, x), Lt(x, one)),
- And(Lt(one, x), Lt(x, inf)))
- def test_reduce_rational_inequalities_real_relational():
- assert reduce_rational_inequalities([], x) == False
- assert reduce_rational_inequalities(
- [[(x**2 + 3*x + 2)/(x**2 - 16) >= 0]], x, relational=False) == \
- Union(Interval.open(-oo, -4), Interval(-2, -1), Interval.open(4, oo))
- assert reduce_rational_inequalities(
- [[((-2*x - 10)*(3 - x))/((x**2 + 5)*(x - 2)**2) < 0]], x,
- relational=False) == \
- Union(Interval.open(-5, 2), Interval.open(2, 3))
- assert reduce_rational_inequalities([[(x + 1)/(x - 5) <= 0]], x,
- relational=False) == \
- Interval.Ropen(-1, 5)
- assert reduce_rational_inequalities([[(x**2 + 4*x + 3)/(x - 1) > 0]], x,
- relational=False) == \
- Union(Interval.open(-3, -1), Interval.open(1, oo))
- assert reduce_rational_inequalities([[(x**2 - 16)/(x - 1)**2 < 0]], x,
- relational=False) == \
- Union(Interval.open(-4, 1), Interval.open(1, 4))
- assert reduce_rational_inequalities([[(3*x + 1)/(x + 4) >= 1]], x,
- relational=False) == \
- Union(Interval.open(-oo, -4), Interval.Ropen(Rational(3, 2), oo))
- assert reduce_rational_inequalities([[(x - 8)/x <= 3 - x]], x,
- relational=False) == \
- Union(Interval.Lopen(-oo, -2), Interval.Lopen(0, 4))
- # issue sympy/sympy#10237
- assert reduce_rational_inequalities(
- [[x < oo, x >= 0, -oo < x]], x, relational=False) == Interval(0, oo)
- def test_reduce_abs_inequalities():
- e = abs(x - 5) < 3
- ans = And(Lt(2, x), Lt(x, 8))
- assert reduce_inequalities(e) == ans
- assert reduce_inequalities(e, x) == ans
- assert reduce_inequalities(abs(x - 5)) == Eq(x, 5)
- assert reduce_inequalities(
- abs(2*x + 3) >= 8) == Or(And(Le(Rational(5, 2), x), Lt(x, oo)),
- And(Le(x, Rational(-11, 2)), Lt(-oo, x)))
- assert reduce_inequalities(abs(x - 4) + abs(
- 3*x - 5) < 7) == And(Lt(S.Half, x), Lt(x, 4))
- assert reduce_inequalities(abs(x - 4) + abs(3*abs(x) - 5) < 7) == \
- Or(And(S(-2) < x, x < -1), And(S.Half < x, x < 4))
- nr = Symbol('nr', extended_real=False)
- raises(TypeError, lambda: reduce_inequalities(abs(nr - 5) < 3))
- assert reduce_inequalities(x < 3, symbols=[x, nr]) == And(-oo < x, x < 3)
- def test_reduce_inequalities_general():
- assert reduce_inequalities(Ge(sqrt(2)*x, 1)) == And(sqrt(2)/2 <= x, x < oo)
- assert reduce_inequalities(x + 1 > 0) == And(S.NegativeOne < x, x < oo)
- def test_reduce_inequalities_boolean():
- assert reduce_inequalities(
- [Eq(x**2, 0), True]) == Eq(x, 0)
- assert reduce_inequalities([Eq(x**2, 0), False]) == False
- assert reduce_inequalities(x**2 >= 0) is S.true # issue 10196
- def test_reduce_inequalities_multivariate():
- assert reduce_inequalities([Ge(x**2, 1), Ge(y**2, 1)]) == And(
- Or(And(Le(S.One, x), Lt(x, oo)), And(Le(x, -1), Lt(-oo, x))),
- Or(And(Le(S.One, y), Lt(y, oo)), And(Le(y, -1), Lt(-oo, y))))
- def test_reduce_inequalities_errors():
- raises(NotImplementedError, lambda: reduce_inequalities(Ge(sin(x) + x, 1)))
- raises(NotImplementedError, lambda: reduce_inequalities(Ge(x**2*y + y, 1)))
- def test__solve_inequalities():
- assert reduce_inequalities(x + y < 1, symbols=[x]) == (x < 1 - y)
- assert reduce_inequalities(x + y >= 1, symbols=[x]) == (x < oo) & (x >= -y + 1)
- assert reduce_inequalities(Eq(0, x - y), symbols=[x]) == Eq(x, y)
- assert reduce_inequalities(Ne(0, x - y), symbols=[x]) == Ne(x, y)
- def test_issue_6343():
- eq = -3*x**2/2 - x*Rational(45, 4) + Rational(33, 2) > 0
- assert reduce_inequalities(eq) == \
- And(x < Rational(-15, 4) + sqrt(401)/4, -sqrt(401)/4 - Rational(15, 4) < x)
- def test_issue_8235():
- assert reduce_inequalities(x**2 - 1 < 0) == \
- And(S.NegativeOne < x, x < 1)
- assert reduce_inequalities(x**2 - 1 <= 0) == \
- And(S.NegativeOne <= x, x <= 1)
- assert reduce_inequalities(x**2 - 1 > 0) == \
- Or(And(-oo < x, x < -1), And(x < oo, S.One < x))
- assert reduce_inequalities(x**2 - 1 >= 0) == \
- Or(And(-oo < x, x <= -1), And(S.One <= x, x < oo))
- eq = x**8 + x - 9 # we want CRootOf solns here
- sol = solve(eq >= 0)
- tru = Or(And(rootof(eq, 1) <= x, x < oo), And(-oo < x, x <= rootof(eq, 0)))
- assert sol == tru
- # recast vanilla as real
- assert solve(sqrt((-x + 1)**2) < 1) == And(S.Zero < x, x < 2)
- def test_issue_5526():
- assert reduce_inequalities(0 <=
- x + Integral(y**2, (y, 1, 3)) - 1, [x]) == \
- (x >= -Integral(y**2, (y, 1, 3)) + 1)
- f = Function('f')
- e = Sum(f(x), (x, 1, 3))
- assert reduce_inequalities(0 <= x + e + y**2, [x]) == \
- (x >= -y**2 - Sum(f(x), (x, 1, 3)))
- def test_solve_univariate_inequality():
- assert isolve(x**2 >= 4, x, relational=False) == Union(Interval(-oo, -2),
- Interval(2, oo))
- assert isolve(x**2 >= 4, x) == Or(And(Le(2, x), Lt(x, oo)), And(Le(x, -2),
- Lt(-oo, x)))
- assert isolve((x - 1)*(x - 2)*(x - 3) >= 0, x, relational=False) == \
- Union(Interval(1, 2), Interval(3, oo))
- assert isolve((x - 1)*(x - 2)*(x - 3) >= 0, x) == \
- Or(And(Le(1, x), Le(x, 2)), And(Le(3, x), Lt(x, oo)))
- assert isolve((x - 1)*(x - 2)*(x - 4) < 0, x, domain = FiniteSet(0, 3)) == \
- Or(Eq(x, 0), Eq(x, 3))
- # issue 2785:
- assert isolve(x**3 - 2*x - 1 > 0, x, relational=False) == \
- Union(Interval(-1, -sqrt(5)/2 + S.Half, True, True),
- Interval(S.Half + sqrt(5)/2, oo, True, True))
- # issue 2794:
- assert isolve(x**3 - x**2 + x - 1 > 0, x, relational=False) == \
- Interval(1, oo, True)
- #issue 13105
- assert isolve((x + I)*(x + 2*I) < 0, x) == Eq(x, 0)
- assert isolve(((x - 1)*(x - 2) + I)*((x - 1)*(x - 2) + 2*I) < 0, x) == Or(Eq(x, 1), Eq(x, 2))
- assert isolve((((x - 1)*(x - 2) + I)*((x - 1)*(x - 2) + 2*I))/(x - 2) > 0, x) == Eq(x, 1)
- raises (ValueError, lambda: isolve((x**2 - 3*x*I + 2)/x < 0, x))
- # numerical testing in valid() is needed
- assert isolve(x**7 - x - 2 > 0, x) == \
- And(rootof(x**7 - x - 2, 0) < x, x < oo)
- # handle numerator and denominator; although these would be handled as
- # rational inequalities, these test confirm that the right thing is done
- # when the domain is EX (e.g. when 2 is replaced with sqrt(2))
- assert isolve(1/(x - 2) > 0, x) == And(S(2) < x, x < oo)
- den = ((x - 1)*(x - 2)).expand()
- assert isolve((x - 1)/den <= 0, x) == \
- (x > -oo) & (x < 2) & Ne(x, 1)
- n = Dummy('n')
- raises(NotImplementedError, lambda: isolve(Abs(x) <= n, x, relational=False))
- c1 = Dummy("c1", positive=True)
- raises(NotImplementedError, lambda: isolve(n/c1 < 0, c1))
- n = Dummy('n', negative=True)
- assert isolve(n/c1 > -2, c1) == (-n/2 < c1)
- assert isolve(n/c1 < 0, c1) == True
- assert isolve(n/c1 > 0, c1) == False
- zero = cos(1)**2 + sin(1)**2 - 1
- raises(NotImplementedError, lambda: isolve(x**2 < zero, x))
- raises(NotImplementedError, lambda: isolve(
- x**2 < zero*I, x))
- raises(NotImplementedError, lambda: isolve(1/(x - y) < 2, x))
- raises(NotImplementedError, lambda: isolve(1/(x - y) < 0, x))
- raises(TypeError, lambda: isolve(x - I < 0, x))
- zero = x**2 + x - x*(x + 1)
- assert isolve(zero < 0, x, relational=False) is S.EmptySet
- assert isolve(zero <= 0, x, relational=False) is S.Reals
- # make sure iter_solutions gets a default value
- raises(NotImplementedError, lambda: isolve(
- Eq(cos(x)**2 + sin(x)**2, 1), x))
- def test_trig_inequalities():
- # all the inequalities are solved in a periodic interval.
- assert isolve(sin(x) < S.Half, x, relational=False) == \
- Union(Interval(0, pi/6, False, True), Interval.open(pi*Rational(5, 6), 2*pi))
- assert isolve(sin(x) > S.Half, x, relational=False) == \
- Interval(pi/6, pi*Rational(5, 6), True, True)
- assert isolve(cos(x) < S.Zero, x, relational=False) == \
- Interval(pi/2, pi*Rational(3, 2), True, True)
- assert isolve(cos(x) >= S.Zero, x, relational=False) == \
- Union(Interval(0, pi/2), Interval.Ropen(pi*Rational(3, 2), 2*pi))
- assert isolve(tan(x) < S.One, x, relational=False) == \
- Union(Interval.Ropen(0, pi/4), Interval.open(pi/2, pi))
- assert isolve(sin(x) <= S.Zero, x, relational=False) == \
- Union(FiniteSet(S.Zero), Interval.Ropen(pi, 2*pi))
- assert isolve(sin(x) <= S.One, x, relational=False) == S.Reals
- assert isolve(cos(x) < S(-2), x, relational=False) == S.EmptySet
- assert isolve(sin(x) >= S.NegativeOne, x, relational=False) == S.Reals
- assert isolve(cos(x) > S.One, x, relational=False) == S.EmptySet
- def test_issue_9954():
- assert isolve(x**2 >= 0, x, relational=False) == S.Reals
- assert isolve(x**2 >= 0, x, relational=True) == S.Reals.as_relational(x)
- assert isolve(x**2 < 0, x, relational=False) == S.EmptySet
- assert isolve(x**2 < 0, x, relational=True) == S.EmptySet.as_relational(x)
- @XFAIL
- def test_slow_general_univariate():
- r = rootof(x**5 - x**2 + 1, 0)
- assert solve(sqrt(x) + 1/root(x, 3) > 1) == \
- Or(And(0 < x, x < r**6), And(r**6 < x, x < oo))
- def test_issue_8545():
- eq = 1 - x - abs(1 - x)
- ans = And(Lt(1, x), Lt(x, oo))
- assert reduce_abs_inequality(eq, '<', x) == ans
- eq = 1 - x - sqrt((1 - x)**2)
- assert reduce_inequalities(eq < 0) == ans
- def test_issue_8974():
- assert isolve(-oo < x, x) == And(-oo < x, x < oo)
- assert isolve(oo > x, x) == And(-oo < x, x < oo)
- def test_issue_10198():
- assert reduce_inequalities(
- -1 + 1/abs(1/x - 1) < 0) == (x > -oo) & (x < S(1)/2) & Ne(x, 0)
- assert reduce_inequalities(abs(1/sqrt(x)) - 1, x) == Eq(x, 1)
- assert reduce_abs_inequality(-3 + 1/abs(1 - 1/x), '<', x) == \
- Or(And(-oo < x, x < 0),
- And(S.Zero < x, x < Rational(3, 4)), And(Rational(3, 2) < x, x < oo))
- raises(ValueError,lambda: reduce_abs_inequality(-3 + 1/abs(
- 1 - 1/sqrt(x)), '<', x))
- def test_issue_10047():
- # issue 10047: this must remain an inequality, not True, since if x
- # is not real the inequality is invalid
- # assert solve(sin(x) < 2) == (x <= oo)
- # with PR 16956, (x <= oo) autoevaluates when x is extended_real
- # which is assumed in the current implementation of inequality solvers
- assert solve(sin(x) < 2) == True
- assert solveset(sin(x) < 2, domain=S.Reals) == S.Reals
- def test_issue_10268():
- assert solve(log(x) < 1000) == And(S.Zero < x, x < exp(1000))
- @XFAIL
- def test_isolve_Sets():
- n = Dummy('n')
- assert isolve(Abs(x) <= n, x, relational=False) == \
- Piecewise((S.EmptySet, n < 0), (Interval(-n, n), True))
- def test_integer_domain_relational_isolve():
- dom = FiniteSet(0, 3)
- x = Symbol('x',zero=False)
- assert isolve((x - 1)*(x - 2)*(x - 4) < 0, x, domain=dom) == Eq(x, 3)
- x = Symbol('x')
- assert isolve(x + 2 < 0, x, domain=S.Integers) == \
- (x <= -3) & (x > -oo) & Eq(Mod(x, 1), 0)
- assert isolve(2 * x + 3 > 0, x, domain=S.Integers) == \
- (x >= -1) & (x < oo) & Eq(Mod(x, 1), 0)
- assert isolve((x ** 2 + 3 * x - 2) < 0, x, domain=S.Integers) == \
- (x >= -3) & (x <= 0) & Eq(Mod(x, 1), 0)
- assert isolve((x ** 2 + 3 * x - 2) > 0, x, domain=S.Integers) == \
- ((x >= 1) & (x < oo) & Eq(Mod(x, 1), 0)) | (
- (x <= -4) & (x > -oo) & Eq(Mod(x, 1), 0))
- def test_issue_10671_12466():
- assert solveset(sin(y), y, Interval(0, pi)) == FiniteSet(0, pi)
- i = Interval(1, 10)
- assert solveset((1/x).diff(x) < 0, x, i) == i
- assert solveset((log(x - 6)/x) <= 0, x, S.Reals) == \
- Interval.Lopen(6, 7)
- def test__solve_inequality():
- for op in (Gt, Lt, Le, Ge, Eq, Ne):
- assert _solve_inequality(op(x, 1), x).lhs == x
- assert _solve_inequality(op(S.One, x), x).lhs == x
- # don't get tricked by symbol on right: solve it
- assert _solve_inequality(Eq(2*x - 1, x), x) == Eq(x, 1)
- ie = Eq(S.One, y)
- assert _solve_inequality(ie, x) == ie
- for fx in (x**2, exp(x), sin(x) + cos(x), x*(1 + x)):
- for c in (0, 1):
- e = 2*fx - c > 0
- assert _solve_inequality(e, x, linear=True) == (
- fx > c/S(2))
- assert _solve_inequality(2*x**2 + 2*x - 1 < 0, x, linear=True) == (
- x*(x + 1) < S.Half)
- assert _solve_inequality(Eq(x*y, 1), x) == Eq(x*y, 1)
- nz = Symbol('nz', nonzero=True)
- assert _solve_inequality(Eq(x*nz, 1), x) == Eq(x, 1/nz)
- assert _solve_inequality(x*nz < 1, x) == (x*nz < 1)
- a = Symbol('a', positive=True)
- assert _solve_inequality(a/x > 1, x) == (S.Zero < x) & (x < a)
- assert _solve_inequality(a/x > 1, x, linear=True) == (1/x > 1/a)
- # make sure to include conditions under which solution is valid
- e = Eq(1 - x, x*(1/x - 1))
- assert _solve_inequality(e, x) == Ne(x, 0)
- assert _solve_inequality(x < x*(1/x - 1), x) == (x < S.Half) & Ne(x, 0)
- def test__pt():
- from sympy.solvers.inequalities import _pt
- assert _pt(-oo, oo) == 0
- assert _pt(S.One, S(3)) == 2
- assert _pt(S.One, oo) == _pt(oo, S.One) == 2
- assert _pt(S.One, -oo) == _pt(-oo, S.One) == S.Half
- assert _pt(S.NegativeOne, oo) == _pt(oo, S.NegativeOne) == Rational(-1, 2)
- assert _pt(S.NegativeOne, -oo) == _pt(-oo, S.NegativeOne) == -2
- assert _pt(x, oo) == _pt(oo, x) == x + 1
- assert _pt(x, -oo) == _pt(-oo, x) == x - 1
- raises(ValueError, lambda: _pt(Dummy('i', infinite=True), S.One))
|