Skip to content

Commit

Permalink
Merge pull request #13256 from aktech/frange-error
Browse files Browse the repository at this point in the history
Better error message for failure of function_range
  • Loading branch information
Amit Kumar committed Sep 14, 2017
2 parents b017651 + ed57373 commit a8dcb88
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 3 deletions.
5 changes: 3 additions & 2 deletions sympy/calculus/tests/test_util.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from sympy import (Symbol, S, exp, log, sqrt, oo, E, zoo, pi, tan, sin, cos,
cot, sec, csc, Abs)
cot, sec, csc, Abs, symbols)
from sympy.calculus.util import (function_range, continuous_domain, not_empty_in,
periodicity, lcim, AccumBounds)
from sympy.core import Add, Mul, Pow
Expand All @@ -11,7 +11,7 @@


def test_function_range():
x = Symbol('x')
x, y, a, b = symbols('x y a b')
assert function_range(sin(x), x, Interval(-pi/2, pi/2)) == Interval(-1, 1)
assert function_range(sin(x), x, Interval(0, pi)) == Interval(0, 1)
assert function_range(tan(x), x, Interval(0, pi)) == Interval(-oo, oo)
Expand All @@ -21,6 +21,7 @@ def test_function_range():
assert function_range(exp(x), x, Interval(-1, 1)) == Interval(exp(-1), exp(1))
assert function_range(log(x) - x, x, S.Reals) == Interval(-oo, -1)
assert function_range(sqrt(3*x - 1), x, Interval(0, 2)) == Interval(0, sqrt(5))
raises(NotImplementedError, lambda : function_range(exp(x)*(sin(x)-cos(x))/2 - x, x, S.Reals))


def test_continuous_domain():
Expand Down
8 changes: 7 additions & 1 deletion sympy/calculus/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from sympy.core.sympify import _sympify
from sympy.sets.sets import (Interval, Intersection, FiniteSet, Union,
Complement, EmptySet)
from sympy.sets.conditionset import ConditionSet
from sympy.functions.elementary.miscellaneous import Min, Max
from sympy.utilities import filldedent

Expand Down Expand Up @@ -138,7 +139,12 @@ def function_range(f, symbol, domain):
else:
vals += FiniteSet(f.subs(symbol, limit_point))

critical_points += solveset(f.diff(symbol), symbol, domain)
solution = solveset(f.diff(symbol), symbol, domain)

if isinstance(solution, ConditionSet):
raise NotImplementedError('Unable to find critical points for %s'.format(f))

critical_points += solution

for critical_point in critical_points:
vals += FiniteSet(f.subs(symbol, critical_point))
Expand Down

0 comments on commit a8dcb88

Please sign in to comment.