(copied from issue 2010)

I have ready in my integration3 branch a prototype risch_integrate() function, 
that is a user-level function for the full Risch Algorithm I have been 
implementing this summer.  Pull from 
http://github.com/asmeurer/sympy/tree/integration3
.

This is NOT ready to go in.  It is a prototype function that I am making 
available so people can try out the new algorithm and hopefully help me to find 
the bugs in it.  Please pass it your favorite non-elementary integrals and see 
if it can determine that they are not elementary.  If you try to pass it a very 
crazy function at random, the chances are pretty high that it will not be 
elementary.  So a better way to test it is to come up with a crazy function, 
then differentiate it. Then pass the derivative and see if it can give you your 
original function back.  Note that it will probably not look exactly the same 
as your original function, and may differ by a constant.  You should verify by 
differentiating the result you get and calling cancel() (or simplify(), but 
usually cancel() is enough) on the difference.

So you can review the code too, if you like, but just know that things are not 
stable yet, and this isn't strictly a branch for review.  

So far, this function only supports exponentials and logarithms.
Support for trigonometric functions is planned.  Algebraic functions are
not supported. If the function returns an unevaluated Integral, it means
that it has proven the integral to be non-elementary.  Note that several
cases are still not implemented, so you may get NotImplementedError
instead. Eventually, these will all be eliminated, and the only
NotImplementedError you should see from this function is
NotImplementedError("Algebraic extensions are not supported.")

This function has not been integrated in any way with the already
existing integrate() yet, and you can use it to compare.

Examples:

In [1]: risch_integrate(exp(x**2), x)
Out[1]:
⌠
⎮  ⎛ 2⎞
⎮  ⎝x ⎠
⎮ ℯ     dx
⌡

In [2]: risch_integrate(x**100*exp(x), x).diff(x)
Out[2]:
 100  x
x   ⋅ℯ

In [3]: %timeit risch_integrate(x**100*exp(x), x).diff(x)
1 loops, best of 3: 270 ms per loop

In [4]: integrate(x**100*exp(x), x)
... hangs ...

In [5]: risch_integrate(x/log(x), x)
Out[5]:
⌠
⎮   x
⎮ ────── dx
⎮ log(x)
⌡

In [6]: risch_integrate(log(x)**10, x).diff(x)
Out[6]:
   10
log  (x)

In [7]: integrate(log(x)**10, x).diff(x)
Out[7]:
   10
log  (x)

In [8]: %timeit risch_integrate(log(x)**10, x).diff(x)
10 loops, best of 3: 159 ms per loop

In [9]: %timeit integrate(log(x)**10, x).diff(x)
1 loops, best of 3: 2.35 s per loop

Be warned that things are still very buggy and you should always verify
results by differentiating.  Usually, cancel(diff(result, x) - result)
should be enough.  This should go to 0.

So please, please, PLEASE, try out this function and report any bugs that you 
find.  It is not necessary to report NotImplementedError bugs, because I 
already know about those (I put them in there), and as I mentioned above, they 
are all planned to disappear.  Also, I am continually updating my branch with 
fixes, so you should do a "git pull" and try again before you report anything.

Also, I am aware that there are test failures.  This is because I had to hack 
exp._eval_subs() to only do exact substitution (no algebraic substitution).  
It's just a quick hack workaround, and I should eventually get a real fix.  

Finally, I'm thinking there needs to be a way to differentiate between an 
unevaluated Integral because the integrator failed and an unevaluated Integral 
because it has proven the integral to be non-elementary.  Any ideas?

Aaron Meurer

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To post to this group, send email to sy...@googlegroups.com.
To unsubscribe from this group, send email to 
sympy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sympy?hl=en.

Reply via email to