test_util.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. from sympy.core.function import Lambda
  2. from sympy.core.numbers import (E, I, Rational, oo, pi)
  3. from sympy.core.relational import Eq
  4. from sympy.core.singleton import S
  5. from sympy.core.symbol import (Dummy, Symbol)
  6. from sympy.functions.elementary.complexes import (Abs, re)
  7. from sympy.functions.elementary.exponential import (exp, log)
  8. from sympy.functions.elementary.integers import frac
  9. from sympy.functions.elementary.miscellaneous import sqrt
  10. from sympy.functions.elementary.piecewise import Piecewise
  11. from sympy.functions.elementary.trigonometric import (
  12. cos, cot, csc, sec, sin, tan, asin, acos, atan, acot, asec, acsc)
  13. from sympy.functions.elementary.hyperbolic import (sinh, cosh, tanh, coth,
  14. sech, csch, asinh, acosh, atanh, acoth, asech, acsch)
  15. from sympy.functions.special.gamma_functions import gamma
  16. from sympy.functions.special.error_functions import expint
  17. from sympy.matrices.expressions.matexpr import MatrixSymbol
  18. from sympy.simplify.simplify import simplify
  19. from sympy.calculus.util import (function_range, continuous_domain, not_empty_in,
  20. periodicity, lcim, is_convex,
  21. stationary_points, minimum, maximum)
  22. from sympy.sets.sets import (Interval, FiniteSet, Complement, Union)
  23. from sympy.sets.fancysets import ImageSet
  24. from sympy.sets.conditionset import ConditionSet
  25. from sympy.testing.pytest import XFAIL, raises, _both_exp_pow, slow
  26. from sympy.abc import x, y
  27. a = Symbol('a', real=True)
  28. def test_function_range():
  29. assert function_range(sin(x), x, Interval(-pi/2, pi/2)
  30. ) == Interval(-1, 1)
  31. assert function_range(sin(x), x, Interval(0, pi)
  32. ) == Interval(0, 1)
  33. assert function_range(tan(x), x, Interval(0, pi)
  34. ) == Interval(-oo, oo)
  35. assert function_range(tan(x), x, Interval(pi/2, pi)
  36. ) == Interval(-oo, 0)
  37. assert function_range((x + 3)/(x - 2), x, Interval(-5, 5)
  38. ) == Union(Interval(-oo, Rational(2, 7)), Interval(Rational(8, 3), oo))
  39. assert function_range(1/(x**2), x, Interval(-1, 1)
  40. ) == Interval(1, oo)
  41. assert function_range(exp(x), x, Interval(-1, 1)
  42. ) == Interval(exp(-1), exp(1))
  43. assert function_range(log(x) - x, x, S.Reals
  44. ) == Interval(-oo, -1)
  45. assert function_range(sqrt(3*x - 1), x, Interval(0, 2)
  46. ) == Interval(0, sqrt(5))
  47. assert function_range(x*(x - 1) - (x**2 - x), x, S.Reals
  48. ) == FiniteSet(0)
  49. assert function_range(x*(x - 1) - (x**2 - x) + y, x, S.Reals
  50. ) == FiniteSet(y)
  51. assert function_range(sin(x), x, Union(Interval(-5, -3), FiniteSet(4))
  52. ) == Union(Interval(-sin(3), 1), FiniteSet(sin(4)))
  53. assert function_range(cos(x), x, Interval(-oo, -4)
  54. ) == Interval(-1, 1)
  55. assert function_range(cos(x), x, S.EmptySet) == S.EmptySet
  56. assert function_range(x/sqrt(x**2+1), x, S.Reals) == Interval.open(-1,1)
  57. raises(NotImplementedError, lambda : function_range(
  58. exp(x)*(sin(x) - cos(x))/2 - x, x, S.Reals))
  59. raises(NotImplementedError, lambda : function_range(
  60. sin(x) + x, x, S.Reals)) # issue 13273
  61. raises(NotImplementedError, lambda : function_range(
  62. log(x), x, S.Integers))
  63. raises(NotImplementedError, lambda : function_range(
  64. sin(x)/2, x, S.Naturals))
  65. @slow
  66. def test_function_range1():
  67. assert function_range(tan(x)**2 + tan(3*x)**2 + 1, x, S.Reals) == Interval(1,oo)
  68. def test_continuous_domain():
  69. assert continuous_domain(sin(x), x, Interval(0, 2*pi)) == Interval(0, 2*pi)
  70. assert continuous_domain(tan(x), x, Interval(0, 2*pi)) == \
  71. Union(Interval(0, pi/2, False, True), Interval(pi/2, pi*Rational(3, 2), True, True),
  72. Interval(pi*Rational(3, 2), 2*pi, True, False))
  73. assert continuous_domain(cot(x), x, Interval(0, 2*pi)) == Union(
  74. Interval.open(0, pi), Interval.open(pi, 2*pi))
  75. assert continuous_domain((x - 1)/((x - 1)**2), x, S.Reals) == \
  76. Union(Interval(-oo, 1, True, True), Interval(1, oo, True, True))
  77. assert continuous_domain(log(x) + log(4*x - 1), x, S.Reals) == \
  78. Interval(Rational(1, 4), oo, True, True)
  79. assert continuous_domain(1/sqrt(x - 3), x, S.Reals) == Interval(3, oo, True, True)
  80. assert continuous_domain(1/x - 2, x, S.Reals) == \
  81. Union(Interval.open(-oo, 0), Interval.open(0, oo))
  82. assert continuous_domain(1/(x**2 - 4) + 2, x, S.Reals) == \
  83. Union(Interval.open(-oo, -2), Interval.open(-2, 2), Interval.open(2, oo))
  84. assert continuous_domain((x+1)**pi, x, S.Reals) == Interval(-1, oo)
  85. assert continuous_domain((x+1)**(pi/2), x, S.Reals) == Interval(-1, oo)
  86. assert continuous_domain(x**x, x, S.Reals) == Interval(0, oo)
  87. assert continuous_domain((x+1)**log(x**2), x, S.Reals) == Union(
  88. Interval.Ropen(-1, 0), Interval.open(0, oo))
  89. domain = continuous_domain(log(tan(x)**2 + 1), x, S.Reals)
  90. assert not domain.contains(3*pi/2)
  91. assert domain.contains(5)
  92. d = Symbol('d', even=True, zero=False)
  93. assert continuous_domain(x**(1/d), x, S.Reals) == Interval(0, oo)
  94. n = Dummy('n')
  95. assert continuous_domain(1/sin(x), x, S.Reals).dummy_eq(Complement(
  96. S.Reals, Union(ImageSet(Lambda(n, 2*n*pi + pi), S.Integers),
  97. ImageSet(Lambda(n, 2*n*pi), S.Integers))))
  98. assert continuous_domain(sin(x) + cos(x), x, S.Reals) == S.Reals
  99. assert continuous_domain(asin(x), x, S.Reals) == Interval(-1, 1) # issue #21786
  100. assert continuous_domain(1/acos(log(x)), x, S.Reals) == Interval.Ropen(exp(-1), E)
  101. assert continuous_domain(sinh(x)+cosh(x), x, S.Reals) == S.Reals
  102. assert continuous_domain(tanh(x)+sech(x), x, S.Reals) == S.Reals
  103. assert continuous_domain(atan(x)+asinh(x), x, S.Reals) == S.Reals
  104. assert continuous_domain(acosh(x), x, S.Reals) == Interval(1, oo)
  105. assert continuous_domain(atanh(x), x, S.Reals) == Interval.open(-1, 1)
  106. assert continuous_domain(atanh(x)+acosh(x), x, S.Reals) == S.EmptySet
  107. assert continuous_domain(asech(x), x, S.Reals) == Interval.Lopen(0, 1)
  108. assert continuous_domain(acoth(x), x, S.Reals) == Union(
  109. Interval.open(-oo, -1), Interval.open(1, oo))
  110. assert continuous_domain(asec(x), x, S.Reals) == Union(
  111. Interval(-oo, -1), Interval(1, oo))
  112. assert continuous_domain(acsc(x), x, S.Reals) == Union(
  113. Interval(-oo, -1), Interval(1, oo))
  114. for f in (coth, acsch, csch):
  115. assert continuous_domain(f(x), x, S.Reals) == Union(
  116. Interval.open(-oo, 0), Interval.open(0, oo))
  117. assert continuous_domain(acot(x), x, S.Reals).contains(0) == False
  118. assert continuous_domain(1/(exp(x) - x), x, S.Reals) == Complement(
  119. S.Reals, ConditionSet(x, Eq(-x + exp(x), 0), S.Reals))
  120. assert continuous_domain(frac(x**2), x, Interval(-2,-1)) == Union(
  121. Interval.open(-2, -sqrt(3)), Interval.open(-sqrt(2), -1),
  122. Interval.open(-sqrt(3), -sqrt(2)))
  123. assert continuous_domain(frac(x), x, S.Reals) == Complement(
  124. S.Reals, S.Integers)
  125. raises(NotImplementedError, lambda : continuous_domain(
  126. 1/(x**2+1), x, S.Complexes))
  127. raises(NotImplementedError, lambda : continuous_domain(
  128. gamma(x), x, Interval(-5,0)))
  129. assert continuous_domain(x + gamma(pi), x, S.Reals) == S.Reals
  130. @XFAIL
  131. def test_continuous_domain_acot():
  132. acot_cont = Piecewise((pi+acot(x), x<0), (acot(x), True))
  133. assert continuous_domain(acot_cont, x, S.Reals) == S.Reals
  134. @XFAIL
  135. def test_continuous_domain_gamma():
  136. assert continuous_domain(gamma(x), x, S.Reals).contains(-1) == False
  137. @XFAIL
  138. def test_continuous_domain_neg_power():
  139. assert continuous_domain((x-2)**(1-x), x, S.Reals) == Interval.open(2, oo)
  140. def test_not_empty_in():
  141. assert not_empty_in(FiniteSet(x, 2*x).intersect(Interval(1, 2, True, False)), x) == \
  142. Interval(S.Half, 2, True, False)
  143. assert not_empty_in(FiniteSet(x, x**2).intersect(Interval(1, 2)), x) == \
  144. Union(Interval(-sqrt(2), -1), Interval(1, 2))
  145. assert not_empty_in(FiniteSet(x**2 + x, x).intersect(Interval(2, 4)), x) == \
  146. Union(Interval(-sqrt(17)/2 - S.Half, -2),
  147. Interval(1, Rational(-1, 2) + sqrt(17)/2), Interval(2, 4))
  148. assert not_empty_in(FiniteSet(x/(x - 1)).intersect(S.Reals), x) == \
  149. Complement(S.Reals, FiniteSet(1))
  150. assert not_empty_in(FiniteSet(a/(a - 1)).intersect(S.Reals), a) == \
  151. Complement(S.Reals, FiniteSet(1))
  152. assert not_empty_in(FiniteSet((x**2 - 3*x + 2)/(x - 1)).intersect(S.Reals), x) == \
  153. Complement(S.Reals, FiniteSet(1))
  154. assert not_empty_in(FiniteSet(3, 4, x/(x - 1)).intersect(Interval(2, 3)), x) == \
  155. Interval(-oo, oo)
  156. assert not_empty_in(FiniteSet(4, x/(x - 1)).intersect(Interval(2, 3)), x) == \
  157. Interval(S(3)/2, 2)
  158. assert not_empty_in(FiniteSet(x/(x**2 - 1)).intersect(S.Reals), x) == \
  159. Complement(S.Reals, FiniteSet(-1, 1))
  160. assert not_empty_in(FiniteSet(x, x**2).intersect(Union(Interval(1, 3, True, True),
  161. Interval(4, 5))), x) == \
  162. Union(Interval(-sqrt(5), -2), Interval(-sqrt(3), -1, True, True),
  163. Interval(1, 3, True, True), Interval(4, 5))
  164. assert not_empty_in(FiniteSet(1).intersect(Interval(3, 4)), x) == S.EmptySet
  165. assert not_empty_in(FiniteSet(x**2/(x + 2)).intersect(Interval(1, oo)), x) == \
  166. Union(Interval(-2, -1, True, False), Interval(2, oo))
  167. raises(ValueError, lambda: not_empty_in(x))
  168. raises(ValueError, lambda: not_empty_in(Interval(0, 1), x))
  169. raises(NotImplementedError,
  170. lambda: not_empty_in(FiniteSet(x).intersect(S.Reals), x, a))
  171. @_both_exp_pow
  172. def test_periodicity():
  173. assert periodicity(sin(2*x), x) == pi
  174. assert periodicity((-2)*tan(4*x), x) == pi/4
  175. assert periodicity(sin(x)**2, x) == 2*pi
  176. assert periodicity(3**tan(3*x), x) == pi/3
  177. assert periodicity(tan(x)*cos(x), x) == 2*pi
  178. assert periodicity(sin(x)**(tan(x)), x) == 2*pi
  179. assert periodicity(tan(x)*sec(x), x) == 2*pi
  180. assert periodicity(sin(2*x)*cos(2*x) - y, x) == pi/2
  181. assert periodicity(tan(x) + cot(x), x) == pi
  182. assert periodicity(sin(x) - cos(2*x), x) == 2*pi
  183. assert periodicity(sin(x) - 1, x) == 2*pi
  184. assert periodicity(sin(4*x) + sin(x)*cos(x), x) == pi
  185. assert periodicity(exp(sin(x)), x) == 2*pi
  186. assert periodicity(log(cot(2*x)) - sin(cos(2*x)), x) == pi
  187. assert periodicity(sin(2*x)*exp(tan(x) - csc(2*x)), x) == pi
  188. assert periodicity(cos(sec(x) - csc(2*x)), x) == 2*pi
  189. assert periodicity(tan(sin(2*x)), x) == pi
  190. assert periodicity(2*tan(x)**2, x) == pi
  191. assert periodicity(sin(x%4), x) == 4
  192. assert periodicity(sin(x)%4, x) == 2*pi
  193. assert periodicity(tan((3*x-2)%4), x) == Rational(4, 3)
  194. assert periodicity((sqrt(2)*(x+1)+x) % 3, x) == 3 / (sqrt(2)+1)
  195. assert periodicity((x**2+1) % x, x) is None
  196. assert periodicity(sin(re(x)), x) == 2*pi
  197. assert periodicity(sin(x)**2 + cos(x)**2, x) is S.Zero
  198. assert periodicity(tan(x), y) is S.Zero
  199. assert periodicity(sin(x) + I*cos(x), x) == 2*pi
  200. assert periodicity(x - sin(2*y), y) == pi
  201. assert periodicity(exp(x), x) is None
  202. assert periodicity(exp(I*x), x) == 2*pi
  203. assert periodicity(exp(I*a), a) == 2*pi
  204. assert periodicity(exp(a), a) is None
  205. assert periodicity(exp(log(sin(a) + I*cos(2*a)), evaluate=False), a) == 2*pi
  206. assert periodicity(exp(log(sin(2*a) + I*cos(a)), evaluate=False), a) == 2*pi
  207. assert periodicity(exp(sin(a)), a) == 2*pi
  208. assert periodicity(exp(2*I*a), a) == pi
  209. assert periodicity(exp(a + I*sin(a)), a) is None
  210. assert periodicity(exp(cos(a/2) + sin(a)), a) == 4*pi
  211. assert periodicity(log(x), x) is None
  212. assert periodicity(exp(x)**sin(x), x) is None
  213. assert periodicity(sin(x)**y, y) is None
  214. assert periodicity(Abs(sin(Abs(sin(x)))), x) == pi
  215. assert all(periodicity(Abs(f(x)), x) == pi for f in (
  216. cos, sin, sec, csc, tan, cot))
  217. assert periodicity(Abs(sin(tan(x))), x) == pi
  218. assert periodicity(Abs(sin(sin(x) + tan(x))), x) == 2*pi
  219. assert periodicity(sin(x) > S.Half, x) == 2*pi
  220. assert periodicity(x > 2, x) is None
  221. assert periodicity(x**3 - x**2 + 1, x) is None
  222. assert periodicity(Abs(x), x) is None
  223. assert periodicity(Abs(x**2 - 1), x) is None
  224. assert periodicity((x**2 + 4)%2, x) is None
  225. assert periodicity((E**x)%3, x) is None
  226. assert periodicity(sin(expint(1, x))/expint(1, x), x) is None
  227. # returning `None` for any Piecewise
  228. p = Piecewise((0, x < -1), (x**2, x <= 1), (log(x), True))
  229. assert periodicity(p, x) is None
  230. m = MatrixSymbol('m', 3, 3)
  231. raises(NotImplementedError, lambda: periodicity(sin(m), m))
  232. raises(NotImplementedError, lambda: periodicity(sin(m[0, 0]), m))
  233. raises(NotImplementedError, lambda: periodicity(sin(m), m[0, 0]))
  234. raises(NotImplementedError, lambda: periodicity(sin(m[0, 0]), m[0, 0]))
  235. def test_periodicity_check():
  236. assert periodicity(tan(x), x, check=True) == pi
  237. assert periodicity(sin(x) + cos(x), x, check=True) == 2*pi
  238. assert periodicity(sec(x), x) == 2*pi
  239. assert periodicity(sin(x*y), x) == 2*pi/abs(y)
  240. assert periodicity(Abs(sec(sec(x))), x) == pi
  241. def test_lcim():
  242. assert lcim([S.Half, S(2), S(3)]) == 6
  243. assert lcim([pi/2, pi/4, pi]) == pi
  244. assert lcim([2*pi, pi/2]) == 2*pi
  245. assert lcim([S.One, 2*pi]) is None
  246. assert lcim([S(2) + 2*E, E/3 + Rational(1, 3), S.One + E]) == S(2) + 2*E
  247. def test_is_convex():
  248. assert is_convex(1/x, x, domain=Interval.open(0, oo)) == True
  249. assert is_convex(1/x, x, domain=Interval(-oo, 0)) == False
  250. assert is_convex(x**2, x, domain=Interval(0, oo)) == True
  251. assert is_convex(1/x**3, x, domain=Interval.Lopen(0, oo)) == True
  252. assert is_convex(-1/x**3, x, domain=Interval.Ropen(-oo, 0)) == True
  253. assert is_convex(log(x) ,x) == False
  254. assert is_convex(x**2+y**2, x, y) == True
  255. assert is_convex(cos(x) + cos(y), x) == False
  256. assert is_convex(8*x**2 - 2*y**2, x, y) == False
  257. def test_stationary_points():
  258. assert stationary_points(sin(x), x, Interval(-pi/2, pi/2)
  259. ) == {-pi/2, pi/2}
  260. assert stationary_points(sin(x), x, Interval.Ropen(0, pi/4)
  261. ) is S.EmptySet
  262. assert stationary_points(tan(x), x,
  263. ) is S.EmptySet
  264. assert stationary_points(sin(x)*cos(x), x, Interval(0, pi)
  265. ) == {pi/4, pi*Rational(3, 4)}
  266. assert stationary_points(sec(x), x, Interval(0, pi)
  267. ) == {0, pi}
  268. assert stationary_points((x+3)*(x-2), x
  269. ) == FiniteSet(Rational(-1, 2))
  270. assert stationary_points((x + 3)/(x - 2), x, Interval(-5, 5)
  271. ) is S.EmptySet
  272. assert stationary_points((x**2+3)/(x-2), x
  273. ) == {2 - sqrt(7), 2 + sqrt(7)}
  274. assert stationary_points((x**2+3)/(x-2), x, Interval(0, 5)
  275. ) == {2 + sqrt(7)}
  276. assert stationary_points(x**4 + x**3 - 5*x**2, x, S.Reals
  277. ) == FiniteSet(-2, 0, Rational(5, 4))
  278. assert stationary_points(exp(x), x
  279. ) is S.EmptySet
  280. assert stationary_points(log(x) - x, x, S.Reals
  281. ) == {1}
  282. assert stationary_points(cos(x), x, Union(Interval(0, 5), Interval(-6, -3))
  283. ) == {0, -pi, pi}
  284. assert stationary_points(y, x, S.Reals
  285. ) == S.Reals
  286. assert stationary_points(y, x, S.EmptySet) == S.EmptySet
  287. def test_maximum():
  288. assert maximum(sin(x), x) is S.One
  289. assert maximum(sin(x), x, Interval(0, 1)) == sin(1)
  290. assert maximum(tan(x), x) is oo
  291. assert maximum(tan(x), x, Interval(-pi/4, pi/4)) is S.One
  292. assert maximum(sin(x)*cos(x), x, S.Reals) == S.Half
  293. assert simplify(maximum(sin(x)*cos(x), x, Interval(pi*Rational(3, 8), pi*Rational(5, 8)))
  294. ) == sqrt(2)/4
  295. assert maximum((x+3)*(x-2), x) is oo
  296. assert maximum((x+3)*(x-2), x, Interval(-5, 0)) == S(14)
  297. assert maximum((x+3)/(x-2), x, Interval(-5, 0)) == Rational(2, 7)
  298. assert simplify(maximum(-x**4-x**3+x**2+10, x)
  299. ) == 41*sqrt(41)/512 + Rational(5419, 512)
  300. assert maximum(exp(x), x, Interval(-oo, 2)) == exp(2)
  301. assert maximum(log(x) - x, x, S.Reals) is S.NegativeOne
  302. assert maximum(cos(x), x, Union(Interval(0, 5), Interval(-6, -3))
  303. ) is S.One
  304. assert maximum(cos(x)-sin(x), x, S.Reals) == sqrt(2)
  305. assert maximum(y, x, S.Reals) == y
  306. assert maximum(abs(a**3 + a), a, Interval(0, 2)) == 10
  307. assert maximum(abs(60*a**3 + 24*a), a, Interval(0, 2)) == 528
  308. assert maximum(abs(12*a*(5*a**2 + 2)), a, Interval(0, 2)) == 528
  309. assert maximum(x/sqrt(x**2+1), x, S.Reals) == 1
  310. raises(ValueError, lambda : maximum(sin(x), x, S.EmptySet))
  311. raises(ValueError, lambda : maximum(log(cos(x)), x, S.EmptySet))
  312. raises(ValueError, lambda : maximum(1/(x**2 + y**2 + 1), x, S.EmptySet))
  313. raises(ValueError, lambda : maximum(sin(x), sin(x)))
  314. raises(ValueError, lambda : maximum(sin(x), x*y, S.EmptySet))
  315. raises(ValueError, lambda : maximum(sin(x), S.One))
  316. def test_minimum():
  317. assert minimum(sin(x), x) is S.NegativeOne
  318. assert minimum(sin(x), x, Interval(1, 4)) == sin(4)
  319. assert minimum(tan(x), x) is -oo
  320. assert minimum(tan(x), x, Interval(-pi/4, pi/4)) is S.NegativeOne
  321. assert minimum(sin(x)*cos(x), x, S.Reals) == Rational(-1, 2)
  322. assert simplify(minimum(sin(x)*cos(x), x, Interval(pi*Rational(3, 8), pi*Rational(5, 8)))
  323. ) == -sqrt(2)/4
  324. assert minimum((x+3)*(x-2), x) == Rational(-25, 4)
  325. assert minimum((x+3)/(x-2), x, Interval(-5, 0)) == Rational(-3, 2)
  326. assert minimum(x**4-x**3+x**2+10, x) == S(10)
  327. assert minimum(exp(x), x, Interval(-2, oo)) == exp(-2)
  328. assert minimum(log(x) - x, x, S.Reals) is -oo
  329. assert minimum(cos(x), x, Union(Interval(0, 5), Interval(-6, -3))
  330. ) is S.NegativeOne
  331. assert minimum(cos(x)-sin(x), x, S.Reals) == -sqrt(2)
  332. assert minimum(y, x, S.Reals) == y
  333. assert minimum(x/sqrt(x**2+1), x, S.Reals) == -1
  334. raises(ValueError, lambda : minimum(sin(x), x, S.EmptySet))
  335. raises(ValueError, lambda : minimum(log(cos(x)), x, S.EmptySet))
  336. raises(ValueError, lambda : minimum(1/(x**2 + y**2 + 1), x, S.EmptySet))
  337. raises(ValueError, lambda : minimum(sin(x), sin(x)))
  338. raises(ValueError, lambda : minimum(sin(x), x*y, S.EmptySet))
  339. raises(ValueError, lambda : minimum(sin(x), S.One))
  340. def test_issue_19869():
  341. assert (maximum(sqrt(3)*(x - 1)/(3*sqrt(x**2 + 1)), x)
  342. ) == sqrt(3)/3
  343. def test_issue_16469():
  344. f = abs(a)
  345. assert function_range(f, a, S.Reals) == Interval(0, oo, False, True)
  346. @_both_exp_pow
  347. def test_issue_18747():
  348. assert periodicity(exp(pi*I*(x/4 + S.Half/2)), x) == 8
  349. def test_issue_25942():
  350. assert (acos(x) > pi/3).as_set() == Interval.Ropen(-1, S(1)/2)