integrate() uses several algorithms, and one or more algorithms may
apply to any specific integral. Some algorithms, if you know how they
work, you can easily see if they won't apply to a specific integrand.
The best way to tell how it works for a specific integral is to check
the various algorithms. Another thing that I highly suggest is to run
the integrate() function through a debugger, so you can see how it
works (I like PuDB, but any debugger that you are comfortable with
will work).

Here are the algorithms used by integrate() (I hope I didn't forget
any).  You can import each algorithm from the specified module to try
it

sympy.integrals.risch.risch_integrate() - Risch algorithm. Currently
only works for transcendental equations with exp() and log().

sympy.integrals.manualintegrate.manualintegrate() - Manual
integration. That means, integration akin to how you would do things
by hand. This is very similar to Rubi in that it does pattern matching
against some rules. Ideally any implementation of Rubi would merge
with manualintegrate() so we don't have two pattern matching
integrators.

sympy.integrals.trigonometry.trigintegrate() - Integrate trig
functions. Also uses pattern matching.

sympy.integrals.rationaltools.ratint() - Integrate rational functions.

sympy.integrals.meijerint.meijerg_definite() and
sympy.integrals.meijerint.meijerg_indefinite() - Integration using the
Meijer G algorithm (roughly, by translating the integral to a Meijer
G-function, integrating, then translating back).

sympy.integrals.heurisch.heurisch() - The heuristic Risch algorithm.
This is tried last, because it can be very slow (sometimes hanging the
integrator), but there are cases where only it can produce an answer.

You should be able to apply any of these functions directly on an
integrand to see if they can produce an answer.

The algorithms are tried in order until one gives an answer. I don't
remember exactly what order, but I think it's similar to the above. I
do know that heurisch() is last, because it's the worst.

Aaron Meurer


On Sun, Mar 5, 2017 at 12:00 PM, Abdullah Javed Nesar
<[email protected]> wrote:
> Hi Aaron,
>
> Thanks for your explanation.
>
> How does SymPy evaluates integrals like,
>
>>>integrate((a + b*u)**m, x) when u = c + dx  (i.e. Integration by
>>> substitution)
>
> I couldn't find such an example can give one?
>
> Abdullah Javed Nesar
>
> On Sunday, March 5, 2017 at 11:58:20 AM UTC+5:30, Aaron Meurer wrote:
>>
>> The SymPy assumptions system lets you define x = Symbol('x',
>> positive=True) (and query like x.is_positive). The pattern matcher
>> will need to be able to set and define restrictions like this. Also
>> note that expand_log() and logcombine() already expand and combine
>> logarithms and check the domain restrictions.
>>
>> Another thing is that the integrator should return a Piecewise
>> whenever possible. For example, the current integrator:
>>
>> In [6]: integrate(x**n, x)
>> Out[6]:
>> ⎧log(x)  for n = -1
>> ⎪
>> ⎪ n + 1
>> ⎨x
>> ⎪──────  otherwise
>> ⎪n + 1
>> ⎩
>>
>> This way we get results that are mathematically correct, even when
>> assumptions aren't set.
>>
>> Aaron Meurer
>>
>> On Thu, Mar 2, 2017 at 8:56 AM, Abdullah Javed Nesar
>> <[email protected]> wrote:
>> > Hi Ondřej,
>> >
>> > I am willing to work on Rubi Integrator this summer. I went through the
>> > issues you raised for this project and this idea really sounds cool. It
>> > would be great to segregate the different methods of integration into a
>> > decision tree which would hence improve its performance.
>> >
>> > Before implementing Rule-based integrator we need to implement fast
>> > pattern
>> > matching/replacement for the set of 10,000 rules so we need to plan out
>> > an
>> > efficient decision tree for it.
>> >
>> > log(x*y) -> log(x) + log(y);   x > 0, y > 0
>> >
>> >
>> > In the above example how do we exactly move on with domain restrictions
>> > (i.e. x, y).
>> >
>> > On Wednesday, March 1, 2017 at 8:39:41 PM UTC+5:30, Ondřej Čertík wrote:
>> >>
>> >> Hi,
>> >>
>> >> Here is a project that I would love to see happen:
>> >>
>> >> https://github.com/sympy/sympy/issues/12233
>> >>
>> >> I am available to mentor it, and I think quite a few people are
>> >> excited about it and such a system/framework (i.e. set of rules for
>> >> patter matching + compiler to generate a fast if/then/else decision
>> >> tree) would have applications beyond just integration, but integration
>> >> would already be super useful. As you can browse on Rubi web page, the
>> >> integrator's capabilities are very impressive, i.e. the rule based
>> >> system Rubi 4.9 can do more integrals than Mathematica, and is about
>> >> as fast, due to the large number of rules, and the if/then/else
>> >> decision tree Rubi 5 promises an order of magnitude (or more) speedup,
>> >> but it's still in development.
>> >>
>> >> The project is big in scope, so there could even be multiple projects.
>> >> If anybody is interested in this, please get in touch, and try to
>> >> propose a good plan.
>> >>
>> >> Ondrej
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "sympy" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an
>> > email to [email protected].
>> > To post to this group, send email to [email protected].
>> > Visit this group at https://groups.google.com/group/sympy.
>> > To view this discussion on the web visit
>> >
>> > https://groups.google.com/d/msgid/sympy/05a4ee3e-7a0b-485b-9918-0a68bb4f3350%40googlegroups.com.
>> >
>> > For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to the Google Groups
> "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/sympy.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/sympy/0cc84418-0eac-4ab2-b975-c74eeec47d64%40googlegroups.com.
>
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/CAKgW%3D6LSxWsQ3EJPOEW-LVpeG64w3URo2zMOHnqw6K8h1M%2B%2Bdw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to