test_singularities.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. from sympy.core.numbers import (I, Rational, pi, oo)
  2. from sympy.core.singleton import S
  3. from sympy.core.symbol import Symbol, Dummy
  4. from sympy.core.function import Lambda
  5. from sympy.functions.elementary.exponential import (exp, log)
  6. from sympy.functions.elementary.trigonometric import sec, csc
  7. from sympy.functions.elementary.hyperbolic import (coth, sech,
  8. atanh, asech, acoth, acsch)
  9. from sympy.functions.elementary.miscellaneous import sqrt
  10. from sympy.calculus.singularities import (
  11. singularities,
  12. is_increasing,
  13. is_strictly_increasing,
  14. is_decreasing,
  15. is_strictly_decreasing,
  16. is_monotonic
  17. )
  18. from sympy.sets import Interval, FiniteSet, Union, ImageSet
  19. from sympy.testing.pytest import raises
  20. from sympy.abc import x, y
  21. def test_singularities():
  22. x = Symbol('x')
  23. assert singularities(x**2, x) == S.EmptySet
  24. assert singularities(x/(x**2 + 3*x + 2), x) == FiniteSet(-2, -1)
  25. assert singularities(1/(x**2 + 1), x) == FiniteSet(I, -I)
  26. assert singularities(x/(x**3 + 1), x) == \
  27. FiniteSet(-1, (1 - sqrt(3) * I) / 2, (1 + sqrt(3) * I) / 2)
  28. assert singularities(1/(y**2 + 2*I*y + 1), y) == \
  29. FiniteSet(-I + sqrt(2)*I, -I - sqrt(2)*I)
  30. _n = Dummy('n')
  31. assert singularities(sech(x), x).dummy_eq(Union(
  32. ImageSet(Lambda(_n, 2*_n*I*pi + I*pi/2), S.Integers),
  33. ImageSet(Lambda(_n, 2*_n*I*pi + 3*I*pi/2), S.Integers)))
  34. assert singularities(coth(x), x).dummy_eq(Union(
  35. ImageSet(Lambda(_n, 2*_n*I*pi + I*pi), S.Integers),
  36. ImageSet(Lambda(_n, 2*_n*I*pi), S.Integers)))
  37. assert singularities(atanh(x), x) == FiniteSet(-1, 1)
  38. assert singularities(acoth(x), x) == FiniteSet(-1, 1)
  39. assert singularities(asech(x), x) == FiniteSet(0)
  40. assert singularities(acsch(x), x) == FiniteSet(0)
  41. x = Symbol('x', real=True)
  42. assert singularities(1/(x**2 + 1), x) == S.EmptySet
  43. assert singularities(exp(1/x), x, S.Reals) == FiniteSet(0)
  44. assert singularities(exp(1/x), x, Interval(1, 2)) == S.EmptySet
  45. assert singularities(log((x - 2)**2), x, Interval(1, 3)) == FiniteSet(2)
  46. raises(NotImplementedError, lambda: singularities(x**-oo, x))
  47. assert singularities(sec(x), x, Interval(0, 3*pi)) == FiniteSet(
  48. pi/2, 3*pi/2, 5*pi/2)
  49. assert singularities(csc(x), x, Interval(0, 3*pi)) == FiniteSet(
  50. 0, pi, 2*pi, 3*pi)
  51. def test_is_increasing():
  52. """Test whether is_increasing returns correct value."""
  53. a = Symbol('a', negative=True)
  54. assert is_increasing(x**3 - 3*x**2 + 4*x, S.Reals)
  55. assert is_increasing(-x**2, Interval(-oo, 0))
  56. assert not is_increasing(-x**2, Interval(0, oo))
  57. assert not is_increasing(4*x**3 - 6*x**2 - 72*x + 30, Interval(-2, 3))
  58. assert is_increasing(x**2 + y, Interval(1, oo), x)
  59. assert is_increasing(-x**2*a, Interval(1, oo), x)
  60. assert is_increasing(1)
  61. assert is_increasing(4*x**3 - 6*x**2 - 72*x + 30, Interval(-2, 3)) is False
  62. def test_is_strictly_increasing():
  63. """Test whether is_strictly_increasing returns correct value."""
  64. assert is_strictly_increasing(
  65. 4*x**3 - 6*x**2 - 72*x + 30, Interval.Ropen(-oo, -2))
  66. assert is_strictly_increasing(
  67. 4*x**3 - 6*x**2 - 72*x + 30, Interval.Lopen(3, oo))
  68. assert not is_strictly_increasing(
  69. 4*x**3 - 6*x**2 - 72*x + 30, Interval.open(-2, 3))
  70. assert not is_strictly_increasing(-x**2, Interval(0, oo))
  71. assert not is_strictly_decreasing(1)
  72. assert is_strictly_increasing(4*x**3 - 6*x**2 - 72*x + 30, Interval.open(-2, 3)) is False
  73. def test_is_decreasing():
  74. """Test whether is_decreasing returns correct value."""
  75. b = Symbol('b', positive=True)
  76. assert is_decreasing(1/(x**2 - 3*x), Interval.open(Rational(3,2), 3))
  77. assert is_decreasing(1/(x**2 - 3*x), Interval.open(1.5, 3))
  78. assert is_decreasing(1/(x**2 - 3*x), Interval.Lopen(3, oo))
  79. assert not is_decreasing(1/(x**2 - 3*x), Interval.Ropen(-oo, Rational(3, 2)))
  80. assert not is_decreasing(-x**2, Interval(-oo, 0))
  81. assert not is_decreasing(-x**2*b, Interval(-oo, 0), x)
  82. def test_is_strictly_decreasing():
  83. """Test whether is_strictly_decreasing returns correct value."""
  84. assert is_strictly_decreasing(1/(x**2 - 3*x), Interval.Lopen(3, oo))
  85. assert not is_strictly_decreasing(
  86. 1/(x**2 - 3*x), Interval.Ropen(-oo, Rational(3, 2)))
  87. assert not is_strictly_decreasing(-x**2, Interval(-oo, 0))
  88. assert not is_strictly_decreasing(1)
  89. assert is_strictly_decreasing(1/(x**2 - 3*x), Interval.open(Rational(3,2), 3))
  90. assert is_strictly_decreasing(1/(x**2 - 3*x), Interval.open(1.5, 3))
  91. def test_is_monotonic():
  92. """Test whether is_monotonic returns correct value."""
  93. assert is_monotonic(1/(x**2 - 3*x), Interval.open(Rational(3,2), 3))
  94. assert is_monotonic(1/(x**2 - 3*x), Interval.open(1.5, 3))
  95. assert is_monotonic(1/(x**2 - 3*x), Interval.Lopen(3, oo))
  96. assert is_monotonic(x**3 - 3*x**2 + 4*x, S.Reals)
  97. assert not is_monotonic(-x**2, S.Reals)
  98. assert is_monotonic(x**2 + y + 1, Interval(1, 2), x)
  99. raises(NotImplementedError, lambda: is_monotonic(x**2 + y + 1))
  100. def test_issue_23401():
  101. x = Symbol('x')
  102. expr = (x + 1)/(-1.0e-3*x**2 + 0.1*x + 0.1)
  103. assert is_increasing(expr, Interval(1,2), x)