[Date Index]
[Thread Index]
[Author Index]
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.
Prev by Date:
**Integers in Mma**
Next by Date:
**beheading data objects**
Previous by thread:
**NIntegrate vs. N[Integrate]**
Next by thread:
**pattern matching**
| |