test_singularities.py 4.1 KB

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