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.

475 lines
16 KiB

6 months ago
  1. from sympy.core import EulerGamma
  2. from sympy.core.numbers import (E, I, Integer, Rational, oo, pi)
  3. from sympy.core.singleton import S
  4. from sympy.core.symbol import Symbol
  5. from sympy.functions.elementary.exponential import (exp, log)
  6. from sympy.functions.elementary.miscellaneous import sqrt
  7. from sympy.functions.elementary.trigonometric import (acot, atan, cos, sin)
  8. from sympy.functions.special.error_functions import (Ei, erf)
  9. from sympy.functions.special.gamma_functions import (digamma, gamma, loggamma)
  10. from sympy.functions.special.zeta_functions import zeta
  11. from sympy.polys.polytools import cancel
  12. from sympy.functions.elementary.hyperbolic import cosh, coth, sinh, tanh
  13. from sympy.series.gruntz import compare, mrv, rewrite, mrv_leadterm, gruntz, \
  14. sign
  15. from sympy.testing.pytest import XFAIL, skip, slow
  16. """
  17. This test suite is testing the limit algorithm using the bottom up approach.
  18. See the documentation in limits2.py. The algorithm itself is highly recursive
  19. by nature, so "compare" is logically the lowest part of the algorithm, yet in
  20. some sense it's the most complex part, because it needs to calculate a limit
  21. to return the result.
  22. Nevertheless, the rest of the algorithm depends on compare working correctly.
  23. """
  24. x = Symbol('x', real=True)
  25. m = Symbol('m', real=True)
  26. runslow = False
  27. def _sskip():
  28. if not runslow:
  29. skip("slow")
  30. @slow
  31. def test_gruntz_evaluation():
  32. # Gruntz' thesis pp. 122 to 123
  33. # 8.1
  34. assert gruntz(exp(x)*(exp(1/x - exp(-x)) - exp(1/x)), x, oo) == -1
  35. # 8.2
  36. assert gruntz(exp(x)*(exp(1/x + exp(-x) + exp(-x**2))
  37. - exp(1/x - exp(-exp(x)))), x, oo) == 1
  38. # 8.3
  39. assert gruntz(exp(exp(x - exp(-x))/(1 - 1/x)) - exp(exp(x)), x, oo) is oo
  40. # 8.5
  41. assert gruntz(exp(exp(exp(x + exp(-x)))) / exp(exp(exp(x))), x, oo) is oo
  42. # 8.6
  43. assert gruntz(exp(exp(exp(x))) / exp(exp(exp(x - exp(-exp(x))))),
  44. x, oo) is oo
  45. # 8.7
  46. assert gruntz(exp(exp(exp(x))) / exp(exp(exp(x - exp(-exp(exp(x)))))),
  47. x, oo) == 1
  48. # 8.8
  49. assert gruntz(exp(exp(x)) / exp(exp(x - exp(-exp(exp(x))))), x, oo) == 1
  50. # 8.9
  51. assert gruntz(log(x)**2 * exp(sqrt(log(x))*(log(log(x)))**2
  52. * exp(sqrt(log(log(x))) * (log(log(log(x))))**3)) / sqrt(x),
  53. x, oo) == 0
  54. # 8.10
  55. assert gruntz((x*log(x)*(log(x*exp(x) - x**2))**2)
  56. / (log(log(x**2 + 2*exp(exp(3*x**3*log(x)))))), x, oo) == Rational(1, 3)
  57. # 8.11
  58. assert gruntz((exp(x*exp(-x)/(exp(-x) + exp(-2*x**2/(x + 1)))) - exp(x))/x,
  59. x, oo) == -exp(2)
  60. # 8.12
  61. assert gruntz((3**x + 5**x)**(1/x), x, oo) == 5
  62. # 8.13
  63. assert gruntz(x/log(x**(log(x**(log(2)/log(x))))), x, oo) is oo
  64. # 8.14
  65. assert gruntz(exp(exp(2*log(x**5 + x)*log(log(x))))
  66. / exp(exp(10*log(x)*log(log(x)))), x, oo) is oo
  67. # 8.15
  68. assert gruntz(exp(exp(Rational(5, 2)*x**Rational(-5, 7) + Rational(21, 8)*x**Rational(6, 11)
  69. + 2*x**(-8) + Rational(54, 17)*x**Rational(49, 45)))**8
  70. / log(log(-log(Rational(4, 3)*x**Rational(-5, 14))))**Rational(7, 6), x, oo) is oo
  71. # 8.16
  72. assert gruntz((exp(4*x*exp(-x)/(1/exp(x) + 1/exp(2*x**2/(x + 1)))) - exp(x))
  73. / exp(x)**4, x, oo) == 1
  74. # 8.17
  75. assert gruntz(exp(x*exp(-x)/(exp(-x) + exp(-2*x**2/(x + 1))))/exp(x), x, oo) \
  76. == 1
  77. # 8.19
  78. assert gruntz(log(x)*(log(log(x) + log(log(x))) - log(log(x)))
  79. / (log(log(x) + log(log(log(x))))), x, oo) == 1
  80. # 8.20
  81. assert gruntz(exp((log(log(x + exp(log(x)*log(log(x))))))
  82. / (log(log(log(exp(x) + x + log(x)))))), x, oo) == E
  83. # Another
  84. assert gruntz(exp(exp(exp(x + exp(-x)))) / exp(exp(x)), x, oo) is oo
  85. def test_gruntz_evaluation_slow():
  86. _sskip()
  87. # 8.4
  88. assert gruntz(exp(exp(exp(x)/(1 - 1/x)))
  89. - exp(exp(exp(x)/(1 - 1/x - log(x)**(-log(x))))), x, oo) is -oo
  90. # 8.18
  91. assert gruntz((exp(exp(-x/(1 + exp(-x))))*exp(-x/(1 + exp(-x/(1 + exp(-x)))))
  92. *exp(exp(-x + exp(-x/(1 + exp(-x))))))
  93. / (exp(-x/(1 + exp(-x))))**2 - exp(x) + x, x, oo) == 2
  94. @slow
  95. def test_gruntz_eval_special():
  96. # Gruntz, p. 126
  97. assert gruntz(exp(x)*(sin(1/x + exp(-x)) - sin(1/x + exp(-x**2))), x, oo) == 1
  98. assert gruntz((erf(x - exp(-exp(x))) - erf(x)) * exp(exp(x)) * exp(x**2),
  99. x, oo) == -2/sqrt(pi)
  100. assert gruntz(exp(exp(x)) * (exp(sin(1/x + exp(-exp(x)))) - exp(sin(1/x))),
  101. x, oo) == 1
  102. assert gruntz(exp(x)*(gamma(x + exp(-x)) - gamma(x)), x, oo) is oo
  103. assert gruntz(exp(exp(digamma(digamma(x))))/x, x, oo) == exp(Rational(-1, 2))
  104. assert gruntz(exp(exp(digamma(log(x))))/x, x, oo) == exp(Rational(-1, 2))
  105. assert gruntz(digamma(digamma(digamma(x))), x, oo) is oo
  106. assert gruntz(loggamma(loggamma(x)), x, oo) is oo
  107. assert gruntz(((gamma(x + 1/gamma(x)) - gamma(x))/log(x) - cos(1/x))
  108. * x*log(x), x, oo) == Rational(-1, 2)
  109. assert gruntz(x * (gamma(x - 1/gamma(x)) - gamma(x) + log(x)), x, oo) \
  110. == S.Half
  111. assert gruntz((gamma(x + 1/gamma(x)) - gamma(x)) / log(x), x, oo) == 1
  112. def test_gruntz_eval_special_slow():
  113. _sskip()
  114. assert gruntz(gamma(x + 1)/sqrt(2*pi)
  115. - exp(-x)*(x**(x + S.Half) + x**(x - S.Half)/12), x, oo) is oo
  116. assert gruntz(exp(exp(exp(digamma(digamma(digamma(x))))))/x, x, oo) == 0
  117. @XFAIL
  118. def test_grunts_eval_special_slow_sometimes_fail():
  119. _sskip()
  120. # XXX This sometimes fails!!!
  121. assert gruntz(exp(gamma(x - exp(-x))*exp(1/x)) - exp(gamma(x)), x, oo) is oo
  122. def test_gruntz_Ei():
  123. assert gruntz((Ei(x - exp(-exp(x))) - Ei(x)) *exp(-x)*exp(exp(x))*x, x, oo) == -1
  124. @XFAIL
  125. def test_gruntz_eval_special_fail():
  126. # TODO zeta function series
  127. assert gruntz(
  128. exp((log(2) + 1)*x) * (zeta(x + exp(-x)) - zeta(x)), x, oo) == -log(2)
  129. # TODO 8.35 - 8.37 (bessel, max-min)
  130. def test_gruntz_hyperbolic():
  131. assert gruntz(cosh(x), x, oo) is oo
  132. assert gruntz(cosh(x), x, -oo) is oo
  133. assert gruntz(sinh(x), x, oo) is oo
  134. assert gruntz(sinh(x), x, -oo) is -oo
  135. assert gruntz(2*cosh(x)*exp(x), x, oo) is oo
  136. assert gruntz(2*cosh(x)*exp(x), x, -oo) == 1
  137. assert gruntz(2*sinh(x)*exp(x), x, oo) is oo
  138. assert gruntz(2*sinh(x)*exp(x), x, -oo) == -1
  139. assert gruntz(tanh(x), x, oo) == 1
  140. assert gruntz(tanh(x), x, -oo) == -1
  141. assert gruntz(coth(x), x, oo) == 1
  142. assert gruntz(coth(x), x, -oo) == -1
  143. def test_compare1():
  144. assert compare(2, x, x) == "<"
  145. assert compare(x, exp(x), x) == "<"
  146. assert compare(exp(x), exp(x**2), x) == "<"
  147. assert compare(exp(x**2), exp(exp(x)), x) == "<"
  148. assert compare(1, exp(exp(x)), x) == "<"
  149. assert compare(x, 2, x) == ">"
  150. assert compare(exp(x), x, x) == ">"
  151. assert compare(exp(x**2), exp(x), x) == ">"
  152. assert compare(exp(exp(x)), exp(x**2), x) == ">"
  153. assert compare(exp(exp(x)), 1, x) == ">"
  154. assert compare(2, 3, x) == "="
  155. assert compare(3, -5, x) == "="
  156. assert compare(2, -5, x) == "="
  157. assert compare(x, x**2, x) == "="
  158. assert compare(x**2, x**3, x) == "="
  159. assert compare(x**3, 1/x, x) == "="
  160. assert compare(1/x, x**m, x) == "="
  161. assert compare(x**m, -x, x) == "="
  162. assert compare(exp(x), exp(-x), x) == "="
  163. assert compare(exp(-x), exp(2*x), x) == "="
  164. assert compare(exp(2*x), exp(x)**2, x) == "="
  165. assert compare(exp(x)**2, exp(x + exp(-x)), x) == "="
  166. assert compare(exp(x), exp(x + exp(-x)), x) == "="
  167. assert compare(exp(x**2), 1/exp(x**2), x) == "="
  168. def test_compare2():
  169. assert compare(exp(x), x**5, x) == ">"
  170. assert compare(exp(x**2), exp(x)**2, x) == ">"
  171. assert compare(exp(x), exp(x + exp(-x)), x) == "="
  172. assert compare(exp(x + exp(-x)), exp(x), x) == "="
  173. assert compare(exp(x + exp(-x)), exp(-x), x) == "="
  174. assert compare(exp(-x), x, x) == ">"
  175. assert compare(x, exp(-x), x) == "<"
  176. assert compare(exp(x + 1/x), x, x) == ">"
  177. assert compare(exp(-exp(x)), exp(x), x) == ">"
  178. assert compare(exp(exp(-exp(x)) + x), exp(-exp(x)), x) == "<"
  179. def test_compare3():
  180. assert compare(exp(exp(x)), exp(x + exp(-exp(x))), x) == ">"
  181. def test_sign1():
  182. assert sign(Rational(0), x) == 0
  183. assert sign(Rational(3), x) == 1
  184. assert sign(Rational(-5), x) == -1
  185. assert sign(log(x), x) == 1
  186. assert sign(exp(-x), x) == 1
  187. assert sign(exp(x), x) == 1
  188. assert sign(-exp(x), x) == -1
  189. assert sign(3 - 1/x, x) == 1
  190. assert sign(-3 - 1/x, x) == -1
  191. assert sign(sin(1/x), x) == 1
  192. assert sign((x**Integer(2)), x) == 1
  193. assert sign(x**2, x) == 1
  194. assert sign(x**5, x) == 1
  195. def test_sign2():
  196. assert sign(x, x) == 1
  197. assert sign(-x, x) == -1
  198. y = Symbol("y", positive=True)
  199. assert sign(y, x) == 1
  200. assert sign(-y, x) == -1
  201. assert sign(y*x, x) == 1
  202. assert sign(-y*x, x) == -1
  203. def mmrv(a, b):
  204. return set(mrv(a, b)[0].keys())
  205. def test_mrv1():
  206. assert mmrv(x, x) == {x}
  207. assert mmrv(x + 1/x, x) == {x}
  208. assert mmrv(x**2, x) == {x}
  209. assert mmrv(log(x), x) == {x}
  210. assert mmrv(exp(x), x) == {exp(x)}
  211. assert mmrv(exp(-x), x) == {exp(-x)}
  212. assert mmrv(exp(x**2), x) == {exp(x**2)}
  213. assert mmrv(-exp(1/x), x) == {x}
  214. assert mmrv(exp(x + 1/x), x) == {exp(x + 1/x)}
  215. def test_mrv2a():
  216. assert mmrv(exp(x + exp(-exp(x))), x) == {exp(-exp(x))}
  217. assert mmrv(exp(x + exp(-x)), x) == {exp(x + exp(-x)), exp(-x)}
  218. assert mmrv(exp(1/x + exp(-x)), x) == {exp(-x)}
  219. #sometimes infinite recursion due to log(exp(x**2)) not simplifying
  220. def test_mrv2b():
  221. assert mmrv(exp(x + exp(-x**2)), x) == {exp(-x**2)}
  222. #sometimes infinite recursion due to log(exp(x**2)) not simplifying
  223. def test_mrv2c():
  224. assert mmrv(
  225. exp(-x + 1/x**2) - exp(x + 1/x), x) == {exp(x + 1/x), exp(1/x**2 - x)}
  226. #sometimes infinite recursion due to log(exp(x**2)) not simplifying
  227. def test_mrv3():
  228. assert mmrv(exp(x**2) + x*exp(x) + log(x)**x/x, x) == {exp(x**2)}
  229. assert mmrv(
  230. exp(x)*(exp(1/x + exp(-x)) - exp(1/x)), x) == {exp(x), exp(-x)}
  231. assert mmrv(log(
  232. x**2 + 2*exp(exp(3*x**3*log(x)))), x) == {exp(exp(3*x**3*log(x)))}
  233. assert mmrv(log(x - log(x))/log(x), x) == {x}
  234. assert mmrv(
  235. (exp(1/x - exp(-x)) - exp(1/x))*exp(x), x) == {exp(x), exp(-x)}
  236. assert mmrv(
  237. 1/exp(-x + exp(-x)) - exp(x), x) == {exp(x), exp(-x), exp(x - exp(-x))}
  238. assert mmrv(log(log(x*exp(x*exp(x)) + 1)), x) == {exp(x*exp(x))}
  239. assert mmrv(exp(exp(log(log(x) + 1/x))), x) == {x}
  240. def test_mrv4():
  241. ln = log
  242. assert mmrv((ln(ln(x) + ln(ln(x))) - ln(ln(x)))/ln(ln(x) + ln(ln(ln(x))))*ln(x),
  243. x) == {x}
  244. assert mmrv(log(log(x*exp(x*exp(x)) + 1)) - exp(exp(log(log(x) + 1/x))), x) == \
  245. {exp(x*exp(x))}
  246. def mrewrite(a, b, c):
  247. return rewrite(a[1], a[0], b, c)
  248. def test_rewrite1():
  249. e = exp(x)
  250. assert mrewrite(mrv(e, x), x, m) == (1/m, -x)
  251. e = exp(x**2)
  252. assert mrewrite(mrv(e, x), x, m) == (1/m, -x**2)
  253. e = exp(x + 1/x)
  254. assert mrewrite(mrv(e, x), x, m) == (1/m, -x - 1/x)
  255. e = 1/exp(-x + exp(-x)) - exp(x)
  256. assert mrewrite(mrv(e, x), x, m) == (1/(m*exp(m)) - 1/m, -x)
  257. def test_rewrite2():
  258. e = exp(x)*log(log(exp(x)))
  259. assert mmrv(e, x) == {exp(x)}
  260. assert mrewrite(mrv(e, x), x, m) == (1/m*log(x), -x)
  261. #sometimes infinite recursion due to log(exp(x**2)) not simplifying
  262. def test_rewrite3():
  263. e = exp(-x + 1/x**2) - exp(x + 1/x)
  264. #both of these are correct and should be equivalent:
  265. assert mrewrite(mrv(e, x), x, m) in [(-1/m + m*exp(
  266. 1/x + 1/x**2), -x - 1/x), (m - 1/m*exp(1/x + x**(-2)), x**(-2) - x)]
  267. def test_mrv_leadterm1():
  268. assert mrv_leadterm(-exp(1/x), x) == (-1, 0)
  269. assert mrv_leadterm(1/exp(-x + exp(-x)) - exp(x), x) == (-1, 0)
  270. assert mrv_leadterm(
  271. (exp(1/x - exp(-x)) - exp(1/x))*exp(x), x) == (-exp(1/x), 0)
  272. def test_mrv_leadterm2():
  273. #Gruntz: p51, 3.25
  274. assert mrv_leadterm((log(exp(x) + x) - x)/log(exp(x) + log(x))*exp(x), x) == \
  275. (1, 0)
  276. def test_mrv_leadterm3():
  277. #Gruntz: p56, 3.27
  278. assert mmrv(exp(-x + exp(-x)*exp(-x*log(x))), x) == {exp(-x - x*log(x))}
  279. assert mrv_leadterm(exp(-x + exp(-x)*exp(-x*log(x))), x) == (exp(-x), 0)
  280. def test_limit1():
  281. assert gruntz(x, x, oo) is oo
  282. assert gruntz(x, x, -oo) is -oo
  283. assert gruntz(-x, x, oo) is -oo
  284. assert gruntz(x**2, x, -oo) is oo
  285. assert gruntz(-x**2, x, oo) is -oo
  286. assert gruntz(x*log(x), x, 0, dir="+") == 0
  287. assert gruntz(1/x, x, oo) == 0
  288. assert gruntz(exp(x), x, oo) is oo
  289. assert gruntz(-exp(x), x, oo) is -oo
  290. assert gruntz(exp(x)/x, x, oo) is oo
  291. assert gruntz(1/x - exp(-x), x, oo) == 0
  292. assert gruntz(x + 1/x, x, oo) is oo
  293. def test_limit2():
  294. assert gruntz(x**x, x, 0, dir="+") == 1
  295. assert gruntz((exp(x) - 1)/x, x, 0) == 1
  296. assert gruntz(1 + 1/x, x, oo) == 1
  297. assert gruntz(-exp(1/x), x, oo) == -1
  298. assert gruntz(x + exp(-x), x, oo) is oo
  299. assert gruntz(x + exp(-x**2), x, oo) is oo
  300. assert gruntz(x + exp(-exp(x)), x, oo) is oo
  301. assert gruntz(13 + 1/x - exp(-x), x, oo) == 13
  302. def test_limit3():
  303. a = Symbol('a')
  304. assert gruntz(x - log(1 + exp(x)), x, oo) == 0
  305. assert gruntz(x - log(a + exp(x)), x, oo) == 0
  306. assert gruntz(exp(x)/(1 + exp(x)), x, oo) == 1
  307. assert gruntz(exp(x)/(a + exp(x)), x, oo) == 1
  308. def test_limit4():
  309. #issue 3463
  310. assert gruntz((3**x + 5**x)**(1/x), x, oo) == 5
  311. #issue 3463
  312. assert gruntz((3**(1/x) + 5**(1/x))**x, x, 0) == 5
  313. @XFAIL
  314. def test_MrvTestCase_page47_ex3_21():
  315. h = exp(-x/(1 + exp(-x)))
  316. expr = exp(h)*exp(-x/(1 + h))*exp(exp(-x + h))/h**2 - exp(x) + x
  317. assert mmrv(expr, x) == {1/h, exp(-x), exp(x), exp(x - h), exp(x/(1 + h))}
  318. def test_gruntz_I():
  319. y = Symbol("y")
  320. assert gruntz(I*x, x, oo) == I*oo
  321. assert gruntz(y*I*x, x, oo) == y*I*oo
  322. assert gruntz(y*3*I*x, x, oo) == y*I*oo
  323. assert gruntz(y*3*sin(I)*x, x, oo) == y*I*oo
  324. def test_issue_4814():
  325. assert gruntz((x + 1)**(1/log(x + 1)), x, oo) == E
  326. def test_intractable():
  327. assert gruntz(1/gamma(x), x, oo) == 0
  328. assert gruntz(1/loggamma(x), x, oo) == 0
  329. assert gruntz(gamma(x)/loggamma(x), x, oo) is oo
  330. assert gruntz(exp(gamma(x))/gamma(x), x, oo) is oo
  331. assert gruntz(gamma(x), x, 3) == 2
  332. assert gruntz(gamma(Rational(1, 7) + 1/x), x, oo) == gamma(Rational(1, 7))
  333. assert gruntz(log(x**x)/log(gamma(x)), x, oo) == 1
  334. assert gruntz(log(gamma(gamma(x)))/exp(x), x, oo) is oo
  335. def test_aseries_trig():
  336. assert cancel(gruntz(1/log(atan(x)), x, oo)
  337. - 1/(log(pi) + log(S.Half))) == 0
  338. assert gruntz(1/acot(x), x, -oo) is -oo
  339. def test_exp_log_series():
  340. assert gruntz(x/log(log(x*exp(x))), x, oo) is oo
  341. def test_issue_3644():
  342. assert gruntz(((x**7 + x + 1)/(2**x + x**2))**(-1/x), x, oo) == 2
  343. def test_issue_6843():
  344. n = Symbol('n', integer=True, positive=True)
  345. r = (n + 1)*x**(n + 1)/(x**(n + 1) - 1) - x/(x - 1)
  346. assert gruntz(r, x, 1).simplify() == n/2
  347. def test_issue_4190():
  348. assert gruntz(x - gamma(1/x), x, oo) == S.EulerGamma
  349. @XFAIL
  350. def test_issue_5172():
  351. n = Symbol('n')
  352. r = Symbol('r', positive=True)
  353. c = Symbol('c')
  354. p = Symbol('p', positive=True)
  355. m = Symbol('m', negative=True)
  356. expr = ((2*n*(n - r + 1)/(n + r*(n - r + 1)))**c + \
  357. (r - 1)*(n*(n - r + 2)/(n + r*(n - r + 1)))**c - n)/(n**c - n)
  358. expr = expr.subs(c, c + 1)
  359. assert gruntz(expr.subs(c, m), n, oo) == 1
  360. # fail:
  361. assert gruntz(expr.subs(c, p), n, oo).simplify() == \
  362. (2**(p + 1) + r - 1)/(r + 1)**(p + 1)
  363. def test_issue_4109():
  364. assert gruntz(1/gamma(x), x, 0) == 0
  365. assert gruntz(x*gamma(x), x, 0) == 1
  366. def test_issue_6682():
  367. assert gruntz(exp(2*Ei(-x))/x**2, x, 0) == exp(2*EulerGamma)
  368. def test_issue_7096():
  369. from sympy.functions import sign
  370. assert gruntz(x**-pi, x, 0, dir='-') == oo*sign((-1)**(-pi))