4
$\begingroup$

This might have been asked before but I couldn't find the answer. I want to perform an indefinite integral. I tried it both on Mathematica and Maple and the commutation time is significantly different. It takes roughly 45 seconds on Mathematica while it's instantaneous with Maple. Could someone give an answer to why this is and how to speed up the computation on Mathematica? Here is the integral:

Integrate[-(1/((1/2 + x) (1.`15.048133091869577 - 0.7271265201866038` x - 
  0.14586605445765533` x^2 - 0.14353734279040942` x^3 - 
  0.34371764036609265` x^4 + 0.04221841339432375` x^5 - 
  6.584428946770302` x^6))), x] // Timing

Now I tried to speed it up by using Apart and Distribute like this

-(1/((1/2 + x) (1.`15.048133091869577 - 0.7271265201866038` x - 
 0.14586605445765533` x^2 - 0.14353734279040942` x^3 - 
 0.34371764036609265` x^4 + 0.04221841339432375` x^5 - 
 6.584428946770302` x^6)));
 Apart[%];
 Distribute[Integrate[%, x]] // Timing

But this I had to stop because it was giving me anything after several minutes. The workaround is to Distribute "integrate" and then replace it with Integrate.

-(1/((1/2 + x) (1.`15.048133091869577 - 0.7271265201866038` x - 
 0.14586605445765533` x^2 - 0.14353734279040942` x^3 - 
 0.34371764036609265` x^4 + 0.04221841339432375` x^5 - 
 6.584428946770302` x^6)));
 Apart[%];
 Distribute[integrate[%, x]];
 %/. integrate -> Integrate // Timing

And in this case, the computation only takes 0.04 seconds.

Note that all 3 approaches worked just fine on Maple and gave result as soon as I pressed enter.

$\endgroup$
  • 1
    $\begingroup$ I suspect the Distribute[Integrate[...]] is not doing what you intend. Map would get it done quickly. Try e1=...; e2 = Apart[e1];Timing[Map[Integrate[#, x] &, e2]]. $\endgroup$ – Daniel Lichtblau Feb 2 '18 at 18:06
  • $\begingroup$ Thanks @DanielLichtblau ! Using Map is much faster. It's actually the fastest approach. I need to remember to use map more often. $\endgroup$ – Karim Feb 5 '18 at 11:54
4
$\begingroup$

It's usually better to use exact input for exact solvers:

N@Integrate[
   Rationalize[-(1/((1/2 + x) (1.`15.048133091869577 - 
           0.7271265201866038` x - 0.14586605445765533` x^2 - 
           0.14353734279040942` x^3 - 0.34371764036609265` x^4 + 
           0.04221841339432375` x^5 - 6.584428946770302` x^6))), 0], 
   x] // AbsoluteTiming

(*
{0.096958,
 -0.820105 Log[0.5 + x] + 
   0.0546737 (3.10295 Log[-0.627436 + x] + (1.4933 + 
        1.65819 I) Log[(-0.414587 - 0.597065 I) + x] + (1.4933 - 
        1.65819 I) Log[(-0.414587 + 0.597065 I) + x] + (1.37539 + 
        2.17793 I) Log[(0.338503 - 0.691313 I) + x] + (1.37539 - 
        2.17793 I) Log[(0.338503 + 0.691313 I) + x] + 
     6.15967 Log[0.773193 + x])}
*)

SetPrecision is a little faster than Rationalize:

N@Integrate[SetPrecision[
    -(1/((1/2 + x) (1.`15.048133091869577 - 0.7271265201866038` x - 
           0.14586605445765533` x^2 - 0.14353734279040942` x^3 - 
           0.34371764036609265` x^4 + 0.04221841339432375` x^5 - 
           6.584428946770302` x^6))),
    Infinity], x] // AbsoluteTiming
(*
{0.059878, 
 1.80144*10^16 (4.5525*10^-17 (0.206864 Log[-1.25487 + 2 x] +
         (0.0995533 + 0.110546 I) Log[(-0.829175 - 1.19413 I) + 2 x] +
         (0.0995533 - 0.110546 I) Log[(-0.829175 + 1.19413 I) + 2 x] +
         (0.0916924 + 0.145195 I) Log[(0.677006 - 1.38263 I) + 2 x] +
         (0.0916924 - 0.145195 I) Log[(0.677006 + 1.38263 I) + 2 x] + 
         0.410645 Log[1.54639 + 2 x]) - 4.5525*10^-17 Log[1. + 2. x])}
*)
$\endgroup$
  • $\begingroup$ Thanks for the help. That is precisely what I was looking for. $\endgroup$ – Karim Feb 2 '18 at 15:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.