test_singularity_functions.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. from sympy.core.function import (Derivative, diff)
  2. from sympy.core.numbers import (Float, I, nan, oo, pi)
  3. from sympy.core.relational import Eq
  4. from sympy.core.symbol import (Symbol, symbols)
  5. from sympy.functions.elementary.piecewise import Piecewise
  6. from sympy.functions.special.delta_functions import (DiracDelta, Heaviside)
  7. from sympy.functions.special.singularity_functions import SingularityFunction
  8. from sympy.series.order import O
  9. from sympy.core.expr import unchanged
  10. from sympy.core.function import ArgumentIndexError
  11. from sympy.testing.pytest import raises
  12. x, y, a, n = symbols('x y a n')
  13. def test_fdiff():
  14. assert SingularityFunction(x, 4, 5).fdiff() == 5*SingularityFunction(x, 4, 4)
  15. assert SingularityFunction(x, 4, -1).fdiff() == SingularityFunction(x, 4, -2)
  16. assert SingularityFunction(x, 4, -2).fdiff() == SingularityFunction(x, 4, -3)
  17. assert SingularityFunction(x, 4, -3).fdiff() == SingularityFunction(x, 4, -4)
  18. assert SingularityFunction(x, 4, 0).fdiff() == SingularityFunction(x, 4, -1)
  19. assert SingularityFunction(y, 6, 2).diff(y) == 2*SingularityFunction(y, 6, 1)
  20. assert SingularityFunction(y, -4, -1).diff(y) == SingularityFunction(y, -4, -2)
  21. assert SingularityFunction(y, 4, 0).diff(y) == SingularityFunction(y, 4, -1)
  22. assert SingularityFunction(y, 4, 0).diff(y, 2) == SingularityFunction(y, 4, -2)
  23. n = Symbol('n', positive=True)
  24. assert SingularityFunction(x, a, n).fdiff() == n*SingularityFunction(x, a, n - 1)
  25. assert SingularityFunction(y, a, n).diff(y) == n*SingularityFunction(y, a, n - 1)
  26. expr_in = 4*SingularityFunction(x, a, n) + 3*SingularityFunction(x, a, -1) + -10*SingularityFunction(x, a, 0)
  27. expr_out = n*4*SingularityFunction(x, a, n - 1) + 3*SingularityFunction(x, a, -2) - 10*SingularityFunction(x, a, -1)
  28. assert diff(expr_in, x) == expr_out
  29. assert SingularityFunction(x, -10, 5).diff(evaluate=False) == (
  30. Derivative(SingularityFunction(x, -10, 5), x))
  31. raises(ArgumentIndexError, lambda: SingularityFunction(x, 4, 5).fdiff(2))
  32. def test_eval():
  33. assert SingularityFunction(x, a, n).func == SingularityFunction
  34. assert unchanged(SingularityFunction, x, 5, n)
  35. assert SingularityFunction(5, 3, 2) == 4
  36. assert SingularityFunction(3, 5, 1) == 0
  37. assert SingularityFunction(3, 3, 0) == 1
  38. assert SingularityFunction(3, 3, 1) == 0
  39. assert SingularityFunction(Symbol('z', zero=True), 0, 1) == 0 # like sin(z) == 0
  40. assert SingularityFunction(4, 4, -1) is oo
  41. assert SingularityFunction(4, 2, -1) == 0
  42. assert SingularityFunction(4, 7, -1) == 0
  43. assert SingularityFunction(5, 6, -2) == 0
  44. assert SingularityFunction(4, 2, -2) == 0
  45. assert SingularityFunction(4, 4, -2) is oo
  46. assert SingularityFunction(4, 2, -3) == 0
  47. assert SingularityFunction(8, 8, -3) is oo
  48. assert SingularityFunction(4, 2, -4) == 0
  49. assert SingularityFunction(8, 8, -4) is oo
  50. assert (SingularityFunction(6.1, 4, 5)).evalf(5) == Float('40.841', '5')
  51. assert SingularityFunction(6.1, pi, 2) == (-pi + 6.1)**2
  52. assert SingularityFunction(x, a, nan) is nan
  53. assert SingularityFunction(x, nan, 1) is nan
  54. assert SingularityFunction(nan, a, n) is nan
  55. raises(ValueError, lambda: SingularityFunction(x, a, I))
  56. raises(ValueError, lambda: SingularityFunction(2*I, I, n))
  57. raises(ValueError, lambda: SingularityFunction(x, a, -5))
  58. def test_leading_term():
  59. l = Symbol('l', positive=True)
  60. assert SingularityFunction(x, 3, 2).as_leading_term(x) == 0
  61. assert SingularityFunction(x, -2, 1).as_leading_term(x) == 2
  62. assert SingularityFunction(x, 0, 0).as_leading_term(x) == 1
  63. assert SingularityFunction(x, 0, 0).as_leading_term(x, cdir=-1) == 0
  64. assert SingularityFunction(x, 0, -1).as_leading_term(x) == 0
  65. assert SingularityFunction(x, 0, -2).as_leading_term(x) == 0
  66. assert SingularityFunction(x, 0, -3).as_leading_term(x) == 0
  67. assert SingularityFunction(x, 0, -4).as_leading_term(x) == 0
  68. assert (SingularityFunction(x + l, 0, 1)/2\
  69. - SingularityFunction(x + l, l/2, 1)\
  70. + SingularityFunction(x + l, l, 1)/2).as_leading_term(x) == -x/2
  71. def test_series():
  72. l = Symbol('l', positive=True)
  73. assert SingularityFunction(x, -3, 2).series(x) == x**2 + 6*x + 9
  74. assert SingularityFunction(x, -2, 1).series(x) == x + 2
  75. assert SingularityFunction(x, 0, 0).series(x) == 1
  76. assert SingularityFunction(x, 0, 0).series(x, dir='-') == 0
  77. assert SingularityFunction(x, 0, -1).series(x) == 0
  78. assert SingularityFunction(x, 0, -2).series(x) == 0
  79. assert SingularityFunction(x, 0, -3).series(x) == 0
  80. assert SingularityFunction(x, 0, -4).series(x) == 0
  81. assert (SingularityFunction(x + l, 0, 1)/2\
  82. - SingularityFunction(x + l, l/2, 1)\
  83. + SingularityFunction(x + l, l, 1)/2).nseries(x) == -x/2 + O(x**6)
  84. def test_rewrite():
  85. assert SingularityFunction(x, 4, 5).rewrite(Piecewise) == (
  86. Piecewise(((x - 4)**5, x - 4 >= 0), (0, True)))
  87. assert SingularityFunction(x, -10, 0).rewrite(Piecewise) == (
  88. Piecewise((1, x + 10 >= 0), (0, True)))
  89. assert SingularityFunction(x, 2, -1).rewrite(Piecewise) == (
  90. Piecewise((oo, Eq(x - 2, 0)), (0, True)))
  91. assert SingularityFunction(x, 0, -2).rewrite(Piecewise) == (
  92. Piecewise((oo, Eq(x, 0)), (0, True)))
  93. n = Symbol('n', nonnegative=True)
  94. p = SingularityFunction(x, a, n).rewrite(Piecewise)
  95. assert p == (
  96. Piecewise(((x - a)**n, x - a >= 0), (0, True)))
  97. assert p.subs(x, a).subs(n, 0) == 1
  98. expr_in = SingularityFunction(x, 4, 5) + SingularityFunction(x, -3, -1) - SingularityFunction(x, 0, -2)
  99. expr_out = (x - 4)**5*Heaviside(x - 4, 1) + DiracDelta(x + 3) - DiracDelta(x, 1)
  100. assert expr_in.rewrite(Heaviside) == expr_out
  101. assert expr_in.rewrite(DiracDelta) == expr_out
  102. assert expr_in.rewrite('HeavisideDiracDelta') == expr_out
  103. expr_in = SingularityFunction(x, a, n) + SingularityFunction(x, a, -1) - SingularityFunction(x, a, -2)
  104. expr_out = (x - a)**n*Heaviside(x - a, 1) + DiracDelta(x - a) + DiracDelta(a - x, 1)
  105. assert expr_in.rewrite(Heaviside) == expr_out
  106. assert expr_in.rewrite(DiracDelta) == expr_out
  107. assert expr_in.rewrite('HeavisideDiracDelta') == expr_out