I recommend using the method I outlined above to figure out which algorithm is actually handling this. Or just run integrate() through a debugger.
For the pattern matching integrator, there is a discussion in another thread here on how to make patterns match expressions that are mathematically equivalent, but don't match exactly. Aaron Meurer On Fri, Mar 10, 2017 at 9:05 AM, Abdullah Javed Nesar <[email protected]> wrote: > Aaron in case like this, > >>>> integrate(E**(n*log(a+b*x)), x) > ⎧⎩⎨1blog(ab+x)abn+benlog(a+bx)+bxbn+benlog(a+bx)forn=−1otherwise > E**(n*log(a+b*x))should better be simplified to (a+b*x)**n to proceed > further, can you tell me how SymPy currently handles such cases? > > Abdullah Javed Nesar > On Thursday, March 9, 2017 at 11:54:32 PM UTC+5:30, Aaron Meurer wrote: >> >> Can you clarify what you mean by this? >> >> Aaron Meurer >> >> On Thu, Mar 9, 2017 at 1:14 PM Abdullah Javed Nesar <[email protected]> >> wrote: >>> >>> Hi, >>> >>> I am not able to figure out how exactly we will use replacement allowing >>> technique in Rubi and when do we use it, can anyone explain this? >>> >>> Thanks. >>> >>> >>> On Thursday, March 9, 2017 at 9:47:10 PM UTC+5:30, Abdullah Javed Nesar >>> wrote: >>>> >>>> Hi, >>>> Arihant thanks for those suggestions, I guess if rule name contains >>>> Algebraic then just >>>> >>>> >>> def rule_algebraic_integrand_1_1(expr, symbol) >>>> >>>> would suffice, no need for >>>def rule_algebraic_integrand_1_1_1_1(expr, >>>> symbol) (indicating algebraic integrand>linear product>(a + b*x)**m). Yes, >>>> this way the functions would be named in a systematic way, necessarily >>>> supported by a docstring which would explain those rules in details, as >>>> Aaron pointed. >>>> >>>> Pattern matching used in manualintegrate() is a simple one without a >>>> decision tree and hence less efficient. The tree for (a + b*x)**m would be >>>> better represented as >>>> Pow(Add(a, Mul(b, x)), m), well explained in #7748. >>>> >>>> >>>> On Thursday, March 9, 2017 at 3:36:30 PM UTC+5:30, Arihant Parsoya >>>> wrote: >>>>> >>>>> Thanks Aaron, >>>>> >>>>> I read the discussion to improve pattern matching algorithm. Can you >>>>> give some information about which algorithm is currently being used for >>>>> pattern matching? >>>>> >>>>> I have been testing `match()` to check if it works properly for complex >>>>> expressions. It gives correct answer if we `exclude` the integration >>>>> variable. However, there can be issues in matching expression when >>>>> brackets >>>>> are automatically evaluated by SymPy: >>>>> >>>>> >>> x, y, z, F, fx = symbols('x, y, z, F, fx') >>>>> >>>>> >>> a = Wild('a', exclude=[x]) >>>>> >>>>> >>> b = Wild('b', exclude=[x]) >>>>> >>>>> >>> c = Wild('c', exclude=[x]) >>>>> >>>>> >>> d = Wild('d', exclude=[x]) >>>>> >>>>> >>> e = Wild('e', exclude=[x]) >>>>> >>>>> >>> f = Wild('f', exclude=[x]) >>>>> >>>>> >>> g = Wild('g', exclude=[x]) >>>>> >>>>> >>> p = Wild('p', exclude=[x]) >>>>> >>>>> >>> n = Wild('n', exclude=[x]) >>>>> >>>>> >>> m = Wild('m', exclude=[x]) >>>>> >>>>> >>> expr = ((1 + 2*x)**3) * ((F**(4*(5 + fx)))**6) * (6 + 7*(F**(4*(5 + >>>>> >>> fx))))**8 >>>>> >>>>> >>> pattern = ((c + d*x)**m) * ((F**(g*(e + fx)))**n) * (a + >>>>> >>> b*(F**(g*(e + fx))))**p >>>>> >>>>> >>> pprint(pattern) >>>>> >>>>> p n >>>>> >>>>> ⎛ g⋅(fx + e) ⎞ m ⎛ g⋅(fx + e)⎞ >>>>> >>>>> ⎝F ⋅b + a⎠ ⋅(x⋅d + c) ⋅⎝F ⎠ >>>>> >>>>> >>> pprint(expr) >>>>> >>>>> 8 >>>>> >>>>> 24⋅fx + 120 ⎛ 4⋅fx + 20 ⎞ 3 >>>>> >>>>> F ⋅⎝7⋅F + 6⎠ ⋅(2⋅x + 1) >>>>> >>>>> >>> expr.match(pattern) >>>>> >>>>> {p_: 1, g_: 1, m_: 3, d_: 2, n_: 0, e_: 23*fx + 120, c_: 1, a_: 0, b_: >>>>> (7*F**(4*fx + 20) + 6)**8} >>>>> >>>>> >>>>> We need to find a way to convert the expresison into known standard >>>>> form so pattern matching can be done peoperly or implement such >>>>> functionality in `.match()` itself. >>>>> >>>>> >>>>> Thanks >>>>> >>>>> >>>>> >>>>> On Thursday, March 9, 2017 at 12:16:41 AM UTC+5:30, Aaron Meurer wrote: >>>>>> >>>>>> That's sounds fine, though it should also include a docstring that >>>>>> lists the rule so we don't have to depend on the Rubi site. This will >>>>>> also >>>>>> let us generate some documentation on what rules are supported. >>>>>> >>>>>> We will likely want to extend the rules beyond what Rubi has >>>>>> eventually, so we should also consider that. >>>>>> >>>>>> Aaron Meurer >>>>>> >>>>>> On Wed, Mar 8, 2017 at 12:07 PM Arihant Parsoya <[email protected]> >>>>>> wrote: >>>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> I observed that rules in manualintegrate() are countable in number. >>>>>>> While implementing ~7000 rules, naming each rule is also going to be a >>>>>>> big >>>>>>> issue. I was thinking, names should be given based on the serial number >>>>>>> of >>>>>>> the rule in Rubi website. For example algebric rules for linear products >>>>>>> should be named as: >>>>>>> >>>>>>> >>> def rule_algebric_integrand_1_1_1_1(expr, symbol): >>>>>>> >>>>>>> ... return log(expr) >>>>>>> >>>>>>> >>>>>>> Using the above syntax for names of rules, we will be able to >>>>>>> uniquely identify each rule. Is this desirable? >>>>>>> >>>>>>> Thanks, >>>>>>> Arihant Parsoya >>>>>>> >>>>>>> On Monday, March 6, 2017 at 10:44:41 PM UTC+5:30, Abdullah Javed >>>>>>> Nesar wrote: >>>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> I was looking into sympy.integrals.manualintegrate.py it seems that >>>>>>>> the pattern matching (in manualintegrate) is quite different from what >>>>>>>> is >>>>>>>> expected in Rubi. As PR #7748 mentions we'll be using a better approach >>>>>>>> using decision tree, can you elaborate on what is expected? How >>>>>>>> decision >>>>>>>> tree concludes to a rule of integration then falls into function >>>>>>>> integrate() >>>>>>>> which contains rules like 1.1.1 (a + b*x)**m? >>>>>>>> >>>>>>>> Abdullah Javed Nesar >>>>>>>> >>>>>>>> On Monday, March 6, 2017 at 2:59:38 AM UTC+5:30, Aaron Meurer wrote: >>>>>>>>> >>>>>>>>> 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/8efee19b-fedd-4188-b00f-e68ecf288eb5%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/6e64ae8e-2c19-49ca-9d74-fb873ac77112%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/2d53f1c8-52b3-4a0a-89af-bf70d83d4df1%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%3D6LAW4VcRn8mqGfwoFLznJiFJCEo-0FkFt%3D0K0ga1eHfVA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
