m2m模型翻译
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

557 lines
26 KiB

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