test_manual.py 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  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, piecewise_fold
  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) == Piecewise((atan(x/sqrt(a/b))/(b*sqrt(a/b)), Ne(a, 0)),
  130. (-1/(b*x), True))
  131. # asin
  132. assert manualintegrate(1/sqrt(1-x**2), x) == asin(x)
  133. assert manualintegrate(1/sqrt(4-4*x**2), x) == asin(x)/2
  134. assert manualintegrate(3/sqrt(1-9*x**2), x) == asin(3*x)
  135. assert manualintegrate(1/sqrt(4-9*x**2), x) == asin(x*Rational(3, 2))/3
  136. # asinh
  137. assert manualintegrate(1/sqrt(x**2 + 1), x) == \
  138. asinh(x)
  139. assert manualintegrate(1/sqrt(x**2 + 4), x) == \
  140. asinh(x/2)
  141. assert manualintegrate(1/sqrt(4*x**2 + 4), x) == \
  142. asinh(x)/2
  143. assert manualintegrate(1/sqrt(4*x**2 + 1), x) == \
  144. asinh(2*x)/2
  145. assert manualintegrate(1/sqrt(ra*x**2 + 1), x) == \
  146. Piecewise((asin(x*sqrt(-ra))/sqrt(-ra), ra < 0), (asinh(sqrt(ra)*x)/sqrt(ra), ra > 0), (x, True))
  147. assert manualintegrate(1/sqrt(ra + x**2), x) == \
  148. Piecewise((asinh(x*sqrt(1/ra)), ra > 0), (log(2*x + 2*sqrt(ra + x**2)), True))
  149. # log
  150. assert manualintegrate(1/sqrt(x**2 - 1), x) == log(2*x + 2*sqrt(x**2 - 1))
  151. assert manualintegrate(1/sqrt(x**2 - 4), x) == log(2*x + 2*sqrt(x**2 - 4))
  152. assert manualintegrate(1/sqrt(4*x**2 - 4), x) == log(8*x + 4*sqrt(4*x**2 - 4))/2
  153. assert manualintegrate(1/sqrt(9*x**2 - 1), x) == log(18*x + 6*sqrt(9*x**2 - 1))/3
  154. assert manualintegrate(1/sqrt(ra*x**2 - 4), x) == \
  155. Piecewise((log(2*sqrt(ra)*sqrt(ra*x**2 - 4) + 2*ra*x)/sqrt(ra), Ne(ra, 0)), (-I*x/2, True))
  156. assert manualintegrate(1/sqrt(-ra + 4*x**2), x) == \
  157. Piecewise((asinh(2*x*sqrt(-1/ra))/2, ra < 0), (log(8*x + 4*sqrt(-ra + 4*x**2))/2, True))
  158. # From https://www.wikiwand.com/en/List_of_integrals_of_inverse_trigonometric_functions
  159. # asin
  160. assert manualintegrate(asin(x), x) == x*asin(x) + sqrt(1 - x**2)
  161. assert manualintegrate(asin(a*x), x) == Piecewise(((a*x*asin(a*x) + sqrt(-a**2*x**2 + 1))/a, Ne(a, 0)), (0, True))
  162. assert manualintegrate(x*asin(a*x), x) == \
  163. -a*Piecewise((-x*sqrt(-a**2*x**2 + 1)/(2*a**2) +
  164. 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)),
  165. (x**3/3, True))/2 + x**2*asin(a*x)/2
  166. # acos
  167. assert manualintegrate(acos(x), x) == x*acos(x) - sqrt(1 - x**2)
  168. 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))
  169. assert manualintegrate(x*acos(a*x), x) == \
  170. a*Piecewise((-x*sqrt(-a**2*x**2 + 1)/(2*a**2) +
  171. 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)),
  172. (x**3/3, True))/2 + x**2*acos(a*x)/2
  173. # atan
  174. assert manualintegrate(atan(x), x) == x*atan(x) - log(x**2 + 1)/2
  175. 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))
  176. 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
  177. # acsc
  178. assert manualintegrate(acsc(x), x) == x*acsc(x) + Integral(1/(x*sqrt(1 - 1/x**2)), x)
  179. assert manualintegrate(acsc(a*x), x) == x*acsc(a*x) + Integral(1/(x*sqrt(1 - 1/(a**2*x**2))), x)/a
  180. 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)
  181. # asec
  182. assert manualintegrate(asec(x), x) == x*asec(x) - Integral(1/(x*sqrt(1 - 1/x**2)), x)
  183. assert manualintegrate(asec(a*x), x) == x*asec(a*x) - Integral(1/(x*sqrt(1 - 1/(a**2*x**2))), x)/a
  184. 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)
  185. # acot
  186. assert manualintegrate(acot(x), x) == x*acot(x) + log(x**2 + 1)/2
  187. 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))
  188. 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
  189. # piecewise
  190. assert manualintegrate(1/sqrt(ra-rb*x**2), x) == \
  191. Piecewise((asin(x*sqrt(rb/ra))/sqrt(rb), And(-rb < 0, ra > 0)),
  192. (asinh(x*sqrt(-rb/ra))/sqrt(-rb), And(-rb > 0, ra > 0)),
  193. (log(-2*rb*x + 2*sqrt(-rb)*sqrt(ra - rb*x**2))/sqrt(-rb), Ne(rb, 0)),
  194. (x/sqrt(ra), True))
  195. assert manualintegrate(1/sqrt(ra + rb*x**2), x) == \
  196. Piecewise((asin(x*sqrt(-rb/ra))/sqrt(-rb), And(ra > 0, rb < 0)),
  197. (asinh(x*sqrt(rb/ra))/sqrt(rb), And(ra > 0, rb > 0)),
  198. (log(2*sqrt(rb)*sqrt(ra + rb*x**2) + 2*rb*x)/sqrt(rb), Ne(rb, 0)),
  199. (x/sqrt(ra), True))
  200. def test_manualintegrate_trig_substitution():
  201. assert manualintegrate(sqrt(16*x**2 - 9)/x, x) == \
  202. Piecewise((sqrt(16*x**2 - 9) - 3*acos(3/(4*x)),
  203. And(x < Rational(3, 4), x > Rational(-3, 4))))
  204. assert manualintegrate(1/(x**4 * sqrt(25-x**2)), x) == \
  205. Piecewise((-sqrt(-x**2/25 + 1)/(125*x) -
  206. (-x**2/25 + 1)**(3*S.Half)/(15*x**3), And(x < 5, x > -5)))
  207. assert manualintegrate(x**7/(49*x**2 + 1)**(3 * S.Half), x) == \
  208. ((49*x**2 + 1)**(5*S.Half)/28824005 -
  209. (49*x**2 + 1)**(3*S.Half)/5764801 +
  210. 3*sqrt(49*x**2 + 1)/5764801 + 1/(5764801*sqrt(49*x**2 + 1)))
  211. def test_manualintegrate_trivial_substitution():
  212. assert manualintegrate((exp(x) - exp(-x))/x, x) == -Ei(-x) + Ei(x)
  213. f = Function('f')
  214. assert manualintegrate((f(x) - f(-x))/x, x) == \
  215. -Integral(f(-x)/x, x) + Integral(f(x)/x, x)
  216. def test_manualintegrate_rational():
  217. assert manualintegrate(1/(4 - x**2), x) == -log(x - 2)/4 + log(x + 2)/4
  218. assert manualintegrate(1/(-1 + x**2), x) == log(x - 1)/2 - log(x + 1)/2
  219. def test_manualintegrate_special():
  220. f, F = 4*exp(-x**2/3), 2*sqrt(3)*sqrt(pi)*erf(sqrt(3)*x/3)
  221. assert_is_integral_of(f, F)
  222. f, F = 3*exp(4*x**2), 3*sqrt(pi)*erfi(2*x)/4
  223. assert_is_integral_of(f, F)
  224. f, F = x**Rational(1, 3)*exp(-x/8), -16*uppergamma(Rational(4, 3), x/8)
  225. assert_is_integral_of(f, F)
  226. f, F = exp(2*x)/x, Ei(2*x)
  227. assert_is_integral_of(f, F)
  228. f, F = exp(1 + 2*x - x**2), sqrt(pi)*exp(2)*erf(x - 1)/2
  229. assert_is_integral_of(f, F)
  230. f = sin(x**2 + 4*x + 1)
  231. F = (sqrt(2)*sqrt(pi)*(-sin(3)*fresnelc(sqrt(2)*(2*x + 4)/(2*sqrt(pi))) +
  232. cos(3)*fresnels(sqrt(2)*(2*x + 4)/(2*sqrt(pi))))/2)
  233. assert_is_integral_of(f, F)
  234. f, F = cos(4*x**2), sqrt(2)*sqrt(pi)*fresnelc(2*sqrt(2)*x/sqrt(pi))/4
  235. assert_is_integral_of(f, F)
  236. f, F = sin(3*x + 2)/x, sin(2)*Ci(3*x) + cos(2)*Si(3*x)
  237. assert_is_integral_of(f, F)
  238. f, F = sinh(3*x - 2)/x, -sinh(2)*Chi(3*x) + cosh(2)*Shi(3*x)
  239. assert_is_integral_of(f, F)
  240. f, F = 5*cos(2*x - 3)/x, 5*cos(3)*Ci(2*x) + 5*sin(3)*Si(2*x)
  241. assert_is_integral_of(f, F)
  242. f, F = cosh(x/2)/x, Chi(x/2)
  243. assert_is_integral_of(f, F)
  244. f, F = cos(x**2)/x, Ci(x**2)/2
  245. assert_is_integral_of(f, F)
  246. f, F = 1/log(2*x + 1), li(2*x + 1)/2
  247. assert_is_integral_of(f, F)
  248. f, F = polylog(2, 5*x)/x, polylog(3, 5*x)
  249. assert_is_integral_of(f, F)
  250. f, F = 5/sqrt(3 - 2*sin(x)**2), 5*sqrt(3)*elliptic_f(x, Rational(2, 3))/3
  251. assert_is_integral_of(f, F)
  252. f, F = sqrt(4 + 9*sin(x)**2), 2*elliptic_e(x, Rational(-9, 4))
  253. assert_is_integral_of(f, F)
  254. def test_manualintegrate_derivative():
  255. assert manualintegrate(pi * Derivative(x**2 + 2*x + 3), x) == \
  256. pi * (x**2 + 2*x + 3)
  257. assert manualintegrate(Derivative(x**2 + 2*x + 3, y), x) == \
  258. Integral(Derivative(x**2 + 2*x + 3, y))
  259. assert manualintegrate(Derivative(sin(x), x, x, x, y), x) == \
  260. Derivative(sin(x), x, x, y)
  261. def test_manualintegrate_Heaviside():
  262. assert_is_integral_of(DiracDelta(3*x+2), Heaviside(3*x+2)/3)
  263. assert_is_integral_of(DiracDelta(3*x, 0), Heaviside(3*x)/3)
  264. assert manualintegrate(DiracDelta(a+b*x, 1), x) == \
  265. Piecewise((DiracDelta(a + b*x)/b, Ne(b, 0)), (x*DiracDelta(a, 1), True))
  266. assert_is_integral_of(DiracDelta(x/3-1, 2), 3*DiracDelta(x/3-1, 1))
  267. assert manualintegrate(Heaviside(x), x) == x*Heaviside(x)
  268. assert manualintegrate(x*Heaviside(2), x) == x**2/2
  269. assert manualintegrate(x*Heaviside(-2), x) == 0
  270. assert manualintegrate(x*Heaviside( x), x) == x**2*Heaviside( x)/2
  271. assert manualintegrate(x*Heaviside(-x), x) == x**2*Heaviside(-x)/2
  272. assert manualintegrate(Heaviside(2*x + 4), x) == (x+2)*Heaviside(2*x + 4)
  273. assert manualintegrate(x*Heaviside(x), x) == x**2*Heaviside(x)/2
  274. assert manualintegrate(Heaviside(x + 1)*Heaviside(1 - x)*x**2, x) == \
  275. ((x**3/3 + Rational(1, 3))*Heaviside(x + 1) - Rational(2, 3))*Heaviside(-x + 1)
  276. y = Symbol('y')
  277. assert manualintegrate(sin(7 + x)*Heaviside(3*x - 7), x) == \
  278. (- cos(x + 7) + cos(Rational(28, 3)))*Heaviside(3*x - S(7))
  279. assert manualintegrate(sin(y + x)*Heaviside(3*x - y), x) == \
  280. (cos(y*Rational(4, 3)) - cos(x + y))*Heaviside(3*x - y)
  281. def test_manualintegrate_orthogonal_poly():
  282. n = symbols('n')
  283. a, b = 7, Rational(5, 3)
  284. polys = [jacobi(n, a, b, x), gegenbauer(n, a, x), chebyshevt(n, x),
  285. chebyshevu(n, x), legendre(n, x), hermite(n, x), laguerre(n, x),
  286. assoc_laguerre(n, a, x)]
  287. for p in polys:
  288. integral = manualintegrate(p, x)
  289. for deg in [-2, -1, 0, 1, 3, 5, 8]:
  290. # some accept negative "degree", some do not
  291. try:
  292. p_subbed = p.subs(n, deg)
  293. except ValueError:
  294. continue
  295. assert (integral.subs(n, deg).diff(x) - p_subbed).expand() == 0
  296. # can also integrate simple expressions with these polynomials
  297. q = x*p.subs(x, 2*x + 1)
  298. integral = manualintegrate(q, x)
  299. for deg in [2, 4, 7]:
  300. assert (integral.subs(n, deg).diff(x) - q.subs(n, deg)).expand() == 0
  301. # cannot integrate with respect to any other parameter
  302. t = symbols('t')
  303. for i in range(len(p.args) - 1):
  304. new_args = list(p.args)
  305. new_args[i] = t
  306. assert isinstance(manualintegrate(p.func(*new_args), t), Integral)
  307. @slow
  308. def test_issue_6799():
  309. r, x, phi = map(Symbol, 'r x phi'.split())
  310. n = Symbol('n', integer=True, positive=True)
  311. integrand = (cos(n*(x-phi))*cos(n*x))
  312. limits = (x, -pi, pi)
  313. assert manualintegrate(integrand, x) == \
  314. ((n*x/2 + sin(2*n*x)/4)*cos(n*phi) - sin(n*phi)*cos(n*x)**2/2)/n
  315. assert r * integrate(integrand, limits).trigsimp() / pi == r * cos(n * phi)
  316. assert not integrate(integrand, limits).has(Dummy)
  317. def test_issue_12251():
  318. assert manualintegrate(x**y, x) == Piecewise(
  319. (x**(y + 1)/(y + 1), Ne(y, -1)), (log(x), True))
  320. def test_issue_3796():
  321. assert manualintegrate(diff(exp(x + x**2)), x) == exp(x + x**2)
  322. assert integrate(x * exp(x**4), x, risch=False) == -I*sqrt(pi)*erf(I*x**2)/4
  323. def test_manual_true():
  324. assert integrate(exp(x) * sin(x), x, manual=True) == \
  325. (exp(x) * sin(x)) / 2 - (exp(x) * cos(x)) / 2
  326. assert integrate(sin(x) * cos(x), x, manual=True) in \
  327. [sin(x) ** 2 / 2, -cos(x)**2 / 2]
  328. def test_issue_6746():
  329. y = Symbol('y')
  330. n = Symbol('n')
  331. assert manualintegrate(y**x, x) == Piecewise(
  332. (y**x/log(y), Ne(log(y), 0)), (x, True))
  333. assert manualintegrate(y**(n*x), x) == Piecewise(
  334. (Piecewise(
  335. (y**(n*x)/log(y), Ne(log(y), 0)),
  336. (n*x, True)
  337. )/n, Ne(n, 0)),
  338. (x, True))
  339. assert manualintegrate(exp(n*x), x) == Piecewise(
  340. (exp(n*x)/n, Ne(n, 0)), (x, True))
  341. y = Symbol('y', positive=True)
  342. assert manualintegrate((y + 1)**x, x) == (y + 1)**x/log(y + 1)
  343. y = Symbol('y', zero=True)
  344. assert manualintegrate((y + 1)**x, x) == x
  345. y = Symbol('y')
  346. n = Symbol('n', nonzero=True)
  347. assert manualintegrate(y**(n*x), x) == Piecewise(
  348. (y**(n*x)/log(y), Ne(log(y), 0)), (n*x, True))/n
  349. y = Symbol('y', positive=True)
  350. assert manualintegrate((y + 1)**(n*x), x) == \
  351. (y + 1)**(n*x)/(n*log(y + 1))
  352. a = Symbol('a', negative=True)
  353. b = Symbol('b')
  354. assert manualintegrate(1/(a + b*x**2), x) == atan(x/sqrt(a/b))/(b*sqrt(a/b))
  355. b = Symbol('b', negative=True)
  356. assert manualintegrate(1/(a + b*x**2), x) == \
  357. atan(x/(sqrt(-a)*sqrt(-1/b)))/(b*sqrt(-a)*sqrt(-1/b))
  358. assert manualintegrate(1/((x**a + y**b + 4)*sqrt(a*x**2 + 1)), x) == \
  359. y**(-b)*Integral(x**(-a)/(y**(-b)*sqrt(a*x**2 + 1) +
  360. x**(-a)*sqrt(a*x**2 + 1) + 4*x**(-a)*y**(-b)*sqrt(a*x**2 + 1)), x)
  361. assert manualintegrate(1/((x**2 + 4)*sqrt(4*x**2 + 1)), x) == \
  362. Integral(1/((x**2 + 4)*sqrt(4*x**2 + 1)), x)
  363. assert manualintegrate(1/(x - a**x + x*b**2), x) == \
  364. Integral(1/(-a**x + b**2*x + x), x)
  365. @slow
  366. def test_issue_2850():
  367. assert manualintegrate(asin(x)*log(x), x) == -x*asin(x) - sqrt(-x**2 + 1) \
  368. + (x*asin(x) + sqrt(-x**2 + 1))*log(x) - Integral(sqrt(-x**2 + 1)/x, x)
  369. assert manualintegrate(acos(x)*log(x), x) == -x*acos(x) + sqrt(-x**2 + 1) + \
  370. (x*acos(x) - sqrt(-x**2 + 1))*log(x) + Integral(sqrt(-x**2 + 1)/x, x)
  371. assert manualintegrate(atan(x)*log(x), x) == -x*atan(x) + (x*atan(x) - \
  372. log(x**2 + 1)/2)*log(x) + log(x**2 + 1)/2 + Integral(log(x**2 + 1)/x, x)/2
  373. def test_issue_9462():
  374. assert manualintegrate(sin(2*x)*exp(x), x) == exp(x)*sin(2*x)/5 - 2*exp(x)*cos(2*x)/5
  375. assert not integral_steps(sin(2*x)*exp(x), x).contains_dont_know()
  376. assert manualintegrate((x - 3) / (x**2 - 2*x + 2)**2, x) == \
  377. Integral(x/(x**4 - 4*x**3 + 8*x**2 - 8*x + 4), x) \
  378. - 3*Integral(1/(x**4 - 4*x**3 + 8*x**2 - 8*x + 4), x)
  379. def test_cyclic_parts():
  380. f = cos(x)*exp(x/4)
  381. F = 16*exp(x/4)*sin(x)/17 + 4*exp(x/4)*cos(x)/17
  382. assert manualintegrate(f, x) == F and F.diff(x) == f
  383. f = x*cos(x)*exp(x/4)
  384. F = (x*(16*exp(x/4)*sin(x)/17 + 4*exp(x/4)*cos(x)/17) -
  385. 128*exp(x/4)*sin(x)/289 + 240*exp(x/4)*cos(x)/289)
  386. assert manualintegrate(f, x) == F and F.diff(x) == f
  387. @slow
  388. def test_issue_10847_slow():
  389. assert manualintegrate((4*x**4 + 4*x**3 + 16*x**2 + 12*x + 8)
  390. / (x**6 + 2*x**5 + 3*x**4 + 4*x**3 + 3*x**2 + 2*x + 1), x) == \
  391. 2*x/(x**2 + 1) + 3*atan(x) - 1/(x**2 + 1) - 3/(x + 1)
  392. @slow
  393. def test_issue_10847():
  394. assert manualintegrate(x**2 / (x**2 - c), x) == \
  395. c*Piecewise((atan(x/sqrt(-c))/sqrt(-c), Ne(c, 0)), (-1/x, True)) + x
  396. rc = Symbol('c', real=True)
  397. assert manualintegrate(x**2 / (x**2 - rc), x) == \
  398. rc*Piecewise((atan(x/sqrt(-rc))/sqrt(-rc), rc < 0),
  399. ((log(-sqrt(rc) + x) - log(sqrt(rc) + x))/(2*sqrt(rc)), True)) + x
  400. assert manualintegrate(sqrt(x - y) * log(z / x), x) == \
  401. 4*y**2*Piecewise((atan(sqrt(x - y)/sqrt(y))/sqrt(y), Ne(y, 0)),
  402. (-1/sqrt(x - y), True))/3 - 4*y*sqrt(x - y)/3 + \
  403. 2*(x - y)**Rational(3, 2)*log(z/x)/3 + 4*(x - y)**Rational(3, 2)/9
  404. ry = Symbol('y', real=True)
  405. rz = Symbol('z', real=True)
  406. assert manualintegrate(sqrt(x - ry) * log(rz / x), x) == \
  407. 4*ry**2*Piecewise((atan(sqrt(x - ry)/sqrt(ry))/sqrt(ry), ry > 0),
  408. ((log(-sqrt(-ry) + sqrt(x - ry)) - log(sqrt(-ry) + sqrt(x - ry)))/(2*sqrt(-ry)), True))/3 \
  409. - 4*ry*sqrt(x - ry)/3 + 2*(x - ry)**Rational(3, 2)*log(rz/x)/3 \
  410. + 4*(x - ry)**Rational(3, 2)/9
  411. assert manualintegrate(sqrt(x) * log(x), x) == 2*x**Rational(3, 2)*log(x)/3 - 4*x**Rational(3, 2)/9
  412. result = manualintegrate(sqrt(a*x + b) / x, x)
  413. assert result == Piecewise((-2*b*Piecewise(
  414. (-atan(sqrt(a*x + b)/sqrt(-b))/sqrt(-b), Ne(b, 0)),
  415. (1/sqrt(a*x + b), True)) + 2*sqrt(a*x + b), Ne(a, 0)),
  416. (sqrt(b)*log(x), True))
  417. assert piecewise_fold(result) == Piecewise(
  418. (2*b*atan(sqrt(a*x + b)/sqrt(-b))/sqrt(-b) + 2*sqrt(a*x + b), Ne(a, 0) & Ne(b, 0)),
  419. (-2*b/sqrt(a*x + b) + 2*sqrt(a*x + b), Ne(a, 0)),
  420. (sqrt(b)*log(x), True))
  421. ra = Symbol('a', real=True)
  422. rb = Symbol('b', real=True)
  423. assert manualintegrate(sqrt(ra*x + rb) / x, x) == \
  424. Piecewise(
  425. (-2*rb*Piecewise(
  426. (-atan(sqrt(ra*x + rb)/sqrt(-rb))/sqrt(-rb), rb < 0),
  427. (-I*(log(-sqrt(rb) + sqrt(ra*x + rb)) - log(sqrt(rb) + sqrt(ra*x + rb)))/(2*sqrt(-rb)), True)) +
  428. 2*sqrt(ra*x + rb), Ne(ra, 0)),
  429. (sqrt(rb)*log(x), True))
  430. assert expand(manualintegrate(sqrt(ra*x + rb) / (x + rc), x)) == \
  431. Piecewise((-2*ra*rc*Piecewise((atan(sqrt(ra*x + rb)/sqrt(ra*rc - rb))/sqrt(ra*rc - rb), ra*rc - rb > 0),
  432. (log(-sqrt(-ra*rc + rb) + sqrt(ra*x + rb))/(2*sqrt(-ra*rc + rb)) -
  433. log(sqrt(-ra*rc + rb) + sqrt(ra*x + rb))/(2*sqrt(-ra*rc + rb)), True)) +
  434. 2*rb*Piecewise((atan(sqrt(ra*x + rb)/sqrt(ra*rc - rb))/sqrt(ra*rc - rb), ra*rc - rb > 0),
  435. (log(-sqrt(-ra*rc + rb) + sqrt(ra*x + rb))/(2*sqrt(-ra*rc + rb)) -
  436. log(sqrt(-ra*rc + rb) + sqrt(ra*x + rb))/(2*sqrt(-ra*rc + rb)), True)) +
  437. 2*sqrt(ra*x + rb), Ne(ra, 0)), (sqrt(rb)*log(rc + x), True))
  438. 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)
  439. assert manualintegrate(sqrt(2*x + 3) / 2 * x, x) == (2*x + 3)**Rational(5, 2)/20 - (2*x + 3)**Rational(3, 2)/4
  440. assert manualintegrate(x**Rational(3,2) * log(x), x) == 2*x**Rational(5,2)*log(x)/5 - 4*x**Rational(5,2)/25
  441. assert manualintegrate(x**(-3) * log(x), x) == -log(x)/(2*x**2) - 1/(4*x**2)
  442. assert manualintegrate(log(y)/(y**2*(1 - 1/y)), y) == \
  443. log(y)*log(-1 + 1/y) - Integral(log(-1 + 1/y)/y, y)
  444. def test_issue_12899():
  445. assert manualintegrate(f(x,y).diff(x),y) == Integral(Derivative(f(x,y),x),y)
  446. assert manualintegrate(f(x,y).diff(y).diff(x),y) == Derivative(f(x,y),x)
  447. def test_constant_independent_of_symbol():
  448. assert manualintegrate(Integral(y, (x, 1, 2)), x) == \
  449. x*Integral(y, (x, 1, 2))
  450. def test_issue_12641():
  451. assert manualintegrate(sin(2*x), x) == -cos(2*x)/2
  452. assert manualintegrate(cos(x)*sin(2*x), x) == -2*cos(x)**3/3
  453. assert manualintegrate((sin(2*x)*cos(x))/(1 + cos(x)), x) == \
  454. -2*log(cos(x) + 1) - cos(x)**2 + 2*cos(x)
  455. @slow
  456. def test_issue_13297():
  457. assert manualintegrate(sin(x) * cos(x)**5, x) == -cos(x)**6 / 6
  458. def test_issue_14470():
  459. assert_is_integral_of(1/(x*sqrt(x + 1)), log(sqrt(x + 1) - 1) - log(sqrt(x + 1) + 1))
  460. @slow
  461. def test_issue_9858():
  462. assert manualintegrate(exp(x)*cos(exp(x)), x) == sin(exp(x))
  463. assert manualintegrate(exp(2*x)*cos(exp(x)), x) == \
  464. exp(x)*sin(exp(x)) + cos(exp(x))
  465. res = manualintegrate(exp(10*x)*sin(exp(x)), x)
  466. assert not res.has(Integral)
  467. assert res.diff(x) == exp(10*x)*sin(exp(x))
  468. # an example with many similar integrations by parts
  469. assert manualintegrate(sum(x*exp(k*x) for k in range(1, 8)), x) == (
  470. x*exp(7*x)/7 + x*exp(6*x)/6 + x*exp(5*x)/5 + x*exp(4*x)/4 +
  471. x*exp(3*x)/3 + x*exp(2*x)/2 + x*exp(x) - exp(7*x)/49 -exp(6*x)/36 -
  472. exp(5*x)/25 - exp(4*x)/16 - exp(3*x)/9 - exp(2*x)/4 - exp(x))
  473. def test_issue_8520():
  474. assert manualintegrate(x/(x**4 + 1), x) == atan(x**2)/2
  475. assert manualintegrate(x**2/(x**6 + 25), x) == atan(x**3/5)/15
  476. f = x/(9*x**4 + 4)**2
  477. assert manualintegrate(f, x).diff(x).factor() == f
  478. def test_manual_subs():
  479. x, y = symbols('x y')
  480. expr = log(x) + exp(x)
  481. # if log(x) is y, then exp(y) is x
  482. assert manual_subs(expr, log(x), y) == y + exp(exp(y))
  483. # if exp(x) is y, then log(y) need not be x
  484. assert manual_subs(expr, exp(x), y) == log(x) + y
  485. raises(ValueError, lambda: manual_subs(expr, x))
  486. raises(ValueError, lambda: manual_subs(expr, exp(x), x, y))
  487. @slow
  488. def test_issue_15471():
  489. f = log(x)*cos(log(x))/x**Rational(3, 4)
  490. 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)
  491. assert_is_integral_of(f, F)
  492. def test_quadratic_denom():
  493. f = (5*x + 2)/(3*x**2 - 2*x + 8)
  494. 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
  495. g = 3/(2*x**2 + 3*x + 1)
  496. assert manualintegrate(g, x) == 3*log(4*x + 2) - 3*log(4*x + 4)
  497. def test_issue_22757():
  498. assert manualintegrate(sin(x), y) == y * sin(x)
  499. def test_issue_23348():
  500. steps = integral_steps(tan(x), x)
  501. constant_times_step = steps.substep.substep
  502. assert constant_times_step.integrand == constant_times_step.constant * constant_times_step.other
  503. def test_issue_23566():
  504. i = Integral(1/sqrt(x**2 - 1), (x, -2, -1)).doit(manual=True)
  505. assert i == -log(4 - 2*sqrt(3)) + log(2)
  506. assert str(i.n()) == '1.31695789692482'
  507. def test_issue_25093():
  508. ap = Symbol('ap', positive=True)
  509. an = Symbol('an', negative=True)
  510. assert manualintegrate(exp(a*x**2 + b), x) == sqrt(pi)*exp(b)*erfi(sqrt(a)*x)/(2*sqrt(a))
  511. assert manualintegrate(exp(ap*x**2 + b), x) == sqrt(pi)*exp(b)*erfi(sqrt(ap)*x)/(2*sqrt(ap))
  512. assert manualintegrate(exp(an*x**2 + b), x) == -sqrt(pi)*exp(b)*erf(an*x/sqrt(-an))/(2*sqrt(-an))
  513. assert manualintegrate(sin(a*x**2 + b), x) == (
  514. sqrt(2)*sqrt(pi)*(sin(b)*fresnelc(sqrt(2)*sqrt(a)*x/sqrt(pi))
  515. + cos(b)*fresnels(sqrt(2)*sqrt(a)*x/sqrt(pi)))/(2*sqrt(a)))
  516. assert manualintegrate(cos(a*x**2 + b), x) == (
  517. sqrt(2)*sqrt(pi)*(-sin(b)*fresnels(sqrt(2)*sqrt(a)*x/sqrt(pi))
  518. + cos(b)*fresnelc(sqrt(2)*sqrt(a)*x/sqrt(pi)))/(2*sqrt(a)))
  519. def test_nested_pow():
  520. assert_is_integral_of(sqrt(x**2), x*sqrt(x**2)/2)
  521. assert_is_integral_of(sqrt(x**(S(5)/3)), 6*x*sqrt(x**(S(5)/3))/11)
  522. assert_is_integral_of(1/sqrt(x**2), x*log(x)/sqrt(x**2))
  523. assert_is_integral_of(x*sqrt(x**(-4)), x**2*sqrt(x**-4)*log(x))
  524. f = (c*(a+b*x)**d)**e
  525. F1 = (c*(a + b*x)**d)**e*(a/b + x)/(d*e + 1)
  526. F2 = (c*(a + b*x)**d)**e*(a/b + x)*log(a/b + x)
  527. assert manualintegrate(f, x) == \
  528. Piecewise((Piecewise((F1, Ne(d*e, -1)), (F2, True)), Ne(b, 0)), (x*(a**d*c)**e, True))
  529. assert F1.diff(x).equals(f)
  530. assert F2.diff(x).subs(d*e, -1).equals(f)
  531. def test_manualintegrate_sqrt_linear():
  532. assert_is_integral_of((5*x**3+4)/sqrt(2+3*x),
  533. 10*(3*x + 2)**(S(7)/2)/567 - 4*(3*x + 2)**(S(5)/2)/27 +
  534. 40*(3*x + 2)**(S(3)/2)/81 + 136*sqrt(3*x + 2)/81)
  535. assert manualintegrate(x/sqrt(a+b*x)**3, x) == \
  536. 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))
  537. assert_is_integral_of((sqrt(3*x+3)+1)/((2*x+2)**(1/S(3))+1),
  538. 3*sqrt(6)*(2*x + 2)**(S(7)/6)/14 - 3*sqrt(6)*(2*x + 2)**(S(5)/6)/10 -
  539. 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 +
  540. sqrt(6)*sqrt(2*x + 2)/2 + 3*log((2*x + 2)**(S.One/3) + 1)/2 +
  541. 3*sqrt(6)*atan((2*x + 2)**(S.One/6))/2)
  542. assert_is_integral_of(sqrt(x+sqrt(x)),
  543. 2*sqrt(sqrt(x) + x)*(sqrt(x)/12 + x/3 - S(1)/8) + log(2*sqrt(x) + 2*sqrt(sqrt(x) + x) + 1)/8)
  544. assert_is_integral_of(sqrt(2*x+3+sqrt(4*x+5))**3,
  545. sqrt(2*x + sqrt(4*x + 5) + 3) *
  546. (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)
  547. def test_manualintegrate_sqrt_quadratic():
  548. assert_is_integral_of(1/sqrt((x - I)**2-1), log(2*x + 2*sqrt(x**2 - 2*I*x - 2) - 2*I))
  549. assert_is_integral_of(1/sqrt(3*x**2+4*x+5), sqrt(3)*asinh(3*sqrt(11)*(x + S(2)/3)/11)/3)
  550. assert_is_integral_of(1/sqrt(-3*x**2+4*x+5), sqrt(3)*asin(3*sqrt(19)*(x - S(2)/3)/19)/3)
  551. 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)
  552. 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)))
  553. assert manualintegrate(1/sqrt(a+b*x+c*x**2), x) == \
  554. 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)),
  555. ((b/(2*c) + x)*log(b/(2*c) + x)/sqrt(c*(b/(2*c) + x)**2), Ne(c, 0)),
  556. (2*sqrt(a + b*x)/b, Ne(b, 0)), (x/sqrt(a), True))
  557. assert_is_integral_of((7*x+6)/sqrt(3*x**2+4*x+5),
  558. 7*sqrt(3*x**2 + 4*x + 5)/3 + 4*sqrt(3)*asinh(3*sqrt(11)*(x + S(2)/3)/11)/9)
  559. assert_is_integral_of((7*x+6)/sqrt(-3*x**2+4*x+5),
  560. -7*sqrt(-3*x**2 + 4*x + 5)/3 + 32*sqrt(3)*asin(3*sqrt(19)*(x - S(2)/3)/19)/9)
  561. assert_is_integral_of((7*x+6)/sqrt(3*x**2+4*x-5),
  562. 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)
  563. assert manualintegrate((d+e*x)/sqrt(a+b*x+c*x**2), x) == \
  564. Piecewise(((-b*e/(2*c) + d) *
  565. 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)),
  566. ((b/(2*c) + x)*log(b/(2*c) + x)/sqrt(c*(b/(2*c) + x)**2), True)) +
  567. e*sqrt(a + b*x + c*x**2)/c, Ne(c, 0)),
  568. ((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)),
  569. ((d*x + e*x**2/2)/sqrt(a), True))
  570. assert manualintegrate((3*x**3-x**2+2*x-4)/sqrt(x**2-3*x+2), x) == \
  571. 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
  572. assert_is_integral_of(sqrt(53225*x**2-66732*x+23013),
  573. (x/2 - S(16683)/53225)*sqrt(53225*x**2 - 66732*x + 23013) +
  574. 111576969*sqrt(2129)*asinh(53225*x/10563 - S(11122)/3521)/1133160250)
  575. assert manualintegrate(sqrt(a+c*x**2), x) == \
  576. Piecewise((a*Piecewise((log(2*sqrt(c)*sqrt(a + c*x**2) + 2*c*x)/sqrt(c), Ne(a, 0)),
  577. (x*log(x)/sqrt(c*x**2), True))/2 + x*sqrt(a + c*x**2)/2, Ne(c, 0)),
  578. (sqrt(a)*x, True))
  579. assert manualintegrate(sqrt(a+b*x+c*x**2), x) == \
  580. Piecewise(((a/2 - b**2/(8*c)) *
  581. 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)),
  582. ((b/(2*c) + x)*log(b/(2*c) + x)/sqrt(c*(b/(2*c) + x)**2), True)) +
  583. (b/(4*c) + x/2)*sqrt(a + b*x + c*x**2), Ne(c, 0)),
  584. (2*(a + b*x)**(S(3)/2)/(3*b), Ne(b, 0)),
  585. (sqrt(a)*x, True))
  586. assert_is_integral_of(x*sqrt(x**2+2*x+4),
  587. (x**2/3 + x/6 + S(5)/6)*sqrt(x**2 + 2*x + 4) - 3*asinh(sqrt(3)*(x + 1)/3)/2)
  588. def test_mul_pow_derivative():
  589. assert_is_integral_of(x*sec(x)*tan(x), x*sec(x) - log(tan(x) + sec(x)))
  590. assert_is_integral_of(x*sec(x)**2, x*tan(x) + log(cos(x)))
  591. assert_is_integral_of(x**3*Derivative(f(x), (x, 4)),
  592. x**3*Derivative(f(x), (x, 3)) - 3*x**2*Derivative(f(x), (x, 2)) +
  593. 6*x*Derivative(f(x), x) - 6*f(x))