Yes, a primitive function is unique only up to a constant but it is not strictly correct to pick out a particular one since the constant is arbitrary. This may be an academic point but I would have thought that it would be possible to construct the algorithm in such a way that a constant is washed out or if included just be named constant or similar and added after to the unique part.
Cheers, Gösta Den mån 13 jan. 2020 kl 14:15 skrev Oscar Benjamin < [email protected]>: > The integrate function when used without limits finds an > antiderivative. In general antiderivatives are not unique and can > differ by a constant which I think is the case here. The > simplifications below won't work though unless the symbols are > declared positive: > > In [44]: a, b, x = symbols('a b x', positive=True) > > In [45]: f = x / sqrt(a*x + b) > > In [46]: integral = integrate(f, x) > > In [47]: simplify(integral.diff(x) - f) > Out[47]: 0 > > In [48]: expected = 2 * sqrt(a*x + b) * (a*x - 2*b) / (3*a**2) > > In [49]: simplify(integral - expected) > Out[49]: > 3/2 > 4⋅b > ────── > 2 > 3⋅a > > > The integral result from sympy does seem unnecessarily complicated in > this example though. You can get a more natural form by using > manualintegrate: > > In [55]: integral = integrate(f, x, manual=True) > > In [56]: factor(integral) > Out[56]: > _________ > 2⋅(a⋅x - 2⋅b)⋅╲╱ a⋅x + b > ───────────────────────── > 2 > 3⋅a > > That's the result you expected and that's because it is also > (probably) calculated using integration by parts. > > -- > Oscar > > On Mon, 13 Jan 2020 at 11:33, Gösta Ljungdahl <[email protected]> wrote: > > > > Apparently there is some error in the integrate algorithm. > > > > Consider the following integral: > > > > int(x/sqrt(ax+b)) which is 2*sqrt(ax+b)*(ax-2b)/(3a**2) as is easily > confirmed doing integration by parts. Many integral tables (not all) has > this integral correctly listed. > > > > sympy 1.4 gives me this: > > > > code (ipython 7.5.0): > > In [1]: from sympy import * > > > > In [2]: a,b,x=symbols('a b x') > > > > In [6]: f=x/sqrt(a*x+b) > > > > In [7]: int=integrate(f,x) > > > > In [8]: factor(int) > > Out[8]: 2*sqrt(b)*(a*x*sqrt(a*x/b + 1) - 2*b*sqrt(a*x/b + 1) + > 2*b)/(3*a**2) > > > > where clearly the last term shouldn't be there. > > > > Hope this can help improving the integrate algorithm. > > > > -- > > 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 view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/b9fe9ccf-68cb-4720-a5a3-e36dfdbc620e%40googlegroups.com > . > > -- > 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 view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/CAHVvXxQP_0U3st2S8NVH3FFdq8xNGPR%3DrSBzMLRqRnNqYL%2BJ8Q%40mail.gmail.com > . > -- 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 view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAM0odp8u0zebpTdsBycjYuZV%2B7tSxL9w2SiGyFFFxDfbkeJrAA%40mail.gmail.com.
