test_manual.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688
  1. from sympy.core.expr import Expr
  2. from sympy.core.mul import Mul
  3. from sympy.core.function import (Derivative, Function, diff, expand)
  4. from sympy.core.numbers import (I, Rational, pi)
  5. from sympy.core.relational import Ne
  6. from sympy.core.singleton import S
  7. from sympy.core.symbol import (Dummy, Symbol, symbols)
  8. from sympy.functions.elementary.exponential import (exp, log)
  9. from sympy.functions.elementary.hyperbolic import (asinh, csch, cosh, coth, sech, sinh, tanh)
  10. from sympy.functions.elementary.miscellaneous import sqrt
  11. from sympy.functions.elementary.piecewise import Piecewise
  12. from sympy.functions.elementary.trigonometric import (acos, acot, acsc, asec, asin, atan, cos, cot, csc, sec, sin, tan)
  13. from sympy.functions.special.delta_functions import Heaviside, DiracDelta
  14. from sympy.functions.special.elliptic_integrals import (elliptic_e, elliptic_f)
  15. from sympy.functions.special.error_functions import (Chi, Ci, Ei, Shi, Si, erf, erfi, fresnelc, fresnels, li)
  16. from sympy.functions.special.gamma_functions import uppergamma
  17. from sympy.functions.special.polynomials import (assoc_laguerre, chebyshevt, chebyshevu, gegenbauer, hermite, jacobi, laguerre, legendre)
  18. from sympy.functions.special.zeta_functions import polylog
  19. from sympy.integrals.integrals import (Integral, integrate)
  20. from sympy.logic.boolalg import And
  21. from sympy.integrals.manualintegrate import (manualintegrate, find_substitutions,
  22. _parts_rule, integral_steps, manual_subs)
  23. from sympy.testing.pytest import raises, slow
  24. x, y, z, u, n, a, b, c, d, e = symbols('x y z u n a b c d e')
  25. f = Function('f')
  26. def assert_is_integral_of(f: Expr, F: Expr):
  27. assert manualintegrate(f, x) == F
  28. assert F.diff(x).equals(f)
  29. def test_find_substitutions():
  30. assert find_substitutions((cot(x)**2 + 1)**2*csc(x)**2*cot(x)**2, x, u) == \
  31. [(cot(x), 1, -u**6 - 2*u**4 - u**2)]
  32. assert find_substitutions((sec(x)**2 + tan(x) * sec(x)) / (sec(x) + tan(x)),
  33. x, u) == [(sec(x) + tan(x), 1, 1/u)]
  34. assert (-x**2, Rational(-1, 2), exp(u)) in find_substitutions(x * exp(-x**2), x, u)
  35. assert not find_substitutions(Derivative(f(x), x)**2, x, u)
  36. def test_manualintegrate_polynomials():
  37. assert manualintegrate(y, x) == x*y
  38. assert manualintegrate(exp(2), x) == x * exp(2)
  39. assert manualintegrate(x**2, x) == x**3 / 3
  40. assert manualintegrate(3 * x**2 + 4 * x**3, x) == x**3 + x**4
  41. assert manualintegrate((x + 2)**3, x) == (x + 2)**4 / 4
  42. assert manualintegrate((3*x + 4)**2, x) == (3*x + 4)**3 / 9
  43. assert manualintegrate((u + 2)**3, u) == (u + 2)**4 / 4
  44. assert manualintegrate((3*u + 4)**2, u) == (3*u + 4)**3 / 9
  45. def test_manualintegrate_exponentials():
  46. assert manualintegrate(exp(2*x), x) == exp(2*x) / 2
  47. assert manualintegrate(2**x, x) == (2 ** x) / log(2)
  48. assert_is_integral_of(1/sqrt(1-exp(2*x)),
  49. log(sqrt(1 - exp(2*x)) - 1)/2 - log(sqrt(1 - exp(2*x)) + 1)/2)
  50. assert manualintegrate(1 / x, x) == log(x)
  51. assert manualintegrate(1 / (2*x + 3), x) == log(2*x + 3) / 2
  52. assert manualintegrate(log(x)**2 / x, x) == log(x)**3 / 3
  53. assert_is_integral_of(x**x*(log(x)+1), x**x)
  54. def test_manualintegrate_parts():
  55. assert manualintegrate(exp(x) * sin(x), x) == \
  56. (exp(x) * sin(x)) / 2 - (exp(x) * cos(x)) / 2
  57. assert manualintegrate(2*x*cos(x), x) == 2*x*sin(x) + 2*cos(x)
  58. assert manualintegrate(x * log(x), x) == x**2*log(x)/2 - x**2/4
  59. assert manualintegrate(log(x), x) == x * log(x) - x
  60. assert manualintegrate((3*x**2 + 5) * exp(x), x) == \
  61. 3*x**2*exp(x) - 6*x*exp(x) + 11*exp(x)
  62. assert manualintegrate(atan(x), x) == x*atan(x) - log(x**2 + 1)/2
  63. # Make sure _parts_rule doesn't pick u = constant but can pick dv =
  64. # constant if necessary, e.g. for integrate(atan(x))
  65. assert _parts_rule(cos(x), x) == None
  66. assert _parts_rule(exp(x), x) == None
  67. assert _parts_rule(x**2, x) == None
  68. result = _parts_rule(atan(x), x)
  69. assert result[0] == atan(x) and result[1] == 1
  70. def test_manualintegrate_trigonometry():
  71. assert manualintegrate(sin(x), x) == -cos(x)
  72. assert manualintegrate(tan(x), x) == -log(cos(x))
  73. assert manualintegrate(sec(x), x) == log(sec(x) + tan(x))
  74. assert manualintegrate(csc(x), x) == -log(csc(x) + cot(x))
  75. assert manualintegrate(sin(x) * cos(x), x) in [sin(x) ** 2 / 2, -cos(x)**2 / 2]
  76. assert manualintegrate(-sec(x) * tan(x), x) == -sec(x)
  77. assert manualintegrate(csc(x) * cot(x), x) == -csc(x)
  78. assert manualintegrate(sec(x)**2, x) == tan(x)
  79. assert manualintegrate(csc(x)**2, x) == -cot(x)
  80. assert manualintegrate(x * sec(x**2), x) == log(tan(x**2) + sec(x**2))/2
  81. assert manualintegrate(cos(x)*csc(sin(x)), x) == -log(cot(sin(x)) + csc(sin(x)))
  82. assert manualintegrate(cos(3*x)*sec(x), x) == -x + sin(2*x)
  83. assert manualintegrate(sin(3*x)*sec(x), x) == \
  84. -3*log(cos(x)) + 2*log(cos(x)**2) - 2*cos(x)**2
  85. assert_is_integral_of(sinh(2*x), cosh(2*x)/2)
  86. assert_is_integral_of(x*cosh(x**2), sinh(x**2)/2)
  87. assert_is_integral_of(tanh(x), log(cosh(x)))
  88. assert_is_integral_of(coth(x), log(sinh(x)))
  89. f, F = sech(x), 2*atan(tanh(x/2))
  90. assert manualintegrate(f, x) == F
  91. assert (F.diff(x) - f).rewrite(exp).simplify() == 0 # todo: equals returns None
  92. f, F = csch(x), log(tanh(x/2))
  93. assert manualintegrate(f, x) == F
  94. assert (F.diff(x) - f).rewrite(exp).simplify() == 0
  95. @slow
  96. def test_manualintegrate_trigpowers():
  97. assert manualintegrate(sin(x)**2 * cos(x), x) == sin(x)**3 / 3
  98. assert manualintegrate(sin(x)**2 * cos(x) **2, x) == \
  99. x / 8 - sin(4*x) / 32
  100. assert manualintegrate(sin(x) * cos(x)**3, x) == -cos(x)**4 / 4
  101. assert manualintegrate(sin(x)**3 * cos(x)**2, x) == \
  102. cos(x)**5 / 5 - cos(x)**3 / 3
  103. assert manualintegrate(tan(x)**3 * sec(x), x) == sec(x)**3/3 - sec(x)
  104. assert manualintegrate(tan(x) * sec(x) **2, x) == sec(x)**2/2
  105. assert manualintegrate(cot(x)**5 * csc(x), x) == \
  106. -csc(x)**5/5 + 2*csc(x)**3/3 - csc(x)
  107. assert manualintegrate(cot(x)**2 * csc(x)**6, x) == \
  108. -cot(x)**7/7 - 2*cot(x)**5/5 - cot(x)**3/3
  109. @slow
  110. def test_manualintegrate_inversetrig():
  111. # atan
  112. assert manualintegrate(exp(x) / (1 + exp(2*x)), x) == atan(exp(x))
  113. assert manualintegrate(1 / (4 + 9 * x**2), x) == atan(3 * x/2) / 6
  114. assert manualintegrate(1 / (16 + 16 * x**2), x) == atan(x) / 16
  115. assert manualintegrate(1 / (4 + x**2), x) == atan(x / 2) / 2
  116. assert manualintegrate(1 / (1 + 4 * x**2), x) == atan(2*x) / 2
  117. ra = Symbol('a', real=True)
  118. rb = Symbol('b', real=True)
  119. assert manualintegrate(1/(ra + rb*x**2), x) == \
  120. Piecewise((atan(x/sqrt(ra/rb))/(rb*sqrt(ra/rb)), ra/rb > 0),
  121. ((log(x - sqrt(-ra/rb)) - log(x + sqrt(-ra/rb)))/(2*sqrt(rb)*sqrt(-ra)), True))
  122. assert manualintegrate(1/(4 + rb*x**2), x) == \
  123. Piecewise((atan(x/(2*sqrt(1/rb)))/(2*rb*sqrt(1/rb)), 1/rb > 0),
  124. (-I*(log(x - 2*sqrt(-1/rb)) - log(x + 2*sqrt(-1/rb)))/(4*sqrt(rb)), True))
  125. assert manualintegrate(1/(ra + 4*x**2), x) == \
  126. Piecewise((atan(2*x/sqrt(ra))/(2*sqrt(ra)), ra > 0),
  127. ((log(x - sqrt(-ra)/2) - log(x + sqrt(-ra)/2))/(4*sqrt(-ra)), True))
  128. assert manualintegrate(1/(4 + 4*x**2), x) == atan(x) / 4
  129. assert manualintegrate(1/(a + b*x**2), x) == atan(x/sqrt(a/b))/(b*sqrt(a/b))
  130. # asin
  131. assert manualintegrate(1/sqrt(1-x**2), x) == asin(x)
  132. assert manualintegrate(1/sqrt(4-4*x**2), x) == asin(x)/2
  133. assert manualintegrate(3/sqrt(1-9*x**2), x) == asin(3*x)
  134. assert manualintegrate(1/sqrt(4-9*x**2), x) == asin(x*Rational(3, 2))/3
  135. # asinh
  136. assert manualintegrate(1/sqrt(x**2 + 1), x) == \
  137. asinh(x)
  138. assert manualintegrate(1/sqrt(x**2 + 4), x) == \
  139. asinh(x/2)
  140. assert manualintegrate(1/sqrt(4*x**2 + 4), x) == \
  141. asinh(x)/2
  142. assert manualintegrate(1/sqrt(4*x**2 + 1), x) == \
  143. asinh(2*x)/2
  144. assert manualintegrate(1/sqrt(ra*x**2 + 1), x) == \
  145. Piecewise((asin(x*sqrt(-ra))/sqrt(-ra), ra < 0), (asinh(sqrt(ra)*x)/sqrt(ra), ra > 0), (x, True))
  146. assert manualintegrate(1/sqrt(ra + x**2), x) == \
  147. Piecewise((asinh(x*sqrt(1/ra)), ra > 0), (log(2*x + 2*sqrt(ra + x**2)), True))
  148. # log
  149. assert manualintegrate(1/sqrt(x**2 - 1), x) == log(2*x + 2*sqrt(x**2 - 1))
  150. assert manualintegrate(1/sqrt(x**2 - 4), x) == log(2*x + 2*sqrt(x**2 - 4))
  151. assert manualintegrate(1/sqrt(4*x**2 - 4), x) == log(8*x + 4*sqrt(4*x**2 - 4))/2
  152. assert manualintegrate(1/sqrt(9*x**2 - 1), x) == log(18*x + 6*sqrt(9*x**2 - 1))/3
  153. assert manualintegrate(1/sqrt(ra*x**2 - 4), x) == \
  154. Piecewise((log(2*sqrt(ra)*sqrt(ra*x**2 - 4) + 2*ra*x)/sqrt(ra), Ne(ra, 0)), (-I*x/2, True))
  155. assert manualintegrate(1/sqrt(-ra + 4*x**2), x) == \
  156. Piecewise((asinh(2*x*sqrt(-1/ra))/2, ra < 0), (log(8*x + 4*sqrt(-ra + 4*x**2))/2, True))
  157. # From https://www.wikiwand.com/en/List_of_integrals_of_inverse_trigonometric_functions
  158. # asin
  159. assert manualintegrate(asin(x), x) == x*asin(x) + sqrt(1 - x**2)
  160. assert manualintegrate(asin(a*x), x) == Piecewise(((a*x*asin(a*x) + sqrt(-a**2*x**2 + 1))/a, Ne(a, 0)), (0, True))
  161. assert manualintegrate(x*asin(a*x), x) == \
  162. -a*Piecewise((-x*sqrt(-a**2*x**2 + 1)/(2*a**2) +
  163. log(-2*a**2*x + 2*sqrt(-a**2)*sqrt(-a**2*x**2 + 1))/(2*a**2*sqrt(-a**2)), Ne(a**2, 0)),
  164. (x**3/3, True))/2 + x**2*asin(a*x)/2
  165. # acos
  166. assert manualintegrate(acos(x), x) == x*acos(x) - sqrt(1 - x**2)
  167. assert manualintegrate(acos(a*x), x) == Piecewise(((a*x*acos(a*x) - sqrt(-a**2*x**2 + 1))/a, Ne(a, 0)), (pi*x/2, True))
  168. assert manualintegrate(x*acos(a*x), x) == \
  169. a*Piecewise((-x*sqrt(-a**2*x**2 + 1)/(2*a**2) +
  170. log(-2*a**2*x + 2*sqrt(-a**2)*sqrt(-a**2*x**2 + 1))/(2*a**2*sqrt(-a**2)), Ne(a**2, 0)),
  171. (x**3/3, True))/2 + x**2*acos(a*x)/2
  172. # atan
  173. assert manualintegrate(atan(x), x) == x*atan(x) - log(x**2 + 1)/2
  174. assert manualintegrate(atan(a*x), x) == Piecewise(((a*x*atan(a*x) - log(a**2*x**2 + 1)/2)/a, Ne(a, 0)), (0, True))
  175. assert manualintegrate(x*atan(a*x), x) == -a*(x/a**2 - atan(x/sqrt(a**(-2)))/(a**4*sqrt(a**(-2))))/2 + x**2*atan(a*x)/2
  176. # acsc
  177. assert manualintegrate(acsc(x), x) == x*acsc(x) + Integral(1/(x*sqrt(1 - 1/x**2)), x)
  178. assert manualintegrate(acsc(a*x), x) == x*acsc(a*x) + Integral(1/(x*sqrt(1 - 1/(a**2*x**2))), x)/a
  179. assert manualintegrate(x*acsc(a*x), x) == x**2*acsc(a*x)/2 + Integral(1/sqrt(1 - 1/(a**2*x**2)), x)/(2*a)
  180. # asec
  181. assert manualintegrate(asec(x), x) == x*asec(x) - Integral(1/(x*sqrt(1 - 1/x**2)), x)
  182. assert manualintegrate(asec(a*x), x) == x*asec(a*x) - Integral(1/(x*sqrt(1 - 1/(a**2*x**2))), x)/a
  183. assert manualintegrate(x*asec(a*x), x) == x**2*asec(a*x)/2 - Integral(1/sqrt(1 - 1/(a**2*x**2)), x)/(2*a)
  184. # acot
  185. assert manualintegrate(acot(x), x) == x*acot(x) + log(x**2 + 1)/2
  186. assert manualintegrate(acot(a*x), x) == Piecewise(((a*x*acot(a*x) + log(a**2*x**2 + 1)/2)/a, Ne(a, 0)), (pi*x/2, True))
  187. assert manualintegrate(x*acot(a*x), x) == a*(x/a**2 - atan(x/sqrt(a**(-2)))/(a**4*sqrt(a**(-2))))/2 + x**2*acot(a*x)/2
  188. # piecewise
  189. assert manualintegrate(1/sqrt(ra-rb*x**2), x) == \
  190. Piecewise((asin(x*sqrt(rb/ra))/sqrt(rb), And(-rb < 0, ra > 0)),
  191. (asinh(x*sqrt(-rb/ra))/sqrt(-rb), And(-rb > 0, ra > 0)),
  192. (log(-2*rb*x + 2*sqrt(-rb)*sqrt(ra - rb*x**2))/sqrt(-rb), Ne(rb, 0)),
  193. (x/sqrt(ra), True))
  194. assert manualintegrate(1/sqrt(ra + rb*x**2), x) == \
  195. Piecewise((asin(x*sqrt(-rb/ra))/sqrt(-rb), And(ra > 0, rb < 0)),
  196. (asinh(x*sqrt(rb/ra))/sqrt(rb), And(ra > 0, rb > 0)),
  197. (log(2*sqrt(rb)*sqrt(ra + rb*x**2) + 2*rb*x)/sqrt(rb), Ne(rb, 0)),
  198. (x/sqrt(ra), True))
  199. def test_manualintegrate_trig_substitution():
  200. assert manualintegrate(sqrt(16*x**2 - 9)/x, x) == \
  201. Piecewise((sqrt(16*x**2 - 9) - 3*acos(3/(4*x)),
  202. And(x < Rational(3, 4), x > Rational(-3, 4))))
  203. assert manualintegrate(1/(x**4 * sqrt(25-x**2)), x) == \
  204. Piecewise((-sqrt(-x**2/25 + 1)/(125*x) -
  205. (-x**2/25 + 1)**(3*S.Half)/(15*x**3), And(x < 5, x > -5)))
  206. assert manualintegrate(x**7/(49*x**2 + 1)**(3 * S.Half), x) == \
  207. ((49*x**2 + 1)**(5*S.Half)/28824005 -
  208. (49*x**2 + 1)**(3*S.Half)/5764801 +
  209. 3*sqrt(49*x**2 + 1)/5764801 + 1/(5764801*sqrt(49*x**2 + 1)))
  210. def test_manualintegrate_trivial_substitution():
  211. assert manualintegrate((exp(x) - exp(-x))/x, x) == -Ei(-x) + Ei(x)
  212. f = Function('f')
  213. assert manualintegrate((f(x) - f(-x))/x, x) == \
  214. -Integral(f(-x)/x, x) + Integral(f(x)/x, x)
  215. def test_manualintegrate_rational():
  216. assert manualintegrate(1/(4 - x**2), x) == -log(x - 2)/4 + log(x + 2)/4
  217. assert manualintegrate(1/(-1 + x**2), x) == log(x - 1)/2 - log(x + 1)/2
  218. def test_manualintegrate_special():
  219. f, F = 4*exp(-x**2/3), 2*sqrt(3)*sqrt(pi)*erf(sqrt(3)*x/3)
  220. assert_is_integral_of(f, F)
  221. f, F = 3*exp(4*x**2), 3*sqrt(pi)*erfi(2*x)/4
  222. assert_is_integral_of(f, F)
  223. f, F = x**Rational(1, 3)*exp(-x/8), -16*uppergamma(Rational(4, 3), x/8)
  224. assert_is_integral_of(f, F)
  225. f, F = exp(2*x)/x, Ei(2*x)
  226. assert_is_integral_of(f, F)
  227. f, F = exp(1 + 2*x - x**2), sqrt(pi)*exp(2)*erf(x - 1)/2
  228. assert_is_integral_of(f, F)
  229. f = sin(x**2 + 4*x + 1)
  230. F = (sqrt(2)*sqrt(pi)*(-sin(3)*fresnelc(sqrt(2)*(2*x + 4)/(2*sqrt(pi))) +
  231. cos(3)*fresnels(sqrt(2)*(2*x + 4)/(2*sqrt(pi))))/2)
  232. assert_is_integral_of(f, F)
  233. f, F = cos(4*x**2), sqrt(2)*sqrt(pi)*fresnelc(2*sqrt(2)*x/sqrt(pi))/4
  234. assert_is_integral_of(f, F)
  235. f, F = sin(3*x + 2)/x, sin(2)*Ci(3*x) + cos(2)*Si(3*x)
  236. assert_is_integral_of(f, F)
  237. f, F = sinh(3*x - 2)/x, -sinh(2)*Chi(3*x) + cosh(2)*Shi(3*x)
  238. assert_is_integral_of(f, F)
  239. f, F = 5*cos(2*x - 3)/x, 5*cos(3)*Ci(2*x) + 5*sin(3)*Si(2*x)
  240. assert_is_integral_of(f, F)
  241. f, F = cosh(x/2)/x, Chi(x/2)
  242. assert_is_integral_of(f, F)
  243. f, F = cos(x**2)/x, Ci(x**2)/2
  244. assert_is_integral_of(f, F)
  245. f, F = 1/log(2*x + 1), li(2*x + 1)/2
  246. assert_is_integral_of(f, F)
  247. f, F = polylog(2, 5*x)/x, polylog(3, 5*x)
  248. assert_is_integral_of(f, F)
  249. f, F = 5/sqrt(3 - 2*sin(x)**2), 5*sqrt(3)*elliptic_f(x, Rational(2, 3))/3
  250. assert_is_integral_of(f, F)
  251. f, F = sqrt(4 + 9*sin(x)**2), 2*elliptic_e(x, Rational(-9, 4))
  252. assert_is_integral_of(f, F)
  253. def test_manualintegrate_derivative():
  254. assert manualintegrate(pi * Derivative(x**2 + 2*x + 3), x) == \
  255. pi * (x**2 + 2*x + 3)
  256. assert manualintegrate(Derivative(x**2 + 2*x + 3, y), x) == \
  257. Integral(Derivative(x**2 + 2*x + 3, y))
  258. assert manualintegrate(Derivative(sin(x), x, x, x, y), x) == \
  259. Derivative(sin(x), x, x, y)
  260. def test_manualintegrate_Heaviside():
  261. assert_is_integral_of(DiracDelta(3*x+2), Heaviside(3*x+2)/3)
  262. assert_is_integral_of(DiracDelta(3*x, 0), Heaviside(3*x)/3)
  263. assert manualintegrate(DiracDelta(a+b*x, 1), x) == \
  264. Piecewise((DiracDelta(a + b*x)/b, Ne(b, 0)), (x*DiracDelta(a, 1), True))
  265. assert_is_integral_of(DiracDelta(x/3-1, 2), 3*DiracDelta(x/3-1, 1))
  266. assert manualintegrate(Heaviside(x), x) == x*Heaviside(x)
  267. assert manualintegrate(x*Heaviside(2), x) == x**2/2
  268. assert manualintegrate(x*Heaviside(-2), x) == 0
  269. assert manualintegrate(x*Heaviside( x), x) == x**2*Heaviside( x)/2
  270. assert manualintegrate(x*Heaviside(-x), x) == x**2*Heaviside(-x)/2
  271. assert manualintegrate(Heaviside(2*x + 4), x) == (x+2)*Heaviside(2*x + 4)
  272. assert manualintegrate(x*Heaviside(x), x) == x**2*Heaviside(x)/2
  273. assert manualintegrate(Heaviside(x + 1)*Heaviside(1 - x)*x**2, x) == \
  274. ((x**3/3 + Rational(1, 3))*Heaviside(x + 1) - Rational(2, 3))*Heaviside(-x + 1)
  275. y = Symbol('y')
  276. assert manualintegrate(sin(7 + x)*Heaviside(3*x - 7), x) == \
  277. (- cos(x + 7) + cos(Rational(28, 3)))*Heaviside(3*x - S(7))
  278. assert manualintegrate(sin(y + x)*Heaviside(3*x - y), x) == \
  279. (cos(y*Rational(4, 3)) - cos(x + y))*Heaviside(3*x - y)
  280. def test_manualintegrate_orthogonal_poly():
  281. n = symbols('n')
  282. a, b = 7, Rational(5, 3)
  283. polys = [jacobi(n, a, b, x), gegenbauer(n, a, x), chebyshevt(n, x),
  284. chebyshevu(n, x), legendre(n, x), hermite(n, x), laguerre(n, x),
  285. assoc_laguerre(n, a, x)]
  286. for p in polys:
  287. integral = manualintegrate(p, x)
  288. for deg in [-2, -1, 0, 1, 3, 5, 8]:
  289. # some accept negative "degree", some do not
  290. try:
  291. p_subbed = p.subs(n, deg)
  292. except ValueError:
  293. continue
  294. assert (integral.subs(n, deg).diff(x) - p_subbed).expand() == 0
  295. # can also integrate simple expressions with these polynomials
  296. q = x*p.subs(x, 2*x + 1)
  297. integral = manualintegrate(q, x)
  298. for deg in [2, 4, 7]:
  299. assert (integral.subs(n, deg).diff(x) - q.subs(n, deg)).expand() == 0
  300. # cannot integrate with respect to any other parameter
  301. t = symbols('t')
  302. for i in range(len(p.args) - 1):
  303. new_args = list(p.args)
  304. new_args[i] = t
  305. assert isinstance(manualintegrate(p.func(*new_args), t), Integral)
  306. @slow
  307. def test_issue_6799():
  308. r, x, phi = map(Symbol, 'r x phi'.split())
  309. n = Symbol('n', integer=True, positive=True)
  310. integrand = (cos(n*(x-phi))*cos(n*x))
  311. limits = (x, -pi, pi)
  312. assert manualintegrate(integrand, x) == \
  313. ((n*x/2 + sin(2*n*x)/4)*cos(n*phi) - sin(n*phi)*cos(n*x)**2/2)/n
  314. assert r * integrate(integrand, limits).trigsimp() / pi == r * cos(n * phi)
  315. assert not integrate(integrand, limits).has(Dummy)
  316. def test_issue_12251():
  317. assert manualintegrate(x**y, x) == Piecewise(
  318. (x**(y + 1)/(y + 1), Ne(y, -1)), (log(x), True))
  319. def test_issue_3796():
  320. assert manualintegrate(diff(exp(x + x**2)), x) == exp(x + x**2)
  321. assert integrate(x * exp(x**4), x, risch=False) == -I*sqrt(pi)*erf(I*x**2)/4
  322. def test_manual_true():
  323. assert integrate(exp(x) * sin(x), x, manual=True) == \
  324. (exp(x) * sin(x)) / 2 - (exp(x) * cos(x)) / 2
  325. assert integrate(sin(x) * cos(x), x, manual=True) in \
  326. [sin(x) ** 2 / 2, -cos(x)**2 / 2]
  327. def test_issue_6746():
  328. y = Symbol('y')
  329. n = Symbol('n')
  330. assert manualintegrate(y**x, x) == Piecewise(
  331. (y**x/log(y), Ne(log(y), 0)), (x, True))
  332. assert manualintegrate(y**(n*x), x) == Piecewise(
  333. (Piecewise(
  334. (y**(n*x)/log(y), Ne(log(y), 0)),
  335. (n*x, True)
  336. )/n, Ne(n, 0)),
  337. (x, True))
  338. assert manualintegrate(exp(n*x), x) == Piecewise(
  339. (exp(n*x)/n, Ne(n, 0)), (x, True))
  340. y = Symbol('y', positive=True)
  341. assert manualintegrate((y + 1)**x, x) == (y + 1)**x/log(y + 1)
  342. y = Symbol('y', zero=True)
  343. assert manualintegrate((y + 1)**x, x) == x
  344. y = Symbol('y')
  345. n = Symbol('n', nonzero=True)
  346. assert manualintegrate(y**(n*x), x) == Piecewise(
  347. (y**(n*x)/log(y), Ne(log(y), 0)), (n*x, True))/n
  348. y = Symbol('y', positive=True)
  349. assert manualintegrate((y + 1)**(n*x), x) == \
  350. (y + 1)**(n*x)/(n*log(y + 1))
  351. a = Symbol('a', negative=True)
  352. b = Symbol('b')
  353. assert manualintegrate(1/(a + b*x**2), x) == atan(x/sqrt(a/b))/(b*sqrt(a/b))
  354. b = Symbol('b', negative=True)
  355. assert manualintegrate(1/(a + b*x**2), x) == \
  356. atan(x/(sqrt(-a)*sqrt(-1/b)))/(b*sqrt(-a)*sqrt(-1/b))
  357. assert manualintegrate(1/((x**a + y**b + 4)*sqrt(a*x**2 + 1)), x) == \
  358. y**(-b)*Integral(x**(-a)/(y**(-b)*sqrt(a*x**2 + 1) +
  359. x**(-a)*sqrt(a*x**2 + 1) + 4*x**(-a)*y**(-b)*sqrt(a*x**2 + 1)), x)
  360. assert manualintegrate(1/((x**2 + 4)*sqrt(4*x**2 + 1)), x) == \
  361. Integral(1/((x**2 + 4)*sqrt(4*x**2 + 1)), x)
  362. assert manualintegrate(1/(x - a**x + x*b**2), x) == \
  363. Integral(1/(-a**x + b**2*x + x), x)
  364. @slow
  365. def test_issue_2850():
  366. assert manualintegrate(asin(x)*log(x), x) == -x*asin(x) - sqrt(-x**2 + 1) \
  367. + (x*asin(x) + sqrt(-x**2 + 1))*log(x) - Integral(sqrt(-x**2 + 1)/x, x)
  368. assert manualintegrate(acos(x)*log(x), x) == -x*acos(x) + sqrt(-x**2 + 1) + \
  369. (x*acos(x) - sqrt(-x**2 + 1))*log(x) + Integral(sqrt(-x**2 + 1)/x, x)
  370. assert manualintegrate(atan(x)*log(x), x) == -x*atan(x) + (x*atan(x) - \
  371. log(x**2 + 1)/2)*log(x) + log(x**2 + 1)/2 + Integral(log(x**2 + 1)/x, x)/2
  372. def test_issue_9462():
  373. assert manualintegrate(sin(2*x)*exp(x), x) == exp(x)*sin(2*x)/5 - 2*exp(x)*cos(2*x)/5
  374. assert not integral_steps(sin(2*x)*exp(x), x).contains_dont_know()
  375. assert manualintegrate((x - 3) / (x**2 - 2*x + 2)**2, x) == \
  376. Integral(x/(x**4 - 4*x**3 + 8*x**2 - 8*x + 4), x) \
  377. - 3*Integral(1/(x**4 - 4*x**3 + 8*x**2 - 8*x + 4), x)
  378. def test_cyclic_parts():
  379. f = cos(x)*exp(x/4)
  380. F = 16*exp(x/4)*sin(x)/17 + 4*exp(x/4)*cos(x)/17
  381. assert manualintegrate(f, x) == F and F.diff(x) == f
  382. f = x*cos(x)*exp(x/4)
  383. F = (x*(16*exp(x/4)*sin(x)/17 + 4*exp(x/4)*cos(x)/17) -
  384. 128*exp(x/4)*sin(x)/289 + 240*exp(x/4)*cos(x)/289)
  385. assert manualintegrate(f, x) == F and F.diff(x) == f
  386. @slow
  387. def test_issue_10847_slow():
  388. assert manualintegrate((4*x**4 + 4*x**3 + 16*x**2 + 12*x + 8)
  389. / (x**6 + 2*x**5 + 3*x**4 + 4*x**3 + 3*x**2 + 2*x + 1), x) == \
  390. 2*x/(x**2 + 1) + 3*atan(x) - 1/(x**2 + 1) - 3/(x + 1)
  391. @slow
  392. def test_issue_10847():
  393. assert manualintegrate(x**2 / (x**2 - c), x) == c*atan(x/sqrt(-c))/sqrt(-c) + x
  394. rc = Symbol('c', real=True)
  395. assert manualintegrate(x**2 / (x**2 - rc), x) == \
  396. rc*Piecewise((atan(x/sqrt(-rc))/sqrt(-rc), rc < 0),
  397. ((log(-sqrt(rc) + x) - log(sqrt(rc) + x))/(2*sqrt(rc)), True)) + x
  398. assert manualintegrate(sqrt(x - y) * log(z / x), x) == \
  399. 4*y**Rational(3, 2)*atan(sqrt(x - y)/sqrt(y))/3 - 4*y*sqrt(x - y)/3 +\
  400. 2*(x - y)**Rational(3, 2)*log(z/x)/3 + 4*(x - y)**Rational(3, 2)/9
  401. ry = Symbol('y', real=True)
  402. rz = Symbol('z', real=True)
  403. assert manualintegrate(sqrt(x - ry) * log(rz / x), x) == \
  404. 4*ry**2*Piecewise((atan(sqrt(x - ry)/sqrt(ry))/sqrt(ry), ry > 0),
  405. ((log(-sqrt(-ry) + sqrt(x - ry)) - log(sqrt(-ry) + sqrt(x - ry)))/(2*sqrt(-ry)), True))/3 \
  406. - 4*ry*sqrt(x - ry)/3 + 2*(x - ry)**Rational(3, 2)*log(rz/x)/3 \
  407. + 4*(x - ry)**Rational(3, 2)/9
  408. assert manualintegrate(sqrt(x) * log(x), x) == 2*x**Rational(3, 2)*log(x)/3 - 4*x**Rational(3, 2)/9
  409. assert manualintegrate(sqrt(a*x + b) / x, x) == \
  410. Piecewise((2*b*atan(sqrt(a*x + b)/sqrt(-b))/sqrt(-b) + 2*sqrt(a*x + b), Ne(a, 0)), (sqrt(b)*log(x), True))
  411. ra = Symbol('a', real=True)
  412. rb = Symbol('b', real=True)
  413. assert manualintegrate(sqrt(ra*x + rb) / x, x) == \
  414. Piecewise(
  415. (-2*rb*Piecewise(
  416. (-atan(sqrt(ra*x + rb)/sqrt(-rb))/sqrt(-rb), rb < 0),
  417. (-I*(log(-sqrt(rb) + sqrt(ra*x + rb)) - log(sqrt(rb) + sqrt(ra*x + rb)))/(2*sqrt(-rb)), True)) +
  418. 2*sqrt(ra*x + rb), Ne(ra, 0)),
  419. (sqrt(rb)*log(x), True))
  420. assert expand(manualintegrate(sqrt(ra*x + rb) / (x + rc), x)) == \
  421. Piecewise((-2*ra*rc*Piecewise((atan(sqrt(ra*x + rb)/sqrt(ra*rc - rb))/sqrt(ra*rc - rb), ra*rc - rb > 0),
  422. (log(-sqrt(-ra*rc + rb) + sqrt(ra*x + rb))/(2*sqrt(-ra*rc + rb)) -
  423. log(sqrt(-ra*rc + rb) + sqrt(ra*x + rb))/(2*sqrt(-ra*rc + rb)), True)) +
  424. 2*rb*Piecewise((atan(sqrt(ra*x + rb)/sqrt(ra*rc - rb))/sqrt(ra*rc - rb), ra*rc - rb > 0),
  425. (log(-sqrt(-ra*rc + rb) + sqrt(ra*x + rb))/(2*sqrt(-ra*rc + rb)) -
  426. log(sqrt(-ra*rc + rb) + sqrt(ra*x + rb))/(2*sqrt(-ra*rc + rb)), True)) +
  427. 2*sqrt(ra*x + rb), Ne(ra, 0)), (sqrt(rb)*log(rc + x), True))
  428. assert manualintegrate(sqrt(2*x + 3) / (x + 1), x) == 2*sqrt(2*x + 3) - log(sqrt(2*x + 3) + 1) + log(sqrt(2*x + 3) - 1)
  429. assert manualintegrate(sqrt(2*x + 3) / 2 * x, x) == (2*x + 3)**Rational(5, 2)/20 - (2*x + 3)**Rational(3, 2)/4
  430. assert manualintegrate(x**Rational(3,2) * log(x), x) == 2*x**Rational(5,2)*log(x)/5 - 4*x**Rational(5,2)/25
  431. assert manualintegrate(x**(-3) * log(x), x) == -log(x)/(2*x**2) - 1/(4*x**2)
  432. assert manualintegrate(log(y)/(y**2*(1 - 1/y)), y) == \
  433. log(y)*log(-1 + 1/y) - Integral(log(-1 + 1/y)/y, y)
  434. def test_issue_12899():
  435. assert manualintegrate(f(x,y).diff(x),y) == Integral(Derivative(f(x,y),x),y)
  436. assert manualintegrate(f(x,y).diff(y).diff(x),y) == Derivative(f(x,y),x)
  437. def test_constant_independent_of_symbol():
  438. assert manualintegrate(Integral(y, (x, 1, 2)), x) == \
  439. x*Integral(y, (x, 1, 2))
  440. def test_issue_12641():
  441. assert manualintegrate(sin(2*x), x) == -cos(2*x)/2
  442. assert manualintegrate(cos(x)*sin(2*x), x) == -2*cos(x)**3/3
  443. assert manualintegrate((sin(2*x)*cos(x))/(1 + cos(x)), x) == \
  444. -2*log(cos(x) + 1) - cos(x)**2 + 2*cos(x)
  445. @slow
  446. def test_issue_13297():
  447. assert manualintegrate(sin(x) * cos(x)**5, x) == -cos(x)**6 / 6
  448. def test_issue_14470():
  449. assert_is_integral_of(1/(x*sqrt(x + 1)), log(sqrt(x + 1) - 1) - log(sqrt(x + 1) + 1))
  450. @slow
  451. def test_issue_9858():
  452. assert manualintegrate(exp(x)*cos(exp(x)), x) == sin(exp(x))
  453. assert manualintegrate(exp(2*x)*cos(exp(x)), x) == \
  454. exp(x)*sin(exp(x)) + cos(exp(x))
  455. res = manualintegrate(exp(10*x)*sin(exp(x)), x)
  456. assert not res.has(Integral)
  457. assert res.diff(x) == exp(10*x)*sin(exp(x))
  458. # an example with many similar integrations by parts
  459. assert manualintegrate(sum([x*exp(k*x) for k in range(1, 8)]), x) == (
  460. x*exp(7*x)/7 + x*exp(6*x)/6 + x*exp(5*x)/5 + x*exp(4*x)/4 +
  461. x*exp(3*x)/3 + x*exp(2*x)/2 + x*exp(x) - exp(7*x)/49 -exp(6*x)/36 -
  462. exp(5*x)/25 - exp(4*x)/16 - exp(3*x)/9 - exp(2*x)/4 - exp(x))
  463. def test_issue_8520():
  464. assert manualintegrate(x/(x**4 + 1), x) == atan(x**2)/2
  465. assert manualintegrate(x**2/(x**6 + 25), x) == atan(x**3/5)/15
  466. f = x/(9*x**4 + 4)**2
  467. assert manualintegrate(f, x).diff(x).factor() == f
  468. def test_manual_subs():
  469. x, y = symbols('x y')
  470. expr = log(x) + exp(x)
  471. # if log(x) is y, then exp(y) is x
  472. assert manual_subs(expr, log(x), y) == y + exp(exp(y))
  473. # if exp(x) is y, then log(y) need not be x
  474. assert manual_subs(expr, exp(x), y) == log(x) + y
  475. raises(ValueError, lambda: manual_subs(expr, x))
  476. raises(ValueError, lambda: manual_subs(expr, exp(x), x, y))
  477. @slow
  478. def test_issue_15471():
  479. f = log(x)*cos(log(x))/x**Rational(3, 4)
  480. F = -128*x**Rational(1, 4)*sin(log(x))/289 + 240*x**Rational(1, 4)*cos(log(x))/289 + (16*x**Rational(1, 4)*sin(log(x))/17 + 4*x**Rational(1, 4)*cos(log(x))/17)*log(x)
  481. assert_is_integral_of(f, F)
  482. def test_quadratic_denom():
  483. f = (5*x + 2)/(3*x**2 - 2*x + 8)
  484. assert manualintegrate(f, x) == 5*log(3*x**2 - 2*x + 8)/6 + 11*sqrt(23)*atan(3*sqrt(23)*(x - Rational(1, 3))/23)/69
  485. g = 3/(2*x**2 + 3*x + 1)
  486. assert manualintegrate(g, x) == 3*log(4*x + 2) - 3*log(4*x + 4)
  487. def test_issue_22757():
  488. assert manualintegrate(sin(x), y) == y * sin(x)
  489. def test_issue_23348():
  490. steps = integral_steps(tan(x), x)
  491. constant_times_step = steps.substep.substep
  492. assert constant_times_step.integrand == constant_times_step.constant * constant_times_step.other
  493. def test_issue_23566():
  494. i = Integral(1/sqrt(x**2 - 1), (x, -2, -1)).doit(manual=True)
  495. assert i == -log(4 - 2*sqrt(3)) + log(2)
  496. assert str(i.n()) == '1.31695789692482'
  497. def test_nested_pow():
  498. assert_is_integral_of(sqrt(x**2), x*sqrt(x**2)/2)
  499. assert_is_integral_of(sqrt(x**(S(5)/3)), 6*x*sqrt(x**(S(5)/3))/11)
  500. assert_is_integral_of(1/sqrt(x**2), x*log(x)/sqrt(x**2))
  501. assert_is_integral_of(x*sqrt(x**(-4)), x**2*sqrt(x**-4)*log(x))
  502. f = (c*(a+b*x)**d)**e
  503. F1 = (c*(a + b*x)**d)**e*(a/b + x)/(d*e + 1)
  504. F2 = (c*(a + b*x)**d)**e*(a/b + x)*log(a/b + x)
  505. assert manualintegrate(f, x) == \
  506. Piecewise((Piecewise((F1, Ne(d*e, -1)), (F2, True)), Ne(b, 0)), (x*(a**d*c)**e, True))
  507. assert F1.diff(x).equals(f)
  508. assert F2.diff(x).subs(d*e, -1).equals(f)
  509. def test_manualintegrate_sqrt_linear():
  510. assert_is_integral_of((5*x**3+4)/sqrt(2+3*x),
  511. 10*(3*x + 2)**(S(7)/2)/567 - 4*(3*x + 2)**(S(5)/2)/27 +
  512. 40*(3*x + 2)**(S(3)/2)/81 + 136*sqrt(3*x + 2)/81)
  513. assert manualintegrate(x/sqrt(a+b*x)**3, x) == \
  514. Piecewise((Mul(2, b**-2, a/sqrt(a + b*x) + sqrt(a + b*x)), Ne(b, 0)), (x**2/(2*a**(S(3)/2)), True))
  515. assert_is_integral_of((sqrt(3*x+3)+1)/((2*x+2)**(1/S(3))+1),
  516. 3*sqrt(6)*(2*x + 2)**(S(7)/6)/14 - 3*sqrt(6)*(2*x + 2)**(S(5)/6)/10 -
  517. 3*sqrt(6)*(2*x + 2)**(S.One/6)/2 + 3*(2*x + 2)**(S(2)/3)/4 - 3*(2*x + 2)**(S.One/3)/2 +
  518. sqrt(6)*sqrt(2*x + 2)/2 + 3*log((2*x + 2)**(S.One/3) + 1)/2 +
  519. 3*sqrt(6)*atan((2*x + 2)**(S.One/6))/2)
  520. assert_is_integral_of(sqrt(x+sqrt(x)),
  521. 2*sqrt(sqrt(x) + x)*(sqrt(x)/12 + x/3 - S(1)/8) + log(2*sqrt(x) + 2*sqrt(sqrt(x) + x) + 1)/8)
  522. assert_is_integral_of(sqrt(2*x+3+sqrt(4*x+5))**3,
  523. sqrt(2*x + sqrt(4*x + 5) + 3) *
  524. (9*x/10 + 11*(4*x + 5)**(S(3)/2)/40 + sqrt(4*x + 5)/40 + (4*x + 5)**2/10 + S(11)/10)/2)
  525. def test_manualintegrate_sqrt_quadratic():
  526. assert_is_integral_of(1/sqrt((x - I)**2-1), log(2*x + 2*sqrt(x**2 - 2*I*x - 2) - 2*I))
  527. assert_is_integral_of(1/sqrt(3*x**2+4*x+5), sqrt(3)*asinh(3*sqrt(11)*(x + S(2)/3)/11)/3)
  528. assert_is_integral_of(1/sqrt(-3*x**2+4*x+5), sqrt(3)*asin(3*sqrt(19)*(x - S(2)/3)/19)/3)
  529. assert_is_integral_of(1/sqrt(3*x**2+4*x-5), sqrt(3)*log(6*x + 2*sqrt(3)*sqrt(3*x**2 + 4*x - 5) + 4)/3)
  530. assert_is_integral_of(1/sqrt(4*x**2-4*x+1), (x - S.Half)*log(x - S.Half)/(2*sqrt((x - S.Half)**2)))
  531. assert manualintegrate(1/sqrt(a+b*x+c*x**2), x) == \
  532. Piecewise((log(b + 2*sqrt(c)*sqrt(a + b*x + c*x**2) + 2*c*x)/sqrt(c), Ne(c, 0) & Ne(a - b**2/(4*c), 0)),
  533. ((b/(2*c) + x)*log(b/(2*c) + x)/sqrt(c*(b/(2*c) + x)**2), Ne(c, 0)),
  534. (2*sqrt(a + b*x)/b, Ne(b, 0)), (x/sqrt(a), True))
  535. assert_is_integral_of((7*x+6)/sqrt(3*x**2+4*x+5),
  536. 7*sqrt(3*x**2 + 4*x + 5)/3 + 4*sqrt(3)*asinh(3*sqrt(11)*(x + S(2)/3)/11)/9)
  537. assert_is_integral_of((7*x+6)/sqrt(-3*x**2+4*x+5),
  538. -7*sqrt(-3*x**2 + 4*x + 5)/3 + 32*sqrt(3)*asin(3*sqrt(19)*(x - S(2)/3)/19)/9)
  539. assert_is_integral_of((7*x+6)/sqrt(3*x**2+4*x-5),
  540. 7*sqrt(3*x**2 + 4*x - 5)/3 + 4*sqrt(3)*log(6*x + 2*sqrt(3)*sqrt(3*x**2 + 4*x - 5) + 4)/9)
  541. assert manualintegrate((d+e*x)/sqrt(a+b*x+c*x**2), x) == \
  542. Piecewise(((-b*e/(2*c) + d) *
  543. Piecewise((log(b + 2*sqrt(c)*sqrt(a + b*x + c*x**2) + 2*c*x)/sqrt(c), Ne(a - b**2/(4*c), 0)),
  544. ((b/(2*c) + x)*log(b/(2*c) + x)/sqrt(c*(b/(2*c) + x)**2), True)) +
  545. e*sqrt(a + b*x + c*x**2)/c, Ne(c, 0)),
  546. ((2*d*sqrt(a + b*x) + 2*e*(-a*sqrt(a + b*x) + (a + b*x)**(S(3)/2)/3)/b)/b, Ne(b, 0)),
  547. ((d*x + e*x**2/2)/sqrt(a), True))
  548. assert manualintegrate((3*x**3-x**2+2*x-4)/sqrt(x**2-3*x+2), x) == \
  549. sqrt(x**2 - 3*x + 2)*(x**2 + 13*x/4 + S(101)/8) + 135*log(2*x + 2*sqrt(x**2 - 3*x + 2) - 3)/16
  550. assert_is_integral_of(sqrt(53225*x**2-66732*x+23013),
  551. (x/2 - S(16683)/53225)*sqrt(53225*x**2 - 66732*x + 23013) +
  552. 111576969*sqrt(2129)*asinh(53225*x/10563 - S(11122)/3521)/1133160250)
  553. assert manualintegrate(sqrt(a+c*x**2), x) == \
  554. Piecewise((a*Piecewise((log(2*sqrt(c)*sqrt(a + c*x**2) + 2*c*x)/sqrt(c), Ne(a, 0)),
  555. (x*log(x)/sqrt(c*x**2), True))/2 + x*sqrt(a + c*x**2)/2, Ne(c, 0)),
  556. (sqrt(a)*x, True))
  557. assert manualintegrate(sqrt(a+b*x+c*x**2), x) == \
  558. Piecewise(((a/2 - b**2/(8*c)) *
  559. Piecewise((log(b + 2*sqrt(c)*sqrt(a + b*x + c*x**2) + 2*c*x)/sqrt(c), Ne(a - b**2/(4*c), 0)),
  560. ((b/(2*c) + x)*log(b/(2*c) + x)/sqrt(c*(b/(2*c) + x)**2), True)) +
  561. (b/(4*c) + x/2)*sqrt(a + b*x + c*x**2), Ne(c, 0)),
  562. (2*(a + b*x)**(S(3)/2)/(3*b), Ne(b, 0)),
  563. (sqrt(a)*x, True))
  564. assert_is_integral_of(x*sqrt(x**2+2*x+4),
  565. (x**2/3 + x/6 + S(5)/6)*sqrt(x**2 + 2*x + 4) - 3*asinh(sqrt(3)*(x + 1)/3)/2)
  566. def test_mul_pow_derivative():
  567. assert_is_integral_of(x*sec(x)*tan(x), x*sec(x) - log(tan(x) + sec(x)))
  568. assert_is_integral_of(x*sec(x)**2, x*tan(x) + log(cos(x)))
  569. assert_is_integral_of(x**3*Derivative(f(x), (x, 4)),
  570. x**3*Derivative(f(x), (x, 3)) - 3*x**2*Derivative(f(x), (x, 2)) +
  571. 6*x*Derivative(f(x), x) - 6*f(x))