def test_exp(): x = symbols('x') assert refine(exp(pi * I * 2 * x), Assume(x, Q.integer)) == 1 assert refine(exp(pi * I * 2 * (x + Rational(1, 2))), Assume(x, Q.integer)) == -1 assert refine(exp(pi * I * 2 * (x + Rational(1, 4))), Assume(x, Q.integer)) == I assert refine(exp(pi * I * 2 * (x + Rational(3, 4))), Assume(x, Q.integer)) == -I
def test_abs(): x = symbols('x') assert refine(abs(x), Assume(x, Q.positive)) == x assert refine(1 + abs(x), Assume(x, Q.positive)) == 1 + x assert refine(abs(x), Assume(x, Q.negative)) == -x assert refine(1 + abs(x), Assume(x, Q.negative)) == 1 - x assert refine(abs(x**2)) != x**2 assert refine(abs(x**2), Assume(x, Q.real)) == x**2
def test_solve_inequalities(): system = [Lt(x**2 - 2, 0), Gt(x**2 - 1, 0)] assert solve(system) == \ And(Or(And(Lt(-sqrt(2), re(x)), Lt(re(x), -1)), And(Lt(1, re(x)), Lt(re(x), sqrt(2)))), Eq(im(x), 0)) assert solve(system, assume=Assume(x, Q.real)) == \ Or(And(Lt(-sqrt(2), x), Lt(x, -1)), And(Lt(1, x), Lt(x, sqrt(2))))
def test_reduce_abs_inequalities(): real = Assume(x, Q.real) assert reduce_inequalities(abs(x - 5) < 3, assume=real) == And(Gt(x, 2), Lt(x, 8)) assert reduce_inequalities(abs(2*x + 3) >= 8, assume=real) == Or(Le(x, -S(11)/2), Ge(x, S(5)/2)) assert reduce_inequalities(abs(x - 4) + abs(3*x - 5) < 7, assume=real) == And(Gt(x, S(1)/2), Lt(x, 4)) assert reduce_inequalities(abs(x - 4) + abs(3*abs(x) - 5) < 7, assume=real) == Or(And(-2 < x, x < -1), And(S(1)/2 < x, x < 4)) raises(NotImplementedError, "reduce_inequalities(abs(x - 5) < 3)")
def test_pow(): x, y, z = symbols('x y z') assert refine((-1)**x, Assume(x, Q.even)) == 1 assert refine((-1)**x, Assume(x, Q.odd)) == -1 assert refine((-2)**x, Assume(x, Q.even)) == 2**x # nested powers assert refine(sqrt(x**2)) != abs(x) assert refine(sqrt(x**2), Assume(x, Q.complex)) != abs(x) assert refine(sqrt(x**2), Assume(x, Q.real)) == abs(x) assert refine(sqrt(x**2), Assume(x, Q.positive)) == x assert refine((x**3)**(S(1) / 3)) != x assert refine((x**3)**(S(1) / 3), Assume(x, Q.real)) != x assert refine((x**3)**(S(1) / 3), Assume(x, Q.positive)) == x assert refine(sqrt(1 / x), Assume(x, Q.real)) != 1 / sqrt(x) assert refine(sqrt(1 / x), Assume(x, Q.positive)) == 1 / sqrt(x) # powers of (-1) assert refine((-1)**(x + y), Assume(x, Q.even)) == (-1)**y assert refine((-1)**(x + y + z), Assume(x, Q.odd) & Assume(z, Q.odd)) == (-1)**y assert refine((-1)**(x + y + 1), Assume(x, Q.odd)) == (-1)**y assert refine((-1)**(x + y + 2), Assume(x, Q.odd)) == (-1)**(y + 1) assert refine((-1)**(x + 3)) == (-1)**(x + 1)
def test_reduce_inequalities_assume(): assert reduce_inequalities([Le(x**2, 1), Assume(x, Q.real)]) == And(Le(-1, x), Le(x, 1)) assert reduce_inequalities([Le(x**2, 1)], Assume(x, Q.real)) == And(Le(-1, x), Le(x, 1))
"""Tests for tools for solving inequalities and systems of inequalities. """ from sympy.solvers.inequalities import ( reduce_poly_inequalities, reduce_inequalities) from sympy import ( S, Symbol, Interval, Eq, Ne, Lt, Le, Gt, Ge, Or, And, pi, oo, sqrt, Q, Assume, global_assumptions, re, im, sin) from sympy.utilities.pytest import raises from sympy.abc import x, y inf = oo.evalf() x_assume = Assume(x, Q.real) y_assume = Assume(y, Q.real) def test_reduce_poly_inequalities_real_interval(): global_assumptions.add(x_assume) global_assumptions.add(y_assume) assert reduce_poly_inequalities([[Eq(x**2, 0)]], x, relational=False) == [Interval(0, 0)] assert reduce_poly_inequalities([[Le(x**2, 0)]], x, relational=False) == [Interval(0, 0)] assert reduce_poly_inequalities([[Lt(x**2, 0)]], x, relational=False) == [] assert reduce_poly_inequalities([[Ge(x**2, 0)]], x, relational=False) == [Interval(-oo, oo)] assert reduce_poly_inequalities([[Gt(x**2, 0)]], x, relational=False) == [Interval(-oo, 0, right_open=True), Interval(0, oo, left_open=True)] assert reduce_poly_inequalities([[Ne(x**2, 0)]], x, relational=False) == [Interval(-oo, 0, right_open=True), Interval(0, oo, left_open=True)] assert reduce_poly_inequalities([[Eq(x**2, 1)]], x, relational=False) == [Interval(-1,-1), Interval(1, 1)] assert reduce_poly_inequalities([[Le(x**2, 1)]], x, relational=False) == [Interval(-1, 1)]