The Risch Algorithm for Symbolic Integration in Sympy

The Risch Algorithm for Symbolic Integration in Sympy

The Risch Algorithm for Symbolic Integration in SymPy Aaron Meurer July 14, 2011 1 / 9 Over the summer of 2010, I worked for the Python Software Organization with the SymPy project under the Google Summer of Code program to implement the transcendental Risch Algorithm in SymPy. 2 / 9 End result: risch integrate() function Orders of magnitude faster than old integrate() function Able to solve much more And it can prove that integrals are nonelementary! 3 / 9 In[1]:f1=(1+exp(x**2))*(1-x-4*x**2*exp(x**2)*log(x)- ...:x*exp(x**2)+4*x**3*exp(x**2)+exp(x**2))/(x*(x-log(x))**2) In[2]:f1 Out[2]: 1 ⎛ ⎛2⎞⎞⎛ ⎛2⎞ ⎛2⎞ ⎛2⎞ ⎛2⎞⎞ ⎜ ⎝x⎠⎟⎜ 2 ⎝x⎠ ⎝x⎠ 3 ⎝x⎠ ⎝x⎠⎟ ⎝1+e ⎠⋅⎝1-x-4⋅x⋅e⋅log(x)-x⋅e +4⋅x⋅e +e ⎠ ────────────────────────────────────────────────────────────────────── 2 x⋅(x-log(x)) In[3]:factor(cancel(risch_integrate(f1,x))) Out[3]: 1 2 ⎛ ⎛2⎞⎞ ⎜ ⎝x⎠⎟ ⎝1+e ⎠ ──────────── x-log(x) In[4]:%timeitrisch_integrate(f1,x) 1loops,bestof3:390msperloop 1 1 4 / 9 In[5]:risch_integrate(exp(-x**2),x) Out[5]: ⌠ ⎮ 2 ⎮ -x ⎮e dx ⌡ In[7]:risch_integrate(1/log(x),x) Out[7]: 1 ⌠ ⎮ 1 ⎮──────dx ⎮log(x) ⌡ In[10]:risch_integrate(exp(x)*log(x),x) Out[10]: 1 ⌠ ⎮ x ⎮e⋅log(x)dx ⌡ In[11]:risch_integrate(exp(exp(x)),x) Out[11]: 1 ⌠ ⎮ ⎛x⎞ ⎮ ⎝e⎠ ⎮e dx ⌡ 1 5 / 9 Let's look at how long it takes to compute R x10ex dx and R x20ex dx. In[14]:%timeitintegrate(x**10*exp(x),x) 1loops,bestof3:2.75sperloop In[15]:%timeitintegrate(x**20*exp(x),x) 1loops,bestof3:31.5sperloop 1 In[16]:%timeitrisch_integrate(x**10*exp(x),x) 10loops,bestof3:75.9msperloop 1 In[17]:%timeitrisch_integrate(x**20*exp(x),x) 10loops,bestof3:98msperloop 1 1 (integrate() is the old function and risch integrate() is the new function) 6 / 9 Time of integrate() and risch integrate() to evaluate R x nex dx 10 8 6 Time (s) 4 2 0 0 100 200 300 400 500 n The new implementation is both orders of magnitude faster, and asymptotically faster! 7 / 9 def no_cancel_b_small(b, c, n, DE): """ Poly Risch Differential Equation - No cancelation: deg(b) small enough. Given a derivation D on k[t], n either an integer or +oo, and b, c in k[t] with deg(b) < deg(D) - 1 and either D == d/dt or PolyRischDENoCancel2(b, c, D, n) /* Poly Risch d.e. – no cancellation */ deg(D) >= 2, either raise NonElementaryIntegralException, in which case the equation Dq + b*q == c has no solution of degree at most n in k[t], /* Given a derivation D on k[t], n either an integer or + , and b, c k[t] with or a solution q in k[t] of this equation with deg(q) <= n, or the deg(b) < δ(t) 1 and either D = d/dt or δ(t) 2, return either∞ “no solution”,∈ in tuple (h, b0, c0) such that h in k[t], b0, c0, in k, and for any which case the− equation Dq + bq = c has no solution≥ of degree at most n in k[t], or solution q in k[t] of degree at most n of Dq + bq == c, y == q - h a solution q k[t] of this equation with deg(q) n, or the tuple (h, b , c ) such that 0 0 is a solution in k of Dy + b0*y == c0. h k[t], b , c∈ k[t], and for any solution q k≤[t] of degree at most n of 0 0 """ Dq∈+ bq = c, y∈= q h is a solution in k of Dy∈ + b y = c . */ − 0 0 q= Poly(0, DE.t) q 0 ← while c = 0 do while notc.is_zero: if n =6 0 then m 0 else m deg(c) = δ(t) + 1 ← ← ifn ==0: if n < 0 or m < 0 or m > n then return “no solution” m=0 if m > 0 then p (lc(c)/(mλ(t)))tm ← else: else /* m = 0 */ m=c.degree(DE.t)-DE.d.degree(DE.t)+1 if deg(b) = deg(c) then return “no solution” if deg(b) =6 0 then return (q, c, b) if not0<=m<= n: # n < 0 or m < 0 or m > n p lc(c)/lc(b) q q←+ p raise NonElementaryIntegralException n ← m 1 c ←c −Dp bp ifm>0: return← q − − p= Poly(c.as_poly(DE.t).LC()/(m*DE.d.as_poly(DE.t).LC())*DE.t**m, DE.t, expand=False) else: ifb.degree(DE.t) !=c.degree(DE.t): raise NonElementaryIntegralException ifb.degree(DE.t) ==0: return (q, b.as_poly(DE.T[DE.level-1]), c.as_poly(DE.T[DE.level-1])) p= Poly(c.as_poly(DE.t).LC()/b.as_poly(DE.t).LC(), DE.t, expand=False) q=q+p n=m-1 c=c- derivation(p, DE)-b*p returnq 8 / 9 You can download SymPy at www.sympy.org Or pip install sympy (We just released 0.7.0) My development branch is at www.github.com/asmeurer/sympy/tree/integration3 (it isn't merged into the main repo yet) 9 / 9.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    9 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us