Re: NIntegrate vs. N[Integrate]

*To*: mathgroup at yoda.physics.unc.edu*Subject*: Re: NIntegrate vs. N[Integrate]*From*: keiper*Date*: Mon, 26 Jul 93 08:48:12 CDT

Mangalam Vasudaven <TVASUDAVE at cc.curtin.edu.au> writes > I was always under the impression that it is a lot more > efficient to use NIntegrate when one is trying to get > approximate values of definite integrals than surround > it by N[]. But while playing around with some gamma integrals > I found that NIntegrate took sixty times as much time as > the second method. BTW, Mathematica Book, in page 683, > confirms my original impression. > p[x_]:= Integrate[(y^6)*(E^-y)/6!,{y,0,x}] > NIntegrate[ p[x]*(1-p[x]),{x,0,200}] > Now, the NIntegrate took 336.36 seconds. And > N[Integrate[p[x]*(1-p[x]),{x,0,200},10] > took just 5.66 seconds, giving an answer accurate to more > decimal places than NIntegrate, incidently. Why does this > happen? Being a novice to Mathematica, I could not figure out > why. There are two issues in the above example that are important: 1) NIntegrate[ ] has the Attribute HoldAll. This means that as the the algorithm proceeds and sample values of x are chosen they will be substituted into the integrand p[x]*(1-p[x]) and Integrate[ ] will be evaluated twice FOR EACH VALUE OF x. I am surprised that it only took 336.36 seconds! If instead you define p[x_] = Integrate[(y^6)*(E^-y)/6!,{y,0,x}] you evaluate the Integrate[ ] once and the timings are quite different: In[5]:= Timing[NIntegrate[ p[x]*(1-p[x]),{x,0,200}]] Out[5]= {10.7667 Second, 1.46631} In[6]:= Timing[NIntegrate[ p[x]*(1-p[x]),{x,0,Infinity}]] General::under: Underflow occurred in computation. Out[6]= {8.76667 Second, 1.46631} 2) Timing the total time to evaluate Integrate[ ] three times and evalute the resulting function numerically has little meaning other than that the total time was whatever it was. It is not clear just what the problem is, but if it is to evaluate the integral for various limits of integration it is probably best to evaluate it once and for all symbollically, and then evaluate the symbolic result with various numerical values: In[8]:= q[x0_, x1_] = Integrate[p[x]*(1-p[x]),{x, x0, x1}]; In[9]:= Timing[N[q[0, 200], 150]] Out[9]= {0.1 Second, 1.4663085937499999999999999999999999999\ > 9999999999999999999999999999999999999986932189377841056111\ > 6480220211033432215508557551981108896417994036563728038} Jerry B. Keiper keiper at wri.com Worfram Research, Inc.