Re: Re: Need a better Integrate
- To: mathgroup at smc.vnet.net
- Subject: [mg43042] Re: [mg43019] Re: [mg42976] Need a better Integrate
- From: Dr Bob <drbob at bigfoot.com>
- Date: Sat, 9 Aug 2003 02:57:42 -0400 (EDT)
- References: <200308080426.AAA05622@smc.vnet.net>
- Reply-to: drbob at bigfoot.com
- Sender: owner-wri-mathgroup at wolfram.com
As best I can tell from a few experiments, that method is useful only when the integrand is of the form D[g, x] g^n, where g is a polynomial in x, in which case my integration rule works much faster. integratePower[x_] = {(b_)*(a_)^(n_) :> (b*a^(n + 1))/((n + 1)*D[a, x]) /; FreeQ[D[a, x]/b, x], (a_)^(n_) :> a^(n + 1)/((n + 1)*D[a, x]) /; FreeQ[D[a, x], x]}; g = 1 - 3x^2 + x^4; int = D[g, x] g^5; Timing[int /. integratePower[x]] Timing@MyIntegrate[int, x] {0.*Second, (1/6)* (1 - 3*x^2 + x^4)^6} {0.45300000000000007*Second, (1/6)*(1 - 3*x^2 + x^4)^6} My rule misses the simplification, however, if g is itself the power of a polynomial. g = Expand[(1 - x)^3]; int = D[g, x]*g^5; Timing[int /. integratePower[x]] Timing[MyIntegrate[int, x]] {0.*Second, (1/6)*(1 - 3*x + 3*x^2 - x^3)^6} {0.203*Second, (1/6)*(-1 + x)^18} But using Factor helps: g = Expand[(1 - x)^3]; int = D[g, x]*g^5; Timing[Factor[int] /. integratePower[x]] Timing[MyIntegrate[int, x]] {0.016*Second, (1/6)*(-1 + x)^18} {0.172*Second, (1/6)*(-1 + x)^18} (I Quit and reloaded definitions between tests. Otherwise, the second test of MyIntegrate goes faster -- but still slower than integratePower[x].) MyIntegrate goes into a seemingly infinite loop if you give it anything but a polynomial, so a better definition would start with MyIntegrate[f_, x_] /; PolynomialQ[f, x] := Bobby On Fri, 8 Aug 2003 00:26:32 -0400 (EDT), Andrzej Kozlowski <andrzej at platon.c.u-tokyo.ac.jp> wrote: > This seems quite hopeless except in the case when you are dealing with > polynomials (as in your example). That is because for general functions > "constants" can be "disguised" as all kinds of complicated expressions > involving identities such as Cos[x]^2+Sin[x]^2==1 etc, and there is not > general procedure for simplifying them, (although FullSimplify is pretty > good at it). Even for polynomials you can't hope for very much. In order > to apply "some clever algebra" you need an algebraic criterion of > simplicity, and LeafCount is not algebraic enough. So given a polynomial > f, which of the polynomials f+C (where C is a constant) will be the > simplest? Well, I propose the following very imperfect choice: if there > is a C such that f+C has discriminant 0 and FullSimplify[f+C] has > LeafCount less than f, we choose f+C, otherwise we stick with f. To > implement this we first define Discriminant ((borrowed from Daniel > Lichtblau) > > > Discriminant[p_?PolynomialQ, x_] := With[{n = Exponent[p, x]}, > Cancel[((-1)^(n(n - 1)/2)Resultant[p, D[p, x], x])/Coefficient[ > p, x, n]^(2n - 1)]] > > and now here is a rather clumsy first version of MyIntegrate: > > MyIntegrate[f_, x_] := Module[{ > g = Integrate[f, x], ls}, First[Select[ls = FullSimplify[Append[g + > C /. Solve[Discriminant[g + C, x] == 0, C], g]], (LeafCount[#] == > Min[LeafCount /@ ls]) &]]] > > > In the case of your example it behaves as you wanted: > > > MyIntegrate[x*(-5 + x^2)^3, x] > > > (1/8)*(-5 + x^2)^4 > > Of course , in many cases you will get the same answer as Integrate > gives, when a "simpler one" may be possible but at least you will never > get a more complicated one. > > Andrzej Kozlowski > Yokohama, Japan > http://www.mimuw.edu.pl/~akoz/ > http://platon.c.u-tokyo.ac.jp/andrzej/ > > > > On Thursday, August 7, 2003, at 06:53 AM, Ersek, Ted R wrote: > >> A user sent me an email with an interesting problem. See below. >> >> In[1]:= deriv = D[(-5 + x^2)^4/8, x] >> >> Out[1]= x*(-5 + x^2)^3 >> >> >> In[2]:= int = FullSimplify[Integrate[x*(-5 + x^2)^3, x]]; >> >> Out[2]= (x^2*(-10 + x^2)*(50 - 10*x^2 + x^4)) >> >> >> Why doesn't FullSimplify return (-5 + x^2)^4/8 which is simpler? >> It doesn't because the expression Integrate returned is different from >> (-5 + x^2)^4/8 by 625/8. Of course both answers are correct because >> the >> result of an indefinite integral includes an arbitrary constant. >> However, >> Mathematica never includes the constant in the result Integrate returns. >> In the next line we get the result we expected above. >> >> In[3]:= Factor[int + 625/8] >> >> Out[3]= (-5+x^2)^4/8 >> >> >> I wonder if somebody can figure out how to define a better integrate >> that >> would do the following: >> >> MyIntegrate[f_,x_]:= FullSimplify[Integrate[f,x]+const] >> (* Through some clever algebra find the value of (const) that will give >> the simplest answer. *) >> >> >> We would then get: >> In[4]:= MyIntegrate[x*(-5 + x^2)^3, x] >> >> Out[4]= (-5+x^2)^4/8 >> >> >> ------------------- >> Regards, >> Ted Ersek >> >> >> >> > > -- majort at cox-internet.com Bobby R. Treat
- References:
- Re: Need a better Integrate
- From: Andrzej Kozlowski <andrzej@platon.c.u-tokyo.ac.jp>
- Re: Need a better Integrate