test_laplace.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. from sympy.integrals.laplace import (
  2. laplace_transform, inverse_laplace_transform,
  3. LaplaceTransform, InverseLaplaceTransform)
  4. from sympy.core.function import Function, expand_mul
  5. from sympy.core import EulerGamma, Subs, Derivative, diff
  6. from sympy.core.exprtools import factor_terms
  7. from sympy.core.numbers import I, oo, pi
  8. from sympy.core.singleton import S
  9. from sympy.core.symbol import Symbol, symbols
  10. from sympy.simplify.simplify import simplify
  11. from sympy.functions.elementary.complexes import Abs, re
  12. from sympy.functions.elementary.exponential import exp, log, exp_polar
  13. from sympy.functions.elementary.hyperbolic import cosh, sinh, coth, asinh
  14. from sympy.functions.elementary.miscellaneous import sqrt
  15. from sympy.functions.elementary.trigonometric import atan, cos, sin
  16. from sympy.functions.special.gamma_functions import lowergamma, gamma
  17. from sympy.functions.special.delta_functions import DiracDelta, Heaviside
  18. from sympy.functions.special.zeta_functions import lerchphi
  19. from sympy.functions.special.error_functions import (
  20. fresnelc, fresnels, erf, erfc, Ei, Ci, expint, E1)
  21. from sympy.functions.special.bessel import besseli, besselj, besselk, bessely
  22. from sympy.testing.pytest import slow, warns_deprecated_sympy
  23. from sympy.matrices import Matrix, eye
  24. from sympy.abc import s
  25. @slow
  26. def test_laplace_transform():
  27. LT = laplace_transform
  28. a, b, c, = symbols('a, b, c', positive=True)
  29. t, w, x = symbols('t, w, x')
  30. f = Function('f')
  31. g = Function('g')
  32. # Test whether `noconds=True` in `doit`:
  33. assert (2*LaplaceTransform(exp(t), t, s) - 1).doit() == -1 + 2/(s - 1)
  34. assert (LT(a*t+t**2+t**(S(5)/2), t, s) ==
  35. (a/s**2 + 2/s**3 + 15*sqrt(pi)/(8*s**(S(7)/2)), 0, True))
  36. assert LT(b/(t+a), t, s) == (-b*exp(-a*s)*Ei(-a*s), 0, True)
  37. assert (LT(1/sqrt(t+a), t, s) ==
  38. (sqrt(pi)*sqrt(1/s)*exp(a*s)*erfc(sqrt(a)*sqrt(s)), 0, True))
  39. assert (LT(sqrt(t)/(t+a), t, s) ==
  40. (-pi*sqrt(a)*exp(a*s)*erfc(sqrt(a)*sqrt(s)) + sqrt(pi)*sqrt(1/s),
  41. 0, True))
  42. assert (LT((t+a)**(-S(3)/2), t, s) ==
  43. (-2*sqrt(pi)*sqrt(s)*exp(a*s)*erfc(sqrt(a)*sqrt(s)) + 2/sqrt(a),
  44. 0, True))
  45. assert (LT(t**(S(1)/2)*(t+a)**(-1), t, s) ==
  46. (-pi*sqrt(a)*exp(a*s)*erfc(sqrt(a)*sqrt(s)) + sqrt(pi)*sqrt(1/s),
  47. 0, True))
  48. assert (LT(1/(a*sqrt(t) + t**(3/2)), t, s) ==
  49. (pi*sqrt(a)*exp(a*s)*erfc(sqrt(a)*sqrt(s)), 0, True))
  50. assert (LT((t+a)**b, t, s) ==
  51. (s**(-b - 1)*exp(-a*s)*lowergamma(b + 1, a*s), 0, True))
  52. assert LT(t**5/(t+a), t, s) == (120*a**5*lowergamma(-5, a*s), 0, True)
  53. assert LT(exp(t), t, s) == (1/(s - 1), 1, True)
  54. assert LT(exp(2*t), t, s) == (1/(s - 2), 2, True)
  55. assert LT(exp(a*t), t, s) == (1/(s - a), a, True)
  56. assert LT(exp(a*(t-b)), t, s) == (exp(-a*b)/(-a + s), a, True)
  57. assert LT(t*exp(-a*(t)), t, s) == ((a + s)**(-2), -a, True)
  58. assert LT(t*exp(-a*(t-b)), t, s) == (exp(a*b)/(a + s)**2, -a, True)
  59. assert LT(b*t*exp(-a*t), t, s) == (b/(a + s)**2, -a, True)
  60. assert (LT(t**(S(7)/4)*exp(-8*t)/gamma(S(11)/4), t, s) ==
  61. ((s + 8)**(-S(11)/4), -8, True))
  62. assert (LT(t**(S(3)/2)*exp(-8*t), t, s) ==
  63. (3*sqrt(pi)/(4*(s + 8)**(S(5)/2)), -8, True))
  64. assert LT(t**a*exp(-a*t), t, s) == ((a+s)**(-a-1)*gamma(a+1), -a, True)
  65. assert (LT(b*exp(-a*t**2), t, s) ==
  66. (sqrt(pi)*b*exp(s**2/(4*a))*erfc(s/(2*sqrt(a)))/(2*sqrt(a)),
  67. 0, True))
  68. assert (LT(exp(-2*t**2), t, s) ==
  69. (sqrt(2)*sqrt(pi)*exp(s**2/8)*erfc(sqrt(2)*s/4)/4, 0, True))
  70. assert (LT(b*exp(2*t**2), t, s) ==
  71. (b*LaplaceTransform(exp(2*t**2), t, s), -oo, True))
  72. assert (LT(t*exp(-a*t**2), t, s) ==
  73. (1/(2*a) - s*erfc(s/(2*sqrt(a)))/(4*sqrt(pi)*a**(S(3)/2)),
  74. 0, True))
  75. assert (LT(exp(-a/t), t, s) ==
  76. (2*sqrt(a)*sqrt(1/s)*besselk(1, 2*sqrt(a)*sqrt(s)), 0, True))
  77. assert LT(sqrt(t)*exp(-a/t), t, s, simplify=True) == (
  78. sqrt(pi)*(sqrt(a)*sqrt(s) + 1/S(2))*sqrt(s**(-3)) *
  79. exp(-2*sqrt(a)*sqrt(s)), 0, True)
  80. assert (LT(exp(-a/t)/sqrt(t), t, s) ==
  81. (sqrt(pi)*sqrt(1/s)*exp(-2*sqrt(a)*sqrt(s)), 0, True))
  82. assert (LT(exp(-a/t)/(t*sqrt(t)), t, s) ==
  83. (sqrt(pi)*sqrt(1/a)*exp(-2*sqrt(a)*sqrt(s)), 0, True))
  84. assert (
  85. LT(exp(-2*sqrt(a*t)), t, s) ==
  86. (1/s - sqrt(pi)*sqrt(a) * exp(a/s)*erfc(sqrt(a)*sqrt(1/s)) /
  87. s**(S(3)/2), 0, True))
  88. assert LT(exp(-2*sqrt(a*t))/sqrt(t), t, s) == (
  89. exp(a/s)*erfc(sqrt(a) * sqrt(1/s))*(sqrt(pi)*sqrt(1/s)), 0, True)
  90. assert (LT(t**4*exp(-2/t), t, s) ==
  91. (8*sqrt(2)*(1/s)**(S(5)/2)*besselk(5, 2*sqrt(2)*sqrt(s)),
  92. 0, True))
  93. assert LT(sinh(a*t), t, s) == (a/(-a**2 + s**2), a, True)
  94. assert (LT(b*sinh(a*t)**2, t, s) ==
  95. (2*a**2*b/(-4*a**2*s + s**3), 2*a, True))
  96. assert (LT(b*sinh(a*t)**2, t, s, simplify=True) ==
  97. (2*a**2*b/(s*(-4*a**2 + s**2)), 2*a, True))
  98. # The following line confirms that issue #21202 is solved
  99. assert LT(cosh(2*t), t, s) == (s/(-4 + s**2), 2, True)
  100. assert LT(cosh(a*t), t, s) == (s/(-a**2 + s**2), a, True)
  101. assert (LT(cosh(a*t)**2, t, s, simplify=True) ==
  102. ((2*a**2 - s**2)/(s*(4*a**2 - s**2)), 2*a, True))
  103. assert (LT(sinh(x+3), x, s, simplify=True) ==
  104. ((s*sinh(3) + cosh(3))/(s**2 - 1), 1, True))
  105. L, _, _ = LT(42*sin(w*t+x)**2, t, s)
  106. assert (
  107. L -
  108. 21*(s**2 + s*(-s*cos(2*x) + 2*w*sin(2*x)) +
  109. 4*w**2)/(s*(s**2 + 4*w**2))).simplify() == 0
  110. # The following line replaces the old test test_issue_7173()
  111. assert LT(sinh(a*t)*cosh(a*t), t, s, simplify=True) == (a/(-4*a**2 + s**2),
  112. 2*a, True)
  113. assert LT(sinh(a*t)/t, t, s) == (log((a + s)/(-a + s))/2, a, True)
  114. assert (LT(t**(-S(3)/2)*sinh(a*t), t, s) ==
  115. (-sqrt(pi)*(sqrt(-a + s) - sqrt(a + s)), a, True))
  116. assert (LT(sinh(2*sqrt(a*t)), t, s) ==
  117. (sqrt(pi)*sqrt(a)*exp(a/s)/s**(S(3)/2), 0, True))
  118. assert (LT(sqrt(t)*sinh(2*sqrt(a*t)), t, s, simplify=True) ==
  119. ((-sqrt(a)*s**(S(5)/2) + sqrt(pi)*s**2*(2*a + s)*exp(a/s) *
  120. erf(sqrt(a)*sqrt(1/s))/2)/s**(S(9)/2), 0, True))
  121. assert (LT(sinh(2*sqrt(a*t))/sqrt(t), t, s) ==
  122. (sqrt(pi)*exp(a/s)*erf(sqrt(a)*sqrt(1/s))/sqrt(s), 0, True))
  123. assert (LT(sinh(sqrt(a*t))**2/sqrt(t), t, s) ==
  124. (sqrt(pi)*(exp(a/s) - 1)/(2*sqrt(s)), 0, True))
  125. assert (LT(t**(S(3)/7)*cosh(a*t), t, s) ==
  126. (((a + s)**(-S(10)/7) + (-a+s)**(-S(10)/7))*gamma(S(10)/7)/2,
  127. a, True))
  128. assert (LT(cosh(2*sqrt(a*t)), t, s) ==
  129. (sqrt(pi)*sqrt(a)*exp(a/s)*erf(sqrt(a)*sqrt(1/s))/s**(S(3)/2) +
  130. 1/s, 0, True))
  131. assert (LT(sqrt(t)*cosh(2*sqrt(a*t)), t, s) ==
  132. (sqrt(pi)*(a + s/2)*exp(a/s)/s**(S(5)/2), 0, True))
  133. assert (LT(cosh(2*sqrt(a*t))/sqrt(t), t, s) ==
  134. (sqrt(pi)*exp(a/s)/sqrt(s), 0, True))
  135. assert (LT(cosh(sqrt(a*t))**2/sqrt(t), t, s) ==
  136. (sqrt(pi)*(exp(a/s) + 1)/(2*sqrt(s)), 0, True))
  137. assert LT(log(t), t, s, simplify=True) == (
  138. (-log(s) - EulerGamma)/s, 0, True)
  139. assert (LT(-log(t/a), t, s, simplify=True) ==
  140. ((log(a) + log(s) + EulerGamma)/s, 0, True))
  141. assert LT(log(1+a*t), t, s) == (-exp(s/a)*Ei(-s/a)/s, 0, True)
  142. assert (LT(log(t+a), t, s, simplify=True) ==
  143. ((s*log(a) - exp(s/a)*Ei(-s/a))/s**2, 0, True))
  144. assert (LT(log(t)/sqrt(t), t, s, simplify=True) ==
  145. (sqrt(pi)*(-log(s) - log(4) - EulerGamma)/sqrt(s), 0, True))
  146. assert (LT(t**(S(5)/2)*log(t), t, s, simplify=True) ==
  147. (sqrt(pi)*(-15*log(s) - log(1073741824) - 15*EulerGamma + 46) /
  148. (8*s**(S(7)/2)), 0, True))
  149. assert (LT(t**3*log(t), t, s, noconds=True, simplify=True) -
  150. 6*(-log(s) - S.EulerGamma + S(11)/6)/s**4).simplify() == S.Zero
  151. assert (LT(log(t)**2, t, s, simplify=True) ==
  152. (((log(s) + EulerGamma)**2 + pi**2/6)/s, 0, True))
  153. assert (LT(exp(-a*t)*log(t), t, s, simplify=True) ==
  154. ((-log(a + s) - EulerGamma)/(a + s), -a, True))
  155. assert LT(sin(a*t), t, s) == (a/(a**2 + s**2), 0, True)
  156. assert (LT(Abs(sin(a*t)), t, s) ==
  157. (a*coth(pi*s/(2*a))/(a**2 + s**2), 0, True))
  158. assert LT(sin(a*t)/t, t, s) == (atan(a/s), 0, True)
  159. assert LT(sin(a*t)**2/t, t, s) == (log(4*a**2/s**2 + 1)/4, 0, True)
  160. assert (LT(sin(a*t)**2/t**2, t, s) ==
  161. (a*atan(2*a/s) - s*log(4*a**2/s**2 + 1)/4, 0, True))
  162. assert (LT(sin(2*sqrt(a*t)), t, s) ==
  163. (sqrt(pi)*sqrt(a)*exp(-a/s)/s**(S(3)/2), 0, True))
  164. assert LT(sin(2*sqrt(a*t))/t, t, s) == (pi*erf(sqrt(a)*sqrt(1/s)), 0, True)
  165. assert LT(cos(a*t), t, s) == (s/(a**2 + s**2), 0, True)
  166. assert (LT(cos(a*t)**2, t, s) ==
  167. ((2*a**2 + s**2)/(s*(4*a**2 + s**2)), 0, True))
  168. assert (LT(sqrt(t)*cos(2*sqrt(a*t)), t, s, simplify=True) ==
  169. (sqrt(pi)*(-a + s/2)*exp(-a/s)/s**(S(5)/2), 0, True))
  170. assert (LT(cos(2*sqrt(a*t))/sqrt(t), t, s) ==
  171. (sqrt(pi)*sqrt(1/s)*exp(-a/s), 0, True))
  172. assert (LT(sin(a*t)*sin(b*t), t, s) ==
  173. (2*a*b*s/((s**2 + (a - b)**2)*(s**2 + (a + b)**2)), 0, True))
  174. assert (LT(cos(a*t)*sin(b*t), t, s) ==
  175. (b*(-a**2 + b**2 + s**2)/((s**2 + (a - b)**2)*(s**2 + (a + b)**2)),
  176. 0, True))
  177. assert (LT(cos(a*t)*cos(b*t), t, s) ==
  178. (s*(a**2 + b**2 + s**2)/((s**2 + (a - b)**2)*(s**2 + (a + b)**2)),
  179. 0, True))
  180. assert (LT(-a*t*cos(a*t) + sin(a*t), t, s, simplify=True) ==
  181. (2*a**3/(a**4 + 2*a**2*s**2 + s**4), 0, True))
  182. assert LT(c*exp(-b*t)*sin(a*t), t, s) == (a *
  183. c/(a**2 + (b + s)**2), -b, True)
  184. assert LT(c*exp(-b*t)*cos(a*t), t, s) == (c*(b + s)/(a**2 + (b + s)**2),
  185. -b, True)
  186. L, plane, cond = LT(cos(x + 3), x, s, simplify=True)
  187. assert plane == 0
  188. assert L - (s*cos(3) - sin(3))/(s**2 + 1) == 0
  189. # Error functions (laplace7.pdf)
  190. assert LT(erf(a*t), t, s) == (exp(s**2/(4*a**2))*erfc(s/(2*a))/s, 0, True)
  191. assert LT(erf(sqrt(a*t)), t, s) == (sqrt(a)/(s*sqrt(a + s)), 0, True)
  192. assert (LT(exp(a*t)*erf(sqrt(a*t)), t, s, simplify=True) ==
  193. (-sqrt(a)/(sqrt(s)*(a - s)), a, True))
  194. assert (LT(erf(sqrt(a/t)/2), t, s, simplify=True) ==
  195. (1/s - exp(-sqrt(a)*sqrt(s))/s, 0, True))
  196. assert (LT(erfc(sqrt(a*t)), t, s, simplify=True) ==
  197. (-sqrt(a)/(s*sqrt(a + s)) + 1/s, -a, True))
  198. assert (LT(exp(a*t)*erfc(sqrt(a*t)), t, s) ==
  199. (1/(sqrt(a)*sqrt(s) + s), 0, True))
  200. assert LT(erfc(sqrt(a/t)/2), t, s) == (exp(-sqrt(a)*sqrt(s))/s, 0, True)
  201. # Bessel functions (laplace8.pdf)
  202. assert LT(besselj(0, a*t), t, s) == (1/sqrt(a**2 + s**2), 0, True)
  203. assert (LT(besselj(1, a*t), t, s, simplify=True) ==
  204. (a/(a**2 + s**2 + s*sqrt(a**2 + s**2)), 0, True))
  205. assert (LT(besselj(2, a*t), t, s, simplify=True) ==
  206. (a**2/(sqrt(a**2 + s**2)*(s + sqrt(a**2 + s**2))**2), 0, True))
  207. assert (LT(t*besselj(0, a*t), t, s) ==
  208. (s/(a**2 + s**2)**(S(3)/2), 0, True))
  209. assert (LT(t*besselj(1, a*t), t, s) ==
  210. (a/(a**2 + s**2)**(S(3)/2), 0, True))
  211. assert (LT(t**2*besselj(2, a*t), t, s) ==
  212. (3*a**2/(a**2 + s**2)**(S(5)/2), 0, True))
  213. assert LT(besselj(0, 2*sqrt(a*t)), t, s) == (exp(-a/s)/s, 0, True)
  214. assert (LT(t**(S(3)/2)*besselj(3, 2*sqrt(a*t)), t, s) ==
  215. (a**(S(3)/2)*exp(-a/s)/s**4, 0, True))
  216. assert (LT(besselj(0, a*sqrt(t**2+b*t)), t, s, simplify=True) ==
  217. (exp(b*(s - sqrt(a**2 + s**2)))/sqrt(a**2 + s**2), 0, True))
  218. assert LT(besseli(0, a*t), t, s) == (1/sqrt(-a**2 + s**2), a, True)
  219. assert (LT(besseli(1, a*t), t, s, simplify=True) ==
  220. (a/(-a**2 + s**2 + s*sqrt(-a**2 + s**2)), a, True))
  221. assert (LT(besseli(2, a*t), t, s, simplify=True) ==
  222. (a**2/(sqrt(-a**2 + s**2)*(s + sqrt(-a**2 + s**2))**2), a, True))
  223. assert LT(t*besseli(0, a*t), t, s) == (s/(-a**2 + s**2)**(S(3)/2), a, True)
  224. assert LT(t*besseli(1, a*t), t, s) == (a/(-a**2 + s**2)**(S(3)/2), a, True)
  225. assert (LT(t**2*besseli(2, a*t), t, s) ==
  226. (3*a**2/(-a**2 + s**2)**(S(5)/2), a, True))
  227. assert (LT(t**(S(3)/2)*besseli(3, 2*sqrt(a*t)), t, s) ==
  228. (a**(S(3)/2)*exp(a/s)/s**4, 0, True))
  229. assert (LT(bessely(0, a*t), t, s) ==
  230. (-2*asinh(s/a)/(pi*sqrt(a**2 + s**2)), 0, True))
  231. assert (LT(besselk(0, a*t), t, s) ==
  232. (log((s + sqrt(-a**2 + s**2))/a)/sqrt(-a**2 + s**2), -a, True))
  233. assert (LT(sin(a*t)**4, t, s, simplify=True) ==
  234. (24*a**4/(s*(64*a**4 + 20*a**2*s**2 + s**4)), 0, True))
  235. # Test general rules and unevaluated forms
  236. # These all also test whether issue #7219 is solved.
  237. assert LT(Heaviside(t-1)*cos(t-1), t, s) == (s*exp(-s)/(s**2 + 1), 0, True)
  238. assert LT(a*f(t), t, w) == (a*LaplaceTransform(f(t), t, w), -oo, True)
  239. assert (LT(a*Heaviside(t+1)*f(t+1), t, s) ==
  240. (a*LaplaceTransform(f(t + 1), t, s), -oo, True))
  241. assert (LT(a*Heaviside(t-1)*f(t-1), t, s) ==
  242. (a*LaplaceTransform(f(t), t, s)*exp(-s), -oo, True))
  243. assert (LT(b*f(t/a), t, s) ==
  244. (a*b*LaplaceTransform(f(t), t, a*s), -oo, True))
  245. assert LT(exp(-f(x)*t), t, s) == (1/(s + f(x)), -re(f(x)), True)
  246. assert (LT(exp(-a*t)*f(t), t, s) ==
  247. (LaplaceTransform(f(t), t, a + s), -oo, True))
  248. assert (LT(exp(-a*t)*erfc(sqrt(b/t)/2), t, s) ==
  249. (exp(-sqrt(b)*sqrt(a + s))/(a + s), -a, True))
  250. assert (LT(sinh(a*t)*f(t), t, s) ==
  251. (LaplaceTransform(f(t), t, -a + s)/2 -
  252. LaplaceTransform(f(t), t, a + s)/2, -oo, True))
  253. assert (LT(sinh(a*t)*t, t, s, simplify=True) ==
  254. (2*a*s/(a**4 - 2*a**2*s**2 + s**4), a, True))
  255. assert (LT(cosh(a*t)*f(t), t, s) ==
  256. (LaplaceTransform(f(t), t, -a + s)/2 +
  257. LaplaceTransform(f(t), t, a + s)/2, -oo, True))
  258. assert (LT(cosh(a*t)*t, t, s, simplify=True) ==
  259. (1/(2*(a + s)**2) + 1/(2*(a - s)**2), a, True))
  260. assert (LT(sin(a*t)*f(t), t, s, simplify=True) ==
  261. (I*(-LaplaceTransform(f(t), t, -I*a + s) +
  262. LaplaceTransform(f(t), t, I*a + s))/2, -oo, True))
  263. assert (LT(sin(f(t)), t, s) ==
  264. (LaplaceTransform(sin(f(t)), t, s), -oo, True))
  265. assert (LT(sin(a*t)*t, t, s, simplify=True) ==
  266. (2*a*s/(a**4 + 2*a**2*s**2 + s**4), 0, True))
  267. assert (LT(cos(a*t)*f(t), t, s) ==
  268. (LaplaceTransform(f(t), t, -I*a + s)/2 +
  269. LaplaceTransform(f(t), t, I*a + s)/2, -oo, True))
  270. assert (LT(cos(a*t)*t, t, s, simplify=True) ==
  271. ((-a**2 + s**2)/(a**4 + 2*a**2*s**2 + s**4), 0, True))
  272. L, plane, _ = LT(sin(a*t+b)**2*f(t), t, s)
  273. assert plane == -oo
  274. assert (
  275. -L + (
  276. LaplaceTransform(f(t), t, s)/2 -
  277. LaplaceTransform(f(t), t, -2*I*a + s)*exp(2*I*b)/4 -
  278. LaplaceTransform(f(t), t, 2*I*a + s)*exp(-2*I*b)/4)) == 0
  279. L, plane, _ = LT(sin(a*t)**3*cosh(b*t), t, s)
  280. assert plane == b
  281. assert (
  282. -L - 3*a/(8*(9*a**2 + b**2 + 2*b*s + s**2)) -
  283. 3*a/(8*(9*a**2 + b**2 - 2*b*s + s**2)) +
  284. 3*a/(8*(a**2 + b**2 + 2*b*s + s**2)) +
  285. 3*a/(8*(a**2 + b**2 - 2*b*s + s**2))).simplify() == 0
  286. assert (LT(t**2*exp(-t**2), t, s) ==
  287. (sqrt(pi)*s**2*exp(s**2/4)*erfc(s/2)/8 - s/4 +
  288. sqrt(pi)*exp(s**2/4)*erfc(s/2)/4, 0, True))
  289. assert (LT((a*t**2 + b*t + c)*f(t), t, s) ==
  290. (a*Derivative(LaplaceTransform(f(t), t, s), (s, 2)) -
  291. b*Derivative(LaplaceTransform(f(t), t, s), s) +
  292. c*LaplaceTransform(f(t), t, s), -oo, True))
  293. # The following two lines test whether issues #5813 and #7176 are solved.
  294. assert (LT(diff(f(t), (t, 1)), t, s, noconds=True) ==
  295. s*LaplaceTransform(f(t), t, s) - f(0))
  296. assert (LT(diff(f(t), (t, 3)), t, s, noconds=True) ==
  297. s**3*LaplaceTransform(f(t), t, s) - s**2*f(0) -
  298. s*Subs(Derivative(f(t), t), t, 0) -
  299. Subs(Derivative(f(t), (t, 2)), t, 0))
  300. # Issue #7219
  301. assert (LT(diff(f(x, t, w), t, 2), t, s) ==
  302. (s**2*LaplaceTransform(f(x, t, w), t, s) - s*f(x, 0, w) -
  303. Subs(Derivative(f(x, t, w), t), t, 0), -oo, True))
  304. # Issue #23307
  305. assert (LT(10*diff(f(t), (t, 1)), t, s, noconds=True) ==
  306. 10*s*LaplaceTransform(f(t), t, s) - 10*f(0))
  307. assert (LT(a*f(b*t)+g(c*t), t, s, noconds=True) ==
  308. a*LaplaceTransform(f(t), t, s/b)/b +
  309. LaplaceTransform(g(t), t, s/c)/c)
  310. assert inverse_laplace_transform(
  311. f(w), w, t, plane=0) == InverseLaplaceTransform(f(w), w, t, 0)
  312. assert (LT(f(t)*g(t), t, s, noconds=True) ==
  313. LaplaceTransform(f(t)*g(t), t, s))
  314. # Issue #24294
  315. assert (LT(b*f(a*t), t, s, noconds=True) ==
  316. b*LaplaceTransform(f(t), t, s/a)/a)
  317. assert LT(3*exp(t)*Heaviside(t), t, s) == (3/(s - 1), 1, True)
  318. assert (LT(2*sin(t)*Heaviside(t), t, s, simplify=True) ==
  319. (2/(s**2 + 1), 0, True))
  320. # additional basic tests from wikipedia
  321. assert (LT((t - a)**b*exp(-c*(t - a))*Heaviside(t - a), t, s) ==
  322. ((c + s)**(-b - 1)*exp(-a*s)*gamma(b + 1), -c, True))
  323. assert (
  324. LT((exp(2*t)-1)*exp(-b-t)*Heaviside(t)/2, t, s, noconds=True,
  325. simplify=True) ==
  326. exp(-b)/(s**2 - 1))
  327. # DiracDelta function: standard cases
  328. assert LT(DiracDelta(t), t, s) == (1, -oo, True)
  329. assert LT(DiracDelta(a*t), t, s) == (1/a, -oo, True)
  330. assert LT(DiracDelta(t/42), t, s) == (42, -oo, True)
  331. assert LT(DiracDelta(t+42), t, s) == (0, -oo, True)
  332. assert (LT(DiracDelta(t)+DiracDelta(t-42), t, s) ==
  333. (1 + exp(-42*s), -oo, True))
  334. assert (LT(DiracDelta(t)-a*exp(-a*t), t, s, simplify=True) ==
  335. (s/(a + s), -a, True))
  336. assert (
  337. LT(exp(-t)*(DiracDelta(t)+DiracDelta(t-42)), t, s, simplify=True) ==
  338. (exp(-42*s - 42) + 1, -oo, True))
  339. assert LT(f(t)*DiracDelta(t-42), t, s) == (f(42)*exp(-42*s), -oo, True)
  340. assert LT(f(t)*DiracDelta(b*t-a), t, s) == (f(a/b)*exp(-a*s/b)/b,
  341. -oo, True)
  342. assert LT(f(t)*DiracDelta(b*t+a), t, s) == (0, -oo, True)
  343. # Collection of cases that cannot be fully evaluated and/or would catch
  344. # some common implementation errors
  345. assert (LT(DiracDelta(t**2), t, s, noconds=True) ==
  346. LaplaceTransform(DiracDelta(t**2), t, s))
  347. assert LT(DiracDelta(t**2 - 1), t, s) == (exp(-s)/2, -oo, True)
  348. assert LT(DiracDelta(t*(1 - t)), t, s) == (1 - exp(-s), -oo, True)
  349. assert (LT((DiracDelta(t) + 1)*(DiracDelta(t - 1) + 1), t, s) ==
  350. (LaplaceTransform(DiracDelta(t)*DiracDelta(t - 1), t, s) +
  351. 1 + exp(-s) + 1/s, 0, True))
  352. assert LT(DiracDelta(2*t-2*exp(a)), t, s) == (exp(-s*exp(a))/2, -oo, True)
  353. assert LT(DiracDelta(-2*t+2*exp(a)), t, s) == (exp(-s*exp(a))/2, -oo, True)
  354. # Heaviside tests
  355. assert LT(Heaviside(t), t, s) == (1/s, 0, True)
  356. assert LT(Heaviside(t - a), t, s) == (exp(-a*s)/s, 0, True)
  357. assert LT(Heaviside(t-1), t, s) == (exp(-s)/s, 0, True)
  358. assert LT(Heaviside(2*t-4), t, s) == (exp(-2*s)/s, 0, True)
  359. assert LT(Heaviside(2*t+4), t, s) == (1/s, 0, True)
  360. assert (LT(Heaviside(-2*t+4), t, s, simplify=True) ==
  361. (1/s - exp(-2*s)/s, 0, True))
  362. assert (LT(g(t)*Heaviside(t - w), t, s) ==
  363. (LaplaceTransform(g(t)*Heaviside(t - w), t, s), -oo, True))
  364. # Fresnel functions
  365. assert (laplace_transform(fresnels(t), t, s, simplify=True) ==
  366. ((-sin(s**2/(2*pi))*fresnels(s/pi) +
  367. sqrt(2)*sin(s**2/(2*pi) + pi/4)/2 -
  368. cos(s**2/(2*pi))*fresnelc(s/pi))/s, 0, True))
  369. assert (laplace_transform(fresnelc(t), t, s, simplify=True) ==
  370. ((sin(s**2/(2*pi))*fresnelc(s/pi) -
  371. cos(s**2/(2*pi))*fresnels(s/pi) +
  372. sqrt(2)*cos(s**2/(2*pi) + pi/4)/2)/s, 0, True))
  373. # Matrix tests
  374. Mt = Matrix([[exp(t), t*exp(-t)], [t*exp(-t), exp(t)]])
  375. Ms = Matrix([[1/(s - 1), (s + 1)**(-2)],
  376. [(s + 1)**(-2), 1/(s - 1)]])
  377. # The default behaviour for Laplace transform of a Matrix returns a Matrix
  378. # of Tuples and is deprecated:
  379. with warns_deprecated_sympy():
  380. Ms_conds = Matrix(
  381. [[(1/(s - 1), 1, True), ((s + 1)**(-2), -1, True)],
  382. [((s + 1)**(-2), -1, True), (1/(s - 1), 1, True)]])
  383. with warns_deprecated_sympy():
  384. assert LT(Mt, t, s) == Ms_conds
  385. # The new behavior is to return a tuple of a Matrix and the convergence
  386. # conditions for the matrix as a whole:
  387. assert LT(Mt, t, s, legacy_matrix=False) == (Ms, 1, True)
  388. # With noconds=True the transformed matrix is returned without conditions
  389. # either way:
  390. assert LT(Mt, t, s, noconds=True) == Ms
  391. assert LT(Mt, t, s, legacy_matrix=False, noconds=True) == Ms
  392. @slow
  393. def test_inverse_laplace_transform():
  394. from sympy.functions.special.delta_functions import DiracDelta
  395. ILT = inverse_laplace_transform
  396. a, b, c, d = symbols('a b c d', positive=True)
  397. n, r = symbols('n, r', real=True)
  398. t, z = symbols('t z')
  399. f = Function('f')
  400. def simp_hyp(expr):
  401. return factor_terms(expand_mul(expr)).rewrite(sin)
  402. assert ILT(1, s, t) == DiracDelta(t)
  403. assert ILT(1/s, s, t) == Heaviside(t)
  404. assert ILT(a/(a + s), s, t) == a*exp(-a*t)*Heaviside(t)
  405. assert ILT(s/(a + s), s, t) == -a*exp(-a*t)*Heaviside(t) + DiracDelta(t)
  406. assert (ILT(s/(a + s)**3, s, t, simplify=True) ==
  407. t*(-a*t + 4)*exp(-a*t)*Heaviside(t)/2)
  408. assert (ILT(1/(s*(a + s)**3), s, t, simplify=True) ==
  409. (-a**2*t**2 - 4*a*t + 4*exp(a*t) - 4) *
  410. exp(-a*t)*Heaviside(t)/(2*a**3))
  411. assert ILT(1/(s*(a + s)**n), s, t) == (
  412. Heaviside(t)*lowergamma(n, a*t)/(a**n*gamma(n)))
  413. assert ILT((s-a)**(-b), s, t) == t**(b - 1)*exp(a*t)*Heaviside(t)/gamma(b)
  414. assert ILT((a + s)**(-2), s, t) == t*exp(-a*t)*Heaviside(t)
  415. assert ILT((a + s)**(-5), s, t) == t**4*exp(-a*t)*Heaviside(t)/24
  416. assert ILT(a/(a**2 + s**2), s, t) == sin(a*t)*Heaviside(t)
  417. assert ILT(s/(s**2 + a**2), s, t) == cos(a*t)*Heaviside(t)
  418. assert ILT(b/(b**2 + (a + s)**2), s, t) == exp(-a*t)*sin(b*t)*Heaviside(t)
  419. assert (ILT(b*s/(b**2 + (a + s)**2), s, t) ==
  420. b*(-a*exp(-a*t)*sin(b*t)/b + exp(-a*t)*cos(b*t))*Heaviside(t))
  421. assert ILT(exp(-a*s)/s, s, t) == Heaviside(-a + t)
  422. assert ILT(exp(-a*s)/(b + s), s, t) == exp(b*(a - t))*Heaviside(-a + t)
  423. assert (ILT((b + s)/(a**2 + (b + s)**2), s, t) ==
  424. exp(-b*t)*cos(a*t)*Heaviside(t))
  425. assert (ILT(exp(-a*s)/s**b, s, t) ==
  426. (-a + t)**(b - 1)*Heaviside(-a + t)/gamma(b))
  427. assert (ILT(exp(-a*s)/sqrt(s**2 + 1), s, t) ==
  428. Heaviside(-a + t)*besselj(0, a - t))
  429. assert ILT(1/(s*sqrt(s + 1)), s, t) == Heaviside(t)*erf(sqrt(t))
  430. assert (ILT(1/(s**2*(s**2 + 1)), s, t) ==
  431. t*Heaviside(t) - sin(t)*Heaviside(t))
  432. assert ILT(s**2/(s**2 + 1), s, t) == -sin(t)*Heaviside(t) + DiracDelta(t)
  433. assert ILT(1 - 1/(s**2 + 1), s, t) == -sin(t)*Heaviside(t) + DiracDelta(t)
  434. assert ILT(1/s**2, s, t) == t*Heaviside(t)
  435. assert ILT(1/s**5, s, t) == t**4*Heaviside(t)/24
  436. assert ILT(1/s**n, s, t) == t**(n - 1)*Heaviside(t)/gamma(n)
  437. # Issue #24424
  438. assert (ILT((s + 8)/((s + 2)*(s**2 + 2*s + 10)), s, t, simplify=True) ==
  439. ((8*sin(3*t) - 9*cos(3*t))*exp(t) + 9)*exp(-2*t)*Heaviside(t)/15)
  440. assert simp_hyp(ILT(a/(s**2 - a**2), s, t)) == sinh(a*t)*Heaviside(t)
  441. assert simp_hyp(ILT(s/(s**2 - a**2), s, t)) == cosh(a*t)*Heaviside(t)
  442. # TODO sinh/cosh shifted come out a mess. also delayed trig is a mess
  443. # TODO should this simplify further?
  444. assert (ILT(exp(-a*s)/s**b, s, t) ==
  445. (t - a)**(b - 1)*Heaviside(t - a)/gamma(b))
  446. assert (ILT(exp(-a*s)/sqrt(1 + s**2), s, t) ==
  447. Heaviside(t - a)*besselj(0, a - t)) # note: besselj(0, x) is even
  448. # XXX ILT turns these branch factor into trig functions ...
  449. assert (
  450. simplify(ILT(a**b*(s + sqrt(s**2 - a**2))**(-b)/sqrt(s**2 - a**2),
  451. s, t).rewrite(exp)) ==
  452. Heaviside(t)*besseli(b, a*t))
  453. assert (
  454. ILT(a**b*(s + sqrt(s**2 + a**2))**(-b)/sqrt(s**2 + a**2),
  455. s, t, simplify=True).rewrite(exp) ==
  456. Heaviside(t)*besselj(b, a*t))
  457. assert ILT(1/(s*sqrt(s + 1)), s, t) == Heaviside(t)*erf(sqrt(t))
  458. # TODO can we make erf(t) work?
  459. assert (ILT(1/(s**2*(s**2 + 1)), s, t, simplify=True) ==
  460. (t - sin(t))*Heaviside(t))
  461. assert (ILT((s * eye(2) - Matrix([[1, 0], [0, 2]])).inv(), s, t) ==
  462. Matrix([[exp(t)*Heaviside(t), 0], [0, exp(2*t)*Heaviside(t)]]))
  463. # New tests for rules
  464. assert (ILT(b/(s**2-a**2), s, t, simplify=True) ==
  465. b*sinh(a*t)*Heaviside(t)/a)
  466. assert (ILT(b/(s**2-a**2), s, t) ==
  467. b*(exp(a*t)*Heaviside(t)/(2*a) - exp(-a*t)*Heaviside(t)/(2*a)))
  468. assert (ILT(b*s/(s**2-a**2), s, t, simplify=True) ==
  469. b*cosh(a*t)*Heaviside(t))
  470. assert (ILT(b/(s*(s+a)), s, t) ==
  471. b*(Heaviside(t)/a - exp(-a*t)*Heaviside(t)/a))
  472. assert (ILT(b*s/(s+a)**2, s, t) ==
  473. b*(-a*t*exp(-a*t)*Heaviside(t) + exp(-a*t)*Heaviside(t)))
  474. assert (ILT(c/((s+a)*(s+b)), s, t, simplify=True) ==
  475. c*(exp(a*t) - exp(b*t))*exp(-t*(a + b))*Heaviside(t)/(a - b))
  476. assert (ILT(c*s/((s+a)*(s+b)), s, t, simplify=True) ==
  477. c*(a*exp(b*t) - b*exp(a*t))*exp(-t*(a + b))*Heaviside(t)/(a - b))
  478. assert (ILT(c*s/(d**2*(s+a)**2+b**2), s, t, simplify=True) ==
  479. c*(-a*d*sin(b*t/d) + b*cos(b*t/d))*exp(-a*t)*Heaviside(t)/(b*d**2))
  480. # Test time_diff rule
  481. assert (ILT(s**42*f(s), s, t) ==
  482. Derivative(InverseLaplaceTransform(f(s), s, t, None), (t, 42)))
  483. assert (ILT((b*s**2 + d)/(a**2 + s**2)**2, s, t, simplify=True) ==
  484. (a**3*b*t*cos(a*t) + 5*a**2*b*sin(a*t) - a*d*t*cos(a*t) +
  485. d*sin(a*t))*Heaviside(t)/(2*a**3))
  486. assert ILT(cos(s), s, t) == InverseLaplaceTransform(cos(s), s, t, None)
  487. # Rules for testing different DiracDelta cases
  488. assert ILT(2, s, t) == 2*DiracDelta(t)
  489. assert (ILT(2*exp(3*s) - 5*exp(-7*s), s, t) ==
  490. 2*InverseLaplaceTransform(exp(3*s), s, t, None) -
  491. 5*DiracDelta(t - 7))
  492. a = cos(sin(7)/2)
  493. assert ILT(a*exp(-3*s), s, t) == a*DiracDelta(t - 3)
  494. assert ILT(exp(2*s), s, t) == InverseLaplaceTransform(exp(2*s), s, t, None)
  495. r = Symbol('r', real=True)
  496. assert ILT(exp(r*s), s, t) == InverseLaplaceTransform(exp(r*s), s, t, None)
  497. # Rules for testing whether Heaviside(t) is treated properly in diff rule
  498. assert ILT(s**2/(a**2 + s**2), s, t) == (
  499. -a*sin(a*t)*Heaviside(t) + DiracDelta(t))
  500. assert ILT(s**2*(f(s) + 1/(a**2 + s**2)), s, t) == (
  501. -a*sin(a*t)*Heaviside(t) + DiracDelta(t) +
  502. Derivative(InverseLaplaceTransform(f(s), s, t, None), (t, 2)))
  503. # Rules from the previous test_inverse_laplace_transform_delta_cond():
  504. assert (ILT(exp(r*s), s, t, noconds=False) ==
  505. (InverseLaplaceTransform(exp(r*s), s, t, None), True))
  506. # inversion does not exist: verify it doesn't evaluate to DiracDelta
  507. for z in (Symbol('z', extended_real=False),
  508. Symbol('z', imaginary=True, zero=False)):
  509. f = ILT(exp(z*s), s, t, noconds=False)
  510. f = f[0] if isinstance(f, tuple) else f
  511. assert f.func != DiracDelta
  512. # old test for Issue 8514, is not important anymore since this function
  513. # is not solved by integration anymore
  514. assert (ILT(1/(a*s**2+b*s+c), s, t) ==
  515. 2*exp(-b*t/(2*a))*sin(t*sqrt(4*a*c - b**2)/(2*a)) *
  516. Heaviside(t)/sqrt(4*a*c - b**2))
  517. @slow
  518. def test_expint():
  519. x = Symbol('x')
  520. a = Symbol('a')
  521. u = Symbol('u', polar=True)
  522. # TODO LT of Si, Shi, Chi is a mess ...
  523. assert laplace_transform(Ci(x), x, s) == (-log(1 + s**2)/2/s, 0, True)
  524. assert (laplace_transform(expint(a, x), x, s, simplify=True) ==
  525. (lerchphi(s*exp_polar(I*pi), 1, a), 0, re(a) > S.Zero))
  526. assert (laplace_transform(expint(1, x), x, s, simplify=True) ==
  527. (log(s + 1)/s, 0, True))
  528. assert (laplace_transform(expint(2, x), x, s, simplify=True) ==
  529. ((s - log(s + 1))/s**2, 0, True))
  530. assert (inverse_laplace_transform(-log(1 + s**2)/2/s, s, u).expand() ==
  531. Heaviside(u)*Ci(u))
  532. assert (
  533. inverse_laplace_transform(log(s + 1)/s, s, x,
  534. simplify=True).rewrite(expint) ==
  535. Heaviside(x)*E1(x))
  536. assert (
  537. inverse_laplace_transform(
  538. (s - log(s + 1))/s**2, s, x,
  539. simplify=True).rewrite(expint).expand() ==
  540. (expint(2, x)*Heaviside(x)).rewrite(Ei).rewrite(expint).expand())