test_singularity_functions.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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, 0).fdiff() == SingularityFunction(x, 4, -1)
  17. assert SingularityFunction(y, 6, 2).diff(y) == 2*SingularityFunction(y, 6, 1)
  18. assert SingularityFunction(y, -4, -1).diff(y) == SingularityFunction(y, -4, -2)
  19. assert SingularityFunction(y, 4, 0).diff(y) == SingularityFunction(y, 4, -1)
  20. assert SingularityFunction(y, 4, 0).diff(y, 2) == SingularityFunction(y, 4, -2)
  21. n = Symbol('n', positive=True)
  22. assert SingularityFunction(x, a, n).fdiff() == n*SingularityFunction(x, a, n - 1)
  23. assert SingularityFunction(y, a, n).diff(y) == n*SingularityFunction(y, a, n - 1)
  24. expr_in = 4*SingularityFunction(x, a, n) + 3*SingularityFunction(x, a, -1) + -10*SingularityFunction(x, a, 0)
  25. expr_out = n*4*SingularityFunction(x, a, n - 1) + 3*SingularityFunction(x, a, -2) - 10*SingularityFunction(x, a, -1)
  26. assert diff(expr_in, x) == expr_out
  27. assert SingularityFunction(x, -10, 5).diff(evaluate=False) == (
  28. Derivative(SingularityFunction(x, -10, 5), x))
  29. raises(ArgumentIndexError, lambda: SingularityFunction(x, 4, 5).fdiff(2))
  30. def test_eval():
  31. assert SingularityFunction(x, a, n).func == SingularityFunction
  32. assert unchanged(SingularityFunction, x, 5, n)
  33. assert SingularityFunction(5, 3, 2) == 4
  34. assert SingularityFunction(3, 5, 1) == 0
  35. assert SingularityFunction(3, 3, 0) == 1
  36. assert SingularityFunction(4, 4, -1) is oo
  37. assert SingularityFunction(4, 2, -1) == 0
  38. assert SingularityFunction(4, 7, -1) == 0
  39. assert SingularityFunction(5, 6, -2) == 0
  40. assert SingularityFunction(4, 2, -2) == 0
  41. assert SingularityFunction(4, 4, -2) is oo
  42. assert (SingularityFunction(6.1, 4, 5)).evalf(5) == Float('40.841', '5')
  43. assert SingularityFunction(6.1, pi, 2) == (-pi + 6.1)**2
  44. assert SingularityFunction(x, a, nan) is nan
  45. assert SingularityFunction(x, nan, 1) is nan
  46. assert SingularityFunction(nan, a, n) is nan
  47. raises(ValueError, lambda: SingularityFunction(x, a, I))
  48. raises(ValueError, lambda: SingularityFunction(2*I, I, n))
  49. raises(ValueError, lambda: SingularityFunction(x, a, -3))
  50. def test_leading_term():
  51. l = Symbol('l', positive=True)
  52. assert SingularityFunction(x, 3, 2).as_leading_term(x) == 0
  53. assert SingularityFunction(x, -2, 1).as_leading_term(x) == 2
  54. assert SingularityFunction(x, 0, 0).as_leading_term(x) == 1
  55. assert SingularityFunction(x, 0, 0).as_leading_term(x, cdir=-1) == 0
  56. assert SingularityFunction(x, 0, -1).as_leading_term(x) == 0
  57. assert SingularityFunction(x, 0, -2).as_leading_term(x) == 0
  58. assert (SingularityFunction(x + l, 0, 1)/2\
  59. - SingularityFunction(x + l, l/2, 1)\
  60. + SingularityFunction(x + l, l, 1)/2).as_leading_term(x) == -x/2
  61. def test_series():
  62. l = Symbol('l', positive=True)
  63. assert SingularityFunction(x, -3, 2).series(x) == x**2 + 6*x + 9
  64. assert SingularityFunction(x, -2, 1).series(x) == x + 2
  65. assert SingularityFunction(x, 0, 0).series(x) == 1
  66. assert SingularityFunction(x, 0, 0).series(x, dir='-') == 0
  67. assert SingularityFunction(x, 0, -1).series(x) == 0
  68. assert SingularityFunction(x, 0, -2).series(x) == 0
  69. assert (SingularityFunction(x + l, 0, 1)/2\
  70. - SingularityFunction(x + l, l/2, 1)\
  71. + SingularityFunction(x + l, l, 1)/2).nseries(x) == -x/2 + O(x**6)
  72. def test_rewrite():
  73. assert SingularityFunction(x, 4, 5).rewrite(Piecewise) == (
  74. Piecewise(((x - 4)**5, x - 4 > 0), (0, True)))
  75. assert SingularityFunction(x, -10, 0).rewrite(Piecewise) == (
  76. Piecewise((1, x + 10 > 0), (0, True)))
  77. assert SingularityFunction(x, 2, -1).rewrite(Piecewise) == (
  78. Piecewise((oo, Eq(x - 2, 0)), (0, True)))
  79. assert SingularityFunction(x, 0, -2).rewrite(Piecewise) == (
  80. Piecewise((oo, Eq(x, 0)), (0, True)))
  81. n = Symbol('n', nonnegative=True)
  82. assert SingularityFunction(x, a, n).rewrite(Piecewise) == (
  83. Piecewise(((x - a)**n, x - a > 0), (0, True)))
  84. expr_in = SingularityFunction(x, 4, 5) + SingularityFunction(x, -3, -1) - SingularityFunction(x, 0, -2)
  85. expr_out = (x - 4)**5*Heaviside(x - 4) + DiracDelta(x + 3) - DiracDelta(x, 1)
  86. assert expr_in.rewrite(Heaviside) == expr_out
  87. assert expr_in.rewrite(DiracDelta) == expr_out
  88. assert expr_in.rewrite('HeavisideDiracDelta') == expr_out
  89. expr_in = SingularityFunction(x, a, n) + SingularityFunction(x, a, -1) - SingularityFunction(x, a, -2)
  90. expr_out = (x - a)**n*Heaviside(x - a) + DiracDelta(x - a) + DiracDelta(a - x, 1)
  91. assert expr_in.rewrite(Heaviside) == expr_out
  92. assert expr_in.rewrite(DiracDelta) == expr_out
  93. assert expr_in.rewrite('HeavisideDiracDelta') == expr_out