Comment #1 on issue 2010 by asmeurer: Integration with the full Risch
Algorithm
http://code.google.com/p/sympy/issues/detail?id=2010
I have added a handle_first kwarg to risch_integrate(), which changes how
the extension is build. If handle_first == 'log' (the default right now),
then it will gather all logarithms first, and then exponentials (insomuch
as it can do it in that order). If handle_first='exp', it gathers
exponentials first. The difference is that the Risch Algorithm integrates
recursively, one extension at a time, starting with the outer-most one. So
if you have an expression with both logarithms and exponentials, such that
they do not depend on each other, handle_first == 'log' will integrate the
exponentials first, because they will be gathered last (be at the top of
the tower of extensions), and handle_first == 'exp' will integrate the
logarithms first. Right now, I have defaulted to 'log' because the
exponential integration algorithm is slightly more complete. If you get
NotImplementedError with one, it is possible (though I don't know for sure
yet) that you might get an answer with the other.
Also, they can give different looking results, and at different speeds.
For example:
In [1]: f = (x*(x + 1)*((x**2*exp(2*x**2) - log(x + 1)**2)**2 +
...: 2*x*exp(3*x**2)*(x - (2*x**3 + 2*x**2 + x + 1)*log(x + 1))))/((x +
...: 1)*log(x + 1)**2 - (x**3 + x**2)*exp(2*x**2))**2
In [2]: f
Out[2]:
⎛
2 ⎞
⎜⎛
2⎞ 2⎟
⎜⎜ 2 2 2⋅x ⎟ ⎛ ⎛ 2
3⎞ ⎞ 3⋅x ⎟
x⋅(1 + x)⋅⎝⎝- log (1 + x) + x ⋅ℯ ⎠ + 2⋅x⋅⎝x - ⎝1 + x + 2⋅x + 2⋅x
⎠⋅log(1 + x)⎠⋅ℯ ⎠
──────────────────────────────────────────────────────────────────────────────────────────
2
⎛ 2⎞
⎜ 2 ⎛ 2 3⎞ 2⋅x ⎟
⎝log (1 + x)⋅(1 + x) - ⎝x + x ⎠⋅ℯ ⎠
In [3]: risch_integrate(f, x, handle_first='log')
Out[3]:
⎛ ⎛ 2⎞⎞ ⎛ ⎛ 2⎞⎞
⎜log(1 + x) ⎝x ⎠⎟ ⎜ log(1 + x) ⎝x
⎠⎟ ⎛ 2⎞
log⎜────────── + ℯ ⎟ log⎜- ────────── + ℯ ⎟
2 ⎝x ⎠
⎝ x ⎠ ⎝ x ⎠ x
⋅ℯ ⋅log(1 + x)
x + ─────────────────────── - log(1 + x) - ───────────────────────── +
──────────────────────────
2
2 2
2
3 2⋅x
-
x⋅log (1 + x) + x ⋅ℯ
In [4]: risch_integrate(f, x, handle_first='exp')
Out[4]:
⎛ ⎛ 2⎞⎞ ⎛ ⎛
2⎞⎞ ⎛ 2⎞
⎜ ⎝x ⎠⎟ ⎜ ⎝x
⎠⎟ ⎝x ⎠
log⎝log(1 + x) + x⋅ℯ ⎠ log⎝log(1 + x) - x⋅ℯ ⎠
x⋅ℯ ⋅log(1 + x)
x + ───────────────────────── - log(1 + x) - ───────────────────────── -
──────────────────────
2
2 2
2 2 2⋅x
log (1 + x) - x ⋅ℯ
In [5]: %timeit risch_integrate(f, x, handle_first='log')
1 loops, best of 3: 1.49 s per loop
In [6]: %timeit risch_integrate(f, x, handle_first='exp')
1 loops, best of 3: 1.21 s per loop
In [7]: cancel(risch_integrate(f, x, handle_first='log').diff(x) - f)
Out[7]: 0
In [8]: cancel(risch_integrate(f, x, handle_first='exp').diff(x) - f)
Out[8]: 0
--
You received this message because you are subscribed to the Google Groups
"sympy-issues" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sympy-issues?hl=en.