test_delta_functions.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. from sympy.core.numbers import (I, nan, oo, pi)
  2. from sympy.core.relational import (Eq, Ne)
  3. from sympy.core.singleton import S
  4. from sympy.core.symbol import (Symbol, symbols)
  5. from sympy.functions.elementary.complexes import (adjoint, conjugate, sign, transpose)
  6. from sympy.functions.elementary.miscellaneous import sqrt
  7. from sympy.functions.elementary.piecewise import Piecewise
  8. from sympy.functions.special.delta_functions import (DiracDelta, Heaviside)
  9. from sympy.functions.special.singularity_functions import SingularityFunction
  10. from sympy.simplify.simplify import signsimp
  11. from sympy.testing.pytest import raises
  12. from sympy.core.expr import unchanged
  13. from sympy.core.function import ArgumentIndexError
  14. x, y = symbols('x y')
  15. i = symbols('t', nonzero=True)
  16. j = symbols('j', positive=True)
  17. k = symbols('k', negative=True)
  18. def test_DiracDelta():
  19. assert DiracDelta(1) == 0
  20. assert DiracDelta(5.1) == 0
  21. assert DiracDelta(-pi) == 0
  22. assert DiracDelta(5, 7) == 0
  23. assert DiracDelta(x, 0) == DiracDelta(x)
  24. assert DiracDelta(i) == 0
  25. assert DiracDelta(j) == 0
  26. assert DiracDelta(k) == 0
  27. assert DiracDelta(nan) is nan
  28. assert DiracDelta(0).func is DiracDelta
  29. assert DiracDelta(x).func is DiracDelta
  30. # FIXME: this is generally undefined @ x=0
  31. # But then limit(Delta(c)*Heaviside(x),x,-oo)
  32. # need's to be implemented.
  33. # assert 0*DiracDelta(x) == 0
  34. assert adjoint(DiracDelta(x)) == DiracDelta(x)
  35. assert adjoint(DiracDelta(x - y)) == DiracDelta(x - y)
  36. assert conjugate(DiracDelta(x)) == DiracDelta(x)
  37. assert conjugate(DiracDelta(x - y)) == DiracDelta(x - y)
  38. assert transpose(DiracDelta(x)) == DiracDelta(x)
  39. assert transpose(DiracDelta(x - y)) == DiracDelta(x - y)
  40. assert DiracDelta(x).diff(x) == DiracDelta(x, 1)
  41. assert DiracDelta(x, 1).diff(x) == DiracDelta(x, 2)
  42. assert DiracDelta(x).is_simple(x) is True
  43. assert DiracDelta(3*x).is_simple(x) is True
  44. assert DiracDelta(x**2).is_simple(x) is False
  45. assert DiracDelta(sqrt(x)).is_simple(x) is False
  46. assert DiracDelta(x).is_simple(y) is False
  47. assert DiracDelta(x*y).expand(diracdelta=True, wrt=x) == DiracDelta(x)/abs(y)
  48. assert DiracDelta(x*y).expand(diracdelta=True, wrt=y) == DiracDelta(y)/abs(x)
  49. assert DiracDelta(x**2*y).expand(diracdelta=True, wrt=x) == DiracDelta(x**2*y)
  50. assert DiracDelta(y).expand(diracdelta=True, wrt=x) == DiracDelta(y)
  51. assert DiracDelta((x - 1)*(x - 2)*(x - 3)).expand(diracdelta=True, wrt=x) == (
  52. DiracDelta(x - 3)/2 + DiracDelta(x - 2) + DiracDelta(x - 1)/2)
  53. assert DiracDelta(2*x) != DiracDelta(x) # scaling property
  54. assert DiracDelta(x) == DiracDelta(-x) # even function
  55. assert DiracDelta(-x, 2) == DiracDelta(x, 2)
  56. assert DiracDelta(-x, 1) == -DiracDelta(x, 1) # odd deriv is odd
  57. assert DiracDelta(-oo*x) == DiracDelta(oo*x)
  58. assert DiracDelta(x - y) != DiracDelta(y - x)
  59. assert signsimp(DiracDelta(x - y) - DiracDelta(y - x)) == 0
  60. assert DiracDelta(x*y).expand(diracdelta=True, wrt=x) == DiracDelta(x)/abs(y)
  61. assert DiracDelta(x*y).expand(diracdelta=True, wrt=y) == DiracDelta(y)/abs(x)
  62. assert DiracDelta(x**2*y).expand(diracdelta=True, wrt=x) == DiracDelta(x**2*y)
  63. assert DiracDelta(y).expand(diracdelta=True, wrt=x) == DiracDelta(y)
  64. assert DiracDelta((x - 1)*(x - 2)*(x - 3)).expand(diracdelta=True) == (
  65. DiracDelta(x - 3)/2 + DiracDelta(x - 2) + DiracDelta(x - 1)/2)
  66. raises(ArgumentIndexError, lambda: DiracDelta(x).fdiff(2))
  67. raises(ValueError, lambda: DiracDelta(x, -1))
  68. raises(ValueError, lambda: DiracDelta(I))
  69. raises(ValueError, lambda: DiracDelta(2 + 3*I))
  70. def test_heaviside():
  71. assert Heaviside(-5) == 0
  72. assert Heaviside(1) == 1
  73. assert Heaviside(0) == S.Half
  74. assert Heaviside(0, x) == x
  75. assert unchanged(Heaviside,x, nan)
  76. assert Heaviside(0, nan) == nan
  77. h0 = Heaviside(x, 0)
  78. h12 = Heaviside(x, S.Half)
  79. h1 = Heaviside(x, 1)
  80. assert h0.args == h0.pargs == (x, 0)
  81. assert h1.args == h1.pargs == (x, 1)
  82. assert h12.args == (x, S.Half)
  83. assert h12.pargs == (x,) # default 1/2 suppressed
  84. assert adjoint(Heaviside(x)) == Heaviside(x)
  85. assert adjoint(Heaviside(x - y)) == Heaviside(x - y)
  86. assert conjugate(Heaviside(x)) == Heaviside(x)
  87. assert conjugate(Heaviside(x - y)) == Heaviside(x - y)
  88. assert transpose(Heaviside(x)) == Heaviside(x)
  89. assert transpose(Heaviside(x - y)) == Heaviside(x - y)
  90. assert Heaviside(x).diff(x) == DiracDelta(x)
  91. assert Heaviside(x + I).is_Function is True
  92. assert Heaviside(I*x).is_Function is True
  93. raises(ArgumentIndexError, lambda: Heaviside(x).fdiff(2))
  94. raises(ValueError, lambda: Heaviside(I))
  95. raises(ValueError, lambda: Heaviside(2 + 3*I))
  96. def test_rewrite():
  97. x, y = Symbol('x', real=True), Symbol('y')
  98. assert Heaviside(x).rewrite(Piecewise) == (
  99. Piecewise((0, x < 0), (Heaviside(0), Eq(x, 0)), (1, True)))
  100. assert Heaviside(y).rewrite(Piecewise) == (
  101. Piecewise((0, y < 0), (Heaviside(0), Eq(y, 0)), (1, True)))
  102. assert Heaviside(x, y).rewrite(Piecewise) == (
  103. Piecewise((0, x < 0), (y, Eq(x, 0)), (1, True)))
  104. assert Heaviside(x, 0).rewrite(Piecewise) == (
  105. Piecewise((0, x <= 0), (1, True)))
  106. assert Heaviside(x, 1).rewrite(Piecewise) == (
  107. Piecewise((0, x < 0), (1, True)))
  108. assert Heaviside(x, nan).rewrite(Piecewise) == (
  109. Piecewise((0, x < 0), (nan, Eq(x, 0)), (1, True)))
  110. assert Heaviside(x).rewrite(sign) == \
  111. Heaviside(x, H0=Heaviside(0)).rewrite(sign) == \
  112. Piecewise(
  113. (sign(x)/2 + S(1)/2, Eq(Heaviside(0), S(1)/2)),
  114. (Piecewise(
  115. (sign(x)/2 + S(1)/2, Ne(x, 0)), (Heaviside(0), True)), True)
  116. )
  117. assert Heaviside(y).rewrite(sign) == Heaviside(y)
  118. assert Heaviside(x, S.Half).rewrite(sign) == (sign(x)+1)/2
  119. assert Heaviside(x, y).rewrite(sign) == \
  120. Piecewise(
  121. (sign(x)/2 + S(1)/2, Eq(y, S(1)/2)),
  122. (Piecewise(
  123. (sign(x)/2 + S(1)/2, Ne(x, 0)), (y, True)), True)
  124. )
  125. assert DiracDelta(y).rewrite(Piecewise) == Piecewise((DiracDelta(0), Eq(y, 0)), (0, True))
  126. assert DiracDelta(y, 1).rewrite(Piecewise) == DiracDelta(y, 1)
  127. assert DiracDelta(x - 5).rewrite(Piecewise) == (
  128. Piecewise((DiracDelta(0), Eq(x - 5, 0)), (0, True)))
  129. assert (x*DiracDelta(x - 10)).rewrite(SingularityFunction) == x*SingularityFunction(x, 10, -1)
  130. assert 5*x*y*DiracDelta(y, 1).rewrite(SingularityFunction) == 5*x*y*SingularityFunction(y, 0, -2)
  131. assert DiracDelta(0).rewrite(SingularityFunction) == SingularityFunction(0, 0, -1)
  132. assert DiracDelta(0, 1).rewrite(SingularityFunction) == SingularityFunction(0, 0, -2)
  133. assert Heaviside(x).rewrite(SingularityFunction) == SingularityFunction(x, 0, 0)
  134. assert 5*x*y*Heaviside(y + 1).rewrite(SingularityFunction) == 5*x*y*SingularityFunction(y, -1, 0)
  135. assert ((x - 3)**3*Heaviside(x - 3)).rewrite(SingularityFunction) == (x - 3)**3*SingularityFunction(x, 3, 0)
  136. assert Heaviside(0).rewrite(SingularityFunction) == S.Half