test_formal.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. from sympy.concrete.summations import Sum
  2. from sympy.core.add import Add
  3. from sympy.core.function import (Derivative, Function)
  4. from sympy.core.mul import Mul
  5. from sympy.core.numbers import (I, Rational, oo, pi)
  6. from sympy.core.singleton import S
  7. from sympy.core.symbol import symbols
  8. from sympy.functions.combinatorial.factorials import factorial
  9. from sympy.functions.elementary.exponential import (exp, log)
  10. from sympy.functions.elementary.hyperbolic import (acosh, asech)
  11. from sympy.functions.elementary.miscellaneous import sqrt
  12. from sympy.functions.elementary.trigonometric import (acos, asin, atan, cos, sin)
  13. from sympy.functions.special.bessel import airyai
  14. from sympy.functions.special.error_functions import erf
  15. from sympy.functions.special.gamma_functions import gamma
  16. from sympy.integrals.integrals import integrate
  17. from sympy.series.formal import fps
  18. from sympy.series.order import O
  19. from sympy.series.formal import (rational_algorithm, FormalPowerSeries,
  20. FormalPowerSeriesProduct, FormalPowerSeriesCompose,
  21. FormalPowerSeriesInverse, simpleDE,
  22. rational_independent, exp_re, hyper_re)
  23. from sympy.testing.pytest import raises, XFAIL, slow
  24. x, y, z = symbols('x y z')
  25. n, m, k = symbols('n m k', integer=True)
  26. f, r = Function('f'), Function('r')
  27. def test_rational_algorithm():
  28. f = 1 / ((x - 1)**2 * (x - 2))
  29. assert rational_algorithm(f, x, k) == \
  30. (-2**(-k - 1) + 1 - (factorial(k + 1) / factorial(k)), 0, 0)
  31. f = (1 + x + x**2 + x**3) / ((x - 1) * (x - 2))
  32. assert rational_algorithm(f, x, k) == \
  33. (-15*2**(-k - 1) + 4, x + 4, 0)
  34. f = z / (y*m - m*x - y*x + x**2)
  35. assert rational_algorithm(f, x, k) == \
  36. (((-y**(-k - 1)*z) / (y - m)) + ((m**(-k - 1)*z) / (y - m)), 0, 0)
  37. f = x / (1 - x - x**2)
  38. assert rational_algorithm(f, x, k) is None
  39. assert rational_algorithm(f, x, k, full=True) == \
  40. (((Rational(-1, 2) + sqrt(5)/2)**(-k - 1) *
  41. (-sqrt(5)/10 + S.Half)) +
  42. ((-sqrt(5)/2 - S.Half)**(-k - 1) *
  43. (sqrt(5)/10 + S.Half)), 0, 0)
  44. f = 1 / (x**2 + 2*x + 2)
  45. assert rational_algorithm(f, x, k) is None
  46. assert rational_algorithm(f, x, k, full=True) == \
  47. ((I*(-1 + I)**(-k - 1)) / 2 - (I*(-1 - I)**(-k - 1)) / 2, 0, 0)
  48. f = log(1 + x)
  49. assert rational_algorithm(f, x, k) == \
  50. (-(-1)**(-k) / k, 0, 1)
  51. f = atan(x)
  52. assert rational_algorithm(f, x, k) is None
  53. assert rational_algorithm(f, x, k, full=True) == \
  54. (((I*I**(-k)) / 2 - (I*(-I)**(-k)) / 2) / k, 0, 1)
  55. f = x*atan(x) - log(1 + x**2) / 2
  56. assert rational_algorithm(f, x, k) is None
  57. assert rational_algorithm(f, x, k, full=True) == \
  58. (((I*I**(-k + 1)) / 2 - (I*(-I)**(-k + 1)) / 2) /
  59. (k*(k - 1)), 0, 2)
  60. f = log((1 + x) / (1 - x)) / 2 - atan(x)
  61. assert rational_algorithm(f, x, k) is None
  62. assert rational_algorithm(f, x, k, full=True) == \
  63. ((-(-1)**(-k) / 2 - (I*I**(-k)) / 2 + (I*(-I)**(-k)) / 2 +
  64. S.Half) / k, 0, 1)
  65. assert rational_algorithm(cos(x), x, k) is None
  66. def test_rational_independent():
  67. ri = rational_independent
  68. assert ri([], x) == []
  69. assert ri([cos(x), sin(x)], x) == [cos(x), sin(x)]
  70. assert ri([x**2, sin(x), x*sin(x), x**3], x) == \
  71. [x**3 + x**2, x*sin(x) + sin(x)]
  72. assert ri([S.One, x*log(x), log(x), sin(x)/x, cos(x), sin(x), x], x) == \
  73. [x + 1, x*log(x) + log(x), sin(x)/x + sin(x), cos(x)]
  74. def test_simpleDE():
  75. # Tests just the first valid DE
  76. for DE in simpleDE(exp(x), x, f):
  77. assert DE == (-f(x) + Derivative(f(x), x), 1)
  78. break
  79. for DE in simpleDE(sin(x), x, f):
  80. assert DE == (f(x) + Derivative(f(x), x, x), 2)
  81. break
  82. for DE in simpleDE(log(1 + x), x, f):
  83. assert DE == ((x + 1)*Derivative(f(x), x, 2) + Derivative(f(x), x), 2)
  84. break
  85. for DE in simpleDE(asin(x), x, f):
  86. assert DE == (x*Derivative(f(x), x) + (x**2 - 1)*Derivative(f(x), x, x),
  87. 2)
  88. break
  89. for DE in simpleDE(exp(x)*sin(x), x, f):
  90. assert DE == (2*f(x) - 2*Derivative(f(x)) + Derivative(f(x), x, x), 2)
  91. break
  92. for DE in simpleDE(((1 + x)/(1 - x))**n, x, f):
  93. assert DE == (2*n*f(x) + (x**2 - 1)*Derivative(f(x), x), 1)
  94. break
  95. for DE in simpleDE(airyai(x), x, f):
  96. assert DE == (-x*f(x) + Derivative(f(x), x, x), 2)
  97. break
  98. def test_exp_re():
  99. d = -f(x) + Derivative(f(x), x)
  100. assert exp_re(d, r, k) == -r(k) + r(k + 1)
  101. d = f(x) + Derivative(f(x), x, x)
  102. assert exp_re(d, r, k) == r(k) + r(k + 2)
  103. d = f(x) + Derivative(f(x), x) + Derivative(f(x), x, x)
  104. assert exp_re(d, r, k) == r(k) + r(k + 1) + r(k + 2)
  105. d = Derivative(f(x), x) + Derivative(f(x), x, x)
  106. assert exp_re(d, r, k) == r(k) + r(k + 1)
  107. d = Derivative(f(x), x, 3) + Derivative(f(x), x, 4) + Derivative(f(x))
  108. assert exp_re(d, r, k) == r(k) + r(k + 2) + r(k + 3)
  109. def test_hyper_re():
  110. d = f(x) + Derivative(f(x), x, x)
  111. assert hyper_re(d, r, k) == r(k) + (k+1)*(k+2)*r(k + 2)
  112. d = -x*f(x) + Derivative(f(x), x, x)
  113. assert hyper_re(d, r, k) == (k + 2)*(k + 3)*r(k + 3) - r(k)
  114. d = 2*f(x) - 2*Derivative(f(x), x) + Derivative(f(x), x, x)
  115. assert hyper_re(d, r, k) == \
  116. (-2*k - 2)*r(k + 1) + (k + 1)*(k + 2)*r(k + 2) + 2*r(k)
  117. d = 2*n*f(x) + (x**2 - 1)*Derivative(f(x), x)
  118. assert hyper_re(d, r, k) == \
  119. k*r(k) + 2*n*r(k + 1) + (-k - 2)*r(k + 2)
  120. d = (x**10 + 4)*Derivative(f(x), x) + x*(x**10 - 1)*Derivative(f(x), x, x)
  121. assert hyper_re(d, r, k) == \
  122. (k*(k - 1) + k)*r(k) + (4*k - (k + 9)*(k + 10) + 40)*r(k + 10)
  123. d = ((x**2 - 1)*Derivative(f(x), x, 3) + 3*x*Derivative(f(x), x, x) +
  124. Derivative(f(x), x))
  125. assert hyper_re(d, r, k) == \
  126. ((k*(k - 2)*(k - 1) + 3*k*(k - 1) + k)*r(k) +
  127. (-k*(k + 1)*(k + 2))*r(k + 2))
  128. def test_fps():
  129. assert fps(1) == 1
  130. assert fps(2, x) == 2
  131. assert fps(2, x, dir='+') == 2
  132. assert fps(2, x, dir='-') == 2
  133. assert fps(1/x + 1/x**2) == 1/x + 1/x**2
  134. assert fps(log(1 + x), hyper=False, rational=False) == log(1 + x)
  135. f = fps(x**2 + x + 1)
  136. assert isinstance(f, FormalPowerSeries)
  137. assert f.function == x**2 + x + 1
  138. assert f[0] == 1
  139. assert f[2] == x**2
  140. assert f.truncate(4) == x**2 + x + 1 + O(x**4)
  141. assert f.polynomial() == x**2 + x + 1
  142. f = fps(log(1 + x))
  143. assert isinstance(f, FormalPowerSeries)
  144. assert f.function == log(1 + x)
  145. assert f.subs(x, y) == f
  146. assert f[:5] == [0, x, -x**2/2, x**3/3, -x**4/4]
  147. assert f.as_leading_term(x) == x
  148. assert f.polynomial(6) == x - x**2/2 + x**3/3 - x**4/4 + x**5/5
  149. k = f.ak.variables[0]
  150. assert f.infinite == Sum((-(-1)**(-k)*x**k)/k, (k, 1, oo))
  151. ft, s = f.truncate(n=None), f[:5]
  152. for i, t in enumerate(ft):
  153. if i == 5:
  154. break
  155. assert s[i] == t
  156. f = sin(x).fps(x)
  157. assert isinstance(f, FormalPowerSeries)
  158. assert f.truncate() == x - x**3/6 + x**5/120 + O(x**6)
  159. raises(NotImplementedError, lambda: fps(y*x))
  160. raises(ValueError, lambda: fps(x, dir=0))
  161. @slow
  162. def test_fps__rational():
  163. assert fps(1/x) == (1/x)
  164. assert fps((x**2 + x + 1) / x**3, dir=-1) == (x**2 + x + 1) / x**3
  165. f = 1 / ((x - 1)**2 * (x - 2))
  166. assert fps(f, x).truncate() == \
  167. (Rational(-1, 2) - x*Rational(5, 4) - 17*x**2/8 - 49*x**3/16 - 129*x**4/32 -
  168. 321*x**5/64 + O(x**6))
  169. f = (1 + x + x**2 + x**3) / ((x - 1) * (x - 2))
  170. assert fps(f, x).truncate() == \
  171. (S.Half + x*Rational(5, 4) + 17*x**2/8 + 49*x**3/16 + 113*x**4/32 +
  172. 241*x**5/64 + O(x**6))
  173. f = x / (1 - x - x**2)
  174. assert fps(f, x, full=True).truncate() == \
  175. x + x**2 + 2*x**3 + 3*x**4 + 5*x**5 + O(x**6)
  176. f = 1 / (x**2 + 2*x + 2)
  177. assert fps(f, x, full=True).truncate() == \
  178. S.Half - x/2 + x**2/4 - x**4/8 + x**5/8 + O(x**6)
  179. f = log(1 + x)
  180. assert fps(f, x).truncate() == \
  181. x - x**2/2 + x**3/3 - x**4/4 + x**5/5 + O(x**6)
  182. assert fps(f, x, dir=1).truncate() == fps(f, x, dir=-1).truncate()
  183. assert fps(f, x, 2).truncate() == \
  184. (log(3) - Rational(2, 3) - (x - 2)**2/18 + (x - 2)**3/81 -
  185. (x - 2)**4/324 + (x - 2)**5/1215 + x/3 + O((x - 2)**6, (x, 2)))
  186. assert fps(f, x, 2, dir=-1).truncate() == \
  187. (log(3) - Rational(2, 3) - (-x + 2)**2/18 - (-x + 2)**3/81 -
  188. (-x + 2)**4/324 - (-x + 2)**5/1215 + x/3 + O((x - 2)**6, (x, 2)))
  189. f = atan(x)
  190. assert fps(f, x, full=True).truncate() == x - x**3/3 + x**5/5 + O(x**6)
  191. assert fps(f, x, full=True, dir=1).truncate() == \
  192. fps(f, x, full=True, dir=-1).truncate()
  193. assert fps(f, x, 2, full=True).truncate() == \
  194. (atan(2) - Rational(2, 5) - 2*(x - 2)**2/25 + 11*(x - 2)**3/375 -
  195. 6*(x - 2)**4/625 + 41*(x - 2)**5/15625 + x/5 + O((x - 2)**6, (x, 2)))
  196. assert fps(f, x, 2, full=True, dir=-1).truncate() == \
  197. (atan(2) - Rational(2, 5) - 2*(-x + 2)**2/25 - 11*(-x + 2)**3/375 -
  198. 6*(-x + 2)**4/625 - 41*(-x + 2)**5/15625 + x/5 + O((x - 2)**6, (x, 2)))
  199. f = x*atan(x) - log(1 + x**2) / 2
  200. assert fps(f, x, full=True).truncate() == x**2/2 - x**4/12 + O(x**6)
  201. f = log((1 + x) / (1 - x)) / 2 - atan(x)
  202. assert fps(f, x, full=True).truncate(n=10) == 2*x**3/3 + 2*x**7/7 + O(x**10)
  203. @slow
  204. def test_fps__hyper():
  205. f = sin(x)
  206. assert fps(f, x).truncate() == x - x**3/6 + x**5/120 + O(x**6)
  207. f = cos(x)
  208. assert fps(f, x).truncate() == 1 - x**2/2 + x**4/24 + O(x**6)
  209. f = exp(x)
  210. assert fps(f, x).truncate() == \
  211. 1 + x + x**2/2 + x**3/6 + x**4/24 + x**5/120 + O(x**6)
  212. f = atan(x)
  213. assert fps(f, x).truncate() == x - x**3/3 + x**5/5 + O(x**6)
  214. f = exp(acos(x))
  215. assert fps(f, x).truncate() == \
  216. (exp(pi/2) - x*exp(pi/2) + x**2*exp(pi/2)/2 - x**3*exp(pi/2)/3 +
  217. 5*x**4*exp(pi/2)/24 - x**5*exp(pi/2)/6 + O(x**6))
  218. f = exp(acosh(x))
  219. assert fps(f, x).truncate() == I + x - I*x**2/2 - I*x**4/8 + O(x**6)
  220. f = atan(1/x)
  221. assert fps(f, x).truncate() == pi/2 - x + x**3/3 - x**5/5 + O(x**6)
  222. f = x*atan(x) - log(1 + x**2) / 2
  223. assert fps(f, x, rational=False).truncate() == x**2/2 - x**4/12 + O(x**6)
  224. f = log(1 + x)
  225. assert fps(f, x, rational=False).truncate() == \
  226. x - x**2/2 + x**3/3 - x**4/4 + x**5/5 + O(x**6)
  227. f = airyai(x**2)
  228. assert fps(f, x).truncate() == \
  229. (3**Rational(5, 6)*gamma(Rational(1, 3))/(6*pi) -
  230. 3**Rational(2, 3)*x**2/(3*gamma(Rational(1, 3))) + O(x**6))
  231. f = exp(x)*sin(x)
  232. assert fps(f, x).truncate() == x + x**2 + x**3/3 - x**5/30 + O(x**6)
  233. f = exp(x)*sin(x)/x
  234. assert fps(f, x).truncate() == 1 + x + x**2/3 - x**4/30 - x**5/90 + O(x**6)
  235. f = sin(x) * cos(x)
  236. assert fps(f, x).truncate() == x - 2*x**3/3 + 2*x**5/15 + O(x**6)
  237. def test_fps_shift():
  238. f = x**-5*sin(x)
  239. assert fps(f, x).truncate() == \
  240. 1/x**4 - 1/(6*x**2) + Rational(1, 120) - x**2/5040 + x**4/362880 + O(x**6)
  241. f = x**2*atan(x)
  242. assert fps(f, x, rational=False).truncate() == \
  243. x**3 - x**5/3 + O(x**6)
  244. f = cos(sqrt(x))*x
  245. assert fps(f, x).truncate() == \
  246. x - x**2/2 + x**3/24 - x**4/720 + x**5/40320 + O(x**6)
  247. f = x**2*cos(sqrt(x))
  248. assert fps(f, x).truncate() == \
  249. x**2 - x**3/2 + x**4/24 - x**5/720 + O(x**6)
  250. def test_fps__Add_expr():
  251. f = x*atan(x) - log(1 + x**2) / 2
  252. assert fps(f, x).truncate() == x**2/2 - x**4/12 + O(x**6)
  253. f = sin(x) + cos(x) - exp(x) + log(1 + x)
  254. assert fps(f, x).truncate() == x - 3*x**2/2 - x**4/4 + x**5/5 + O(x**6)
  255. f = 1/x + sin(x)
  256. assert fps(f, x).truncate() == 1/x + x - x**3/6 + x**5/120 + O(x**6)
  257. f = sin(x) - cos(x) + 1/(x - 1)
  258. assert fps(f, x).truncate() == \
  259. -2 - x**2/2 - 7*x**3/6 - 25*x**4/24 - 119*x**5/120 + O(x**6)
  260. def test_fps__asymptotic():
  261. f = exp(x)
  262. assert fps(f, x, oo) == f
  263. assert fps(f, x, -oo).truncate() == O(1/x**6, (x, oo))
  264. f = erf(x)
  265. assert fps(f, x, oo).truncate() == 1 + O(1/x**6, (x, oo))
  266. assert fps(f, x, -oo).truncate() == -1 + O(1/x**6, (x, oo))
  267. f = atan(x)
  268. assert fps(f, x, oo, full=True).truncate() == \
  269. -1/(5*x**5) + 1/(3*x**3) - 1/x + pi/2 + O(1/x**6, (x, oo))
  270. assert fps(f, x, -oo, full=True).truncate() == \
  271. -1/(5*x**5) + 1/(3*x**3) - 1/x - pi/2 + O(1/x**6, (x, oo))
  272. f = log(1 + x)
  273. assert fps(f, x, oo) != \
  274. (-1/(5*x**5) - 1/(4*x**4) + 1/(3*x**3) - 1/(2*x**2) + 1/x - log(1/x) +
  275. O(1/x**6, (x, oo)))
  276. assert fps(f, x, -oo) != \
  277. (-1/(5*x**5) - 1/(4*x**4) + 1/(3*x**3) - 1/(2*x**2) + 1/x + I*pi -
  278. log(-1/x) + O(1/x**6, (x, oo)))
  279. def test_fps__fractional():
  280. f = sin(sqrt(x)) / x
  281. assert fps(f, x).truncate() == \
  282. (1/sqrt(x) - sqrt(x)/6 + x**Rational(3, 2)/120 -
  283. x**Rational(5, 2)/5040 + x**Rational(7, 2)/362880 -
  284. x**Rational(9, 2)/39916800 + x**Rational(11, 2)/6227020800 + O(x**6))
  285. f = sin(sqrt(x)) * x
  286. assert fps(f, x).truncate() == \
  287. (x**Rational(3, 2) - x**Rational(5, 2)/6 + x**Rational(7, 2)/120 -
  288. x**Rational(9, 2)/5040 + x**Rational(11, 2)/362880 + O(x**6))
  289. f = atan(sqrt(x)) / x**2
  290. assert fps(f, x).truncate() == \
  291. (x**Rational(-3, 2) - x**Rational(-1, 2)/3 + x**S.Half/5 -
  292. x**Rational(3, 2)/7 + x**Rational(5, 2)/9 - x**Rational(7, 2)/11 +
  293. x**Rational(9, 2)/13 - x**Rational(11, 2)/15 + O(x**6))
  294. f = exp(sqrt(x))
  295. assert fps(f, x).truncate().expand() == \
  296. (1 + x/2 + x**2/24 + x**3/720 + x**4/40320 + x**5/3628800 + sqrt(x) +
  297. x**Rational(3, 2)/6 + x**Rational(5, 2)/120 + x**Rational(7, 2)/5040 +
  298. x**Rational(9, 2)/362880 + x**Rational(11, 2)/39916800 + O(x**6))
  299. f = exp(sqrt(x))*x
  300. assert fps(f, x).truncate().expand() == \
  301. (x + x**2/2 + x**3/24 + x**4/720 + x**5/40320 + x**Rational(3, 2) +
  302. x**Rational(5, 2)/6 + x**Rational(7, 2)/120 + x**Rational(9, 2)/5040 +
  303. x**Rational(11, 2)/362880 + O(x**6))
  304. def test_fps__logarithmic_singularity():
  305. f = log(1 + 1/x)
  306. assert fps(f, x) != \
  307. -log(x) + x - x**2/2 + x**3/3 - x**4/4 + x**5/5 + O(x**6)
  308. assert fps(f, x, rational=False) != \
  309. -log(x) + x - x**2/2 + x**3/3 - x**4/4 + x**5/5 + O(x**6)
  310. @XFAIL
  311. def test_fps__logarithmic_singularity_fail():
  312. f = asech(x) # Algorithms for computing limits probably needs improvemnts
  313. assert fps(f, x) == log(2) - log(x) - x**2/4 - 3*x**4/64 + O(x**6)
  314. def test_fps_symbolic():
  315. f = x**n*sin(x**2)
  316. assert fps(f, x).truncate(8) == x**(n + 2) - x**(n + 6)/6 + O(x**(n + 8), x)
  317. f = x**n*log(1 + x)
  318. fp = fps(f, x)
  319. k = fp.ak.variables[0]
  320. assert fp.infinite == \
  321. Sum((-(-1)**(-k)*x**(k + n))/k, (k, 1, oo))
  322. f = (x - 2)**n*log(1 + x)
  323. assert fps(f, x, 2).truncate() == \
  324. ((x - 2)**n*log(3) + (x - 2)**(n + 1)/3 - (x - 2)**(n + 2)/18 + (x - 2)**(n + 3)/81 -
  325. (x - 2)**(n + 4)/324 + (x - 2)**(n + 5)/1215 + O((x - 2)**(n + 6), (x, 2)))
  326. f = x**(n - 2)*cos(x)
  327. assert fps(f, x).truncate() == \
  328. (x**(n - 2) - x**n/2 + x**(n + 2)/24 + O(x**(n + 4), x))
  329. f = x**(n - 2)*sin(x) + x**n*exp(x)
  330. assert fps(f, x).truncate() == \
  331. (x**(n - 1) + x**(n + 1) + x**(n + 2)/2 + x**n +
  332. x**(n + 4)/24 + x**(n + 5)/60 + O(x**(n + 6), x))
  333. f = x**n*atan(x)
  334. assert fps(f, x, oo).truncate() == \
  335. (-x**(n - 5)/5 + x**(n - 3)/3 + x**n*(pi/2 - 1/x) +
  336. O((1/x)**(-n)/x**6, (x, oo)))
  337. f = x**(n/2)*cos(x)
  338. assert fps(f, x).truncate() == \
  339. x**(n/2) - x**(n/2 + 2)/2 + x**(n/2 + 4)/24 + O(x**(n/2 + 6), x)
  340. f = x**(n + m)*sin(x)
  341. assert fps(f, x).truncate() == \
  342. x**(m + n + 1) - x**(m + n + 3)/6 + x**(m + n + 5)/120 + O(x**(m + n + 6), x)
  343. def test_fps__slow():
  344. f = x*exp(x)*sin(2*x) # TODO: rsolve needs improvement
  345. assert fps(f, x).truncate() == 2*x**2 + 2*x**3 - x**4/3 - x**5 + O(x**6)
  346. def test_fps__operations():
  347. f1, f2 = fps(sin(x)), fps(cos(x))
  348. fsum = f1 + f2
  349. assert fsum.function == sin(x) + cos(x)
  350. assert fsum.truncate() == \
  351. 1 + x - x**2/2 - x**3/6 + x**4/24 + x**5/120 + O(x**6)
  352. fsum = f1 + 1
  353. assert fsum.function == sin(x) + 1
  354. assert fsum.truncate() == 1 + x - x**3/6 + x**5/120 + O(x**6)
  355. fsum = 1 + f2
  356. assert fsum.function == cos(x) + 1
  357. assert fsum.truncate() == 2 - x**2/2 + x**4/24 + O(x**6)
  358. assert (f1 + x) == Add(f1, x)
  359. assert -f2.truncate() == -1 + x**2/2 - x**4/24 + O(x**6)
  360. assert (f1 - f1) is S.Zero
  361. fsub = f1 - f2
  362. assert fsub.function == sin(x) - cos(x)
  363. assert fsub.truncate() == \
  364. -1 + x + x**2/2 - x**3/6 - x**4/24 + x**5/120 + O(x**6)
  365. fsub = f1 - 1
  366. assert fsub.function == sin(x) - 1
  367. assert fsub.truncate() == -1 + x - x**3/6 + x**5/120 + O(x**6)
  368. fsub = 1 - f2
  369. assert fsub.function == -cos(x) + 1
  370. assert fsub.truncate() == x**2/2 - x**4/24 + O(x**6)
  371. raises(ValueError, lambda: f1 + fps(exp(x), dir=-1))
  372. raises(ValueError, lambda: f1 + fps(exp(x), x0=1))
  373. fm = f1 * 3
  374. assert fm.function == 3*sin(x)
  375. assert fm.truncate() == 3*x - x**3/2 + x**5/40 + O(x**6)
  376. fm = 3 * f2
  377. assert fm.function == 3*cos(x)
  378. assert fm.truncate() == 3 - 3*x**2/2 + x**4/8 + O(x**6)
  379. assert (f1 * f2) == Mul(f1, f2)
  380. assert (f1 * x) == Mul(f1, x)
  381. fd = f1.diff()
  382. assert fd.function == cos(x)
  383. assert fd.truncate() == 1 - x**2/2 + x**4/24 + O(x**6)
  384. fd = f2.diff()
  385. assert fd.function == -sin(x)
  386. assert fd.truncate() == -x + x**3/6 - x**5/120 + O(x**6)
  387. fd = f2.diff().diff()
  388. assert fd.function == -cos(x)
  389. assert fd.truncate() == -1 + x**2/2 - x**4/24 + O(x**6)
  390. f3 = fps(exp(sqrt(x)))
  391. fd = f3.diff()
  392. assert fd.truncate().expand() == \
  393. (1/(2*sqrt(x)) + S.Half + x/12 + x**2/240 + x**3/10080 + x**4/725760 +
  394. x**5/79833600 + sqrt(x)/4 + x**Rational(3, 2)/48 + x**Rational(5, 2)/1440 +
  395. x**Rational(7, 2)/80640 + x**Rational(9, 2)/7257600 + x**Rational(11, 2)/958003200 +
  396. O(x**6))
  397. assert f1.integrate((x, 0, 1)) == -cos(1) + 1
  398. assert integrate(f1, (x, 0, 1)) == -cos(1) + 1
  399. fi = integrate(f1, x)
  400. assert fi.function == -cos(x)
  401. assert fi.truncate() == -1 + x**2/2 - x**4/24 + O(x**6)
  402. fi = f2.integrate(x)
  403. assert fi.function == sin(x)
  404. assert fi.truncate() == x - x**3/6 + x**5/120 + O(x**6)
  405. def test_fps__product():
  406. f1, f2, f3 = fps(sin(x)), fps(exp(x)), fps(cos(x))
  407. raises(ValueError, lambda: f1.product(exp(x), x))
  408. raises(ValueError, lambda: f1.product(fps(exp(x), dir=-1), x, 4))
  409. raises(ValueError, lambda: f1.product(fps(exp(x), x0=1), x, 4))
  410. raises(ValueError, lambda: f1.product(fps(exp(y)), x, 4))
  411. fprod = f1.product(f2, x)
  412. assert isinstance(fprod, FormalPowerSeriesProduct)
  413. assert isinstance(fprod.ffps, FormalPowerSeries)
  414. assert isinstance(fprod.gfps, FormalPowerSeries)
  415. assert fprod.f == sin(x)
  416. assert fprod.g == exp(x)
  417. assert fprod.function == sin(x) * exp(x)
  418. assert fprod._eval_terms(4) == x + x**2 + x**3/3
  419. assert fprod.truncate(4) == x + x**2 + x**3/3 + O(x**4)
  420. assert fprod.polynomial(4) == x + x**2 + x**3/3
  421. raises(NotImplementedError, lambda: fprod._eval_term(5))
  422. raises(NotImplementedError, lambda: fprod.infinite)
  423. raises(NotImplementedError, lambda: fprod._eval_derivative(x))
  424. raises(NotImplementedError, lambda: fprod.integrate(x))
  425. assert f1.product(f3, x)._eval_terms(4) == x - 2*x**3/3
  426. assert f1.product(f3, x).truncate(4) == x - 2*x**3/3 + O(x**4)
  427. def test_fps__compose():
  428. f1, f2, f3 = fps(exp(x)), fps(sin(x)), fps(cos(x))
  429. raises(ValueError, lambda: f1.compose(sin(x), x))
  430. raises(ValueError, lambda: f1.compose(fps(sin(x), dir=-1), x, 4))
  431. raises(ValueError, lambda: f1.compose(fps(sin(x), x0=1), x, 4))
  432. raises(ValueError, lambda: f1.compose(fps(sin(y)), x, 4))
  433. raises(ValueError, lambda: f1.compose(f3, x))
  434. raises(ValueError, lambda: f2.compose(f3, x))
  435. fcomp = f1.compose(f2, x)
  436. assert isinstance(fcomp, FormalPowerSeriesCompose)
  437. assert isinstance(fcomp.ffps, FormalPowerSeries)
  438. assert isinstance(fcomp.gfps, FormalPowerSeries)
  439. assert fcomp.f == exp(x)
  440. assert fcomp.g == sin(x)
  441. assert fcomp.function == exp(sin(x))
  442. assert fcomp._eval_terms(6) == 1 + x + x**2/2 - x**4/8 - x**5/15
  443. assert fcomp.truncate() == 1 + x + x**2/2 - x**4/8 - x**5/15 + O(x**6)
  444. assert fcomp.truncate(5) == 1 + x + x**2/2 - x**4/8 + O(x**5)
  445. raises(NotImplementedError, lambda: fcomp._eval_term(5))
  446. raises(NotImplementedError, lambda: fcomp.infinite)
  447. raises(NotImplementedError, lambda: fcomp._eval_derivative(x))
  448. raises(NotImplementedError, lambda: fcomp.integrate(x))
  449. assert f1.compose(f2, x).truncate(4) == 1 + x + x**2/2 + O(x**4)
  450. assert f1.compose(f2, x).truncate(8) == \
  451. 1 + x + x**2/2 - x**4/8 - x**5/15 - x**6/240 + x**7/90 + O(x**8)
  452. assert f1.compose(f2, x).truncate(6) == \
  453. 1 + x + x**2/2 - x**4/8 - x**5/15 + O(x**6)
  454. assert f2.compose(f2, x).truncate(4) == x - x**3/3 + O(x**4)
  455. assert f2.compose(f2, x).truncate(8) == x - x**3/3 + x**5/10 - 8*x**7/315 + O(x**8)
  456. assert f2.compose(f2, x).truncate(6) == x - x**3/3 + x**5/10 + O(x**6)
  457. def test_fps__inverse():
  458. f1, f2, f3 = fps(sin(x)), fps(exp(x)), fps(cos(x))
  459. raises(ValueError, lambda: f1.inverse(x))
  460. finv = f2.inverse(x)
  461. assert isinstance(finv, FormalPowerSeriesInverse)
  462. assert isinstance(finv.ffps, FormalPowerSeries)
  463. raises(ValueError, lambda: finv.gfps)
  464. assert finv.f == exp(x)
  465. assert finv.function == exp(-x)
  466. assert finv._eval_terms(5) == 1 - x + x**2/2 - x**3/6 + x**4/24
  467. assert finv.truncate() == 1 - x + x**2/2 - x**3/6 + x**4/24 - x**5/120 + O(x**6)
  468. assert finv.truncate(5) == 1 - x + x**2/2 - x**3/6 + x**4/24 + O(x**5)
  469. raises(NotImplementedError, lambda: finv._eval_term(5))
  470. raises(ValueError, lambda: finv.g)
  471. raises(NotImplementedError, lambda: finv.infinite)
  472. raises(NotImplementedError, lambda: finv._eval_derivative(x))
  473. raises(NotImplementedError, lambda: finv.integrate(x))
  474. assert f2.inverse(x).truncate(8) == \
  475. 1 - x + x**2/2 - x**3/6 + x**4/24 - x**5/120 + x**6/720 - x**7/5040 + O(x**8)
  476. assert f3.inverse(x).truncate() == 1 + x**2/2 + 5*x**4/24 + O(x**6)
  477. assert f3.inverse(x).truncate(8) == 1 + x**2/2 + 5*x**4/24 + 61*x**6/720 + O(x**8)