Re: NIntegrate and speed
- To: mathgroup at smc.vnet.net
- Subject: [mg118540] Re: NIntegrate and speed
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Mon, 2 May 2011 06:51:41 -0400 (EDT)
> I am trying to numerically integrate, in Mathematica 8, the following: > NIntegrate[y Exp[-t],{y,-1,1},{t,-1,1}]. These are all pretty fast: Clear[i] Timing[ (i[y_, t_] = Integrate[y Exp[-t], y, t]); list = i @@@ Tuples@{{-1, 1}, {-1, 1}}; list.{1, -1, -1, 1} ] {0.001188, 0} Timing@Integrate[y Exp[-t], {y, -1, 1}, {t, -1, 1}] {0.042455, 0} Timing@NIntegrate[y Exp[-t], {y, -1, 1}, {t, -1, 1}] {0.005376, 0.} ... and here's a sanity check with different limits: Clear[i] yLimits = {-1/2, 1}; tLimits = {-1, 2}; Timing[ (i[y_, t_] = Integrate[y Exp[-t], y, t]); list = i @@@ Tuples@{yLimits, tLimits}; list.{1, -1, -1, 1} // N ] {0.001236, 0.968605} Timing@N@Integrate[ y Exp[-t], {y, Sequence @@ yLimits}, {t, Sequence @@ tLimits}] {0.043329, 0.968605} Timing@NIntegrate[y Exp[-t], Evaluate@{y, Sequence @@ yLimits}, Evaluate@{t, Sequence @@ tLimits}] {0.005648, 0.968605} Bobby On Sun, 01 May 2011 05:22:14 -0500, Fahim Chandurwala <fchandur at gmail.com> wrote: > On Mar 2, 5:40 am, "Kevin J. McCann" <Kevin.McC... at umbc.edu> wrote: >> A couple of comments. (1) Bobby, your times are amazingly fast. I am >> running a 3.6 GHz quad-core i5 processor with 4G of memory and my times >> are quite a bit longer than yours; (2) my timings with ff done >> numerically are about twice as as fast as the symbolic: >> >> (* Symbolic evaluation of ff ala Bobby *) >> R = 8000; Z = 1; rd = 3500; >> Timing[Clear[ff]; >> ff[t_] = Integrate[Cos[t R Sin[\[Theta]]], {\[Theta], 0, \[Pi]}, >> Assumptions -> {t >= 0}]; {ff[t], >> i2 =NIntegrate[( >> Exp[-k Abs[Z]] ff[k])/(1 + (k rd)^2)^1.5, {k, 0, \[Infinity]}]}] >> >> {22.907, {\[Pi] BesselJ[0, 8000 t], 0.000424068}} >> >> (* Numerical evaluation of ff ala Kevin *) >> R = 8000; Z = 1; rd = 3500; >> Clear[ff]; >> ff[t_?NumericQ] := >> NIntegrate[Cos[t R Sin[\[Theta]]], {\[Theta], 0, \[Pi]}]; >> Timing[{ff[t], >> i2 =NIntegrate[( >> Exp[-k Abs[Z]] ff[k])/(1 + (k rd)^2)^1.5, {k, 0, \[Infinity]}]}] >> >> {13.484, {ff[t], 0.000424067}} >> >> I guess it depends a lot on the computer. Incidentally, I am running >> 64-bit Mathematica 8 under 64-bit Vista. >> >> Kevin >> >> On 3/1/2011 5:29 AM, DrMajorBob wrote: >> >> >> >> >> >> >> >> > The inner integration is much faster done symbolically: >> >> > Timing[Clear[ff]; >> > ff[t_] = >> > Integrate[Cos[t*R*Sin[\[Theta]]], {\[Theta], 0, \[Pi]}, >> > Assumptions -> {t>= 0}]; >> > {ff[t], i2 = >> > NIntegrate[ >> > Exp[-k*Abs[Z]]/(1 + (k*rd)^2)^1.5*ff[k], {k, 0, \[Infinity]}]} >> > ] >> >> > {0.725109, {\[Pi] BesselJ[0, 8000 t], 0.000424068}} >> >> > Bobby >> >> > On Mon, 28 Feb 2011 03:59:54 -0600, Daniel Lichtblau<d... at wolfram.com> >> > wrote: >> >> >> ----- Original Message ----- >> >>> From: "Marco Masi"<marco.m... at ymail.com> >> >>> To: mathgr... at smc.vnet.net >> >>> Sent: Sunday, February 27, 2011 3:35:46 AM >> >>> Subject: NIntegrateand speed >> >>> I have the following problems withNIntegrate. >> >> >>> 1) I would like to make the following double numerical integral >> >>> converge without errors >> >> >>> R = 8000; Z = 1; rd = 3500; >> >>>NIntegrate[Exp[-k Abs[Z]]/(1 + (k rd)^2)^1.5 (NIntegrate[Cos[k R >> >>> Sin[\[Theta]]], {\[Theta], 0, \[Pi]}]), {k, 0, \[Infinity]}] >> >> >>> It tells non numerical values present and I don't understand why, >> >>> since it evaluates finally a numerical value? 0.000424067 >> >> >> You presented it as an iterated integral. Mathematically that is fine >> >> but from a language semantics viewpoint you now have a small >> problem. It >> >> is that the outer integral cannot correctly do symbolic analysis of >> its >> >> integrand but it may try to do so anyway. In essence, the outer >> >> integrand "looks" to be nonnumerical until actual values areplugged >> in >> >> for the outer variable of integration. >> >> >> There are (at least) two ways to work around this. One is to recast >> as a >> >> double (as opposed to iterated) integral. >> >> >> Timing[i1 = >> >> NIntegrate[ >> >> Exp[-k*Abs[Z]]/(1 + (k*rd)^2)^(3/2)* >> >> Cos[k*R*Sin[\[Theta]]], {\[Theta], 0, \[Pi]}, {k, >> >> 0, \[Infinity]}]] >> >> {39.733, 0.0004240679194556497} >> >> >> An alternative is to define the inner function as a black box that >> only >> >> evaluates for numeric input. In that situation the >> outerNIntegratewill >> >> not attempt to get cute with its integrand. >> >> >> ff[t_?NumericQ] := >> >> NIntegrate[Cos[t* R*Sin[\[Theta]]], {\[Theta], 0, \[Pi]}] >> >> >> In[90]:= Timing[ >> >> i2 =NIntegrate[ >> >> Exp[-k* Abs[Z]]/(1 + (k* rd)^2)^1.5 *ff[k], {k, 0, \[Infinity]}]] >> >> Out[90]= {26.63, 0.0004240673399701612} >> >> >>> 2) Isn't the second integrand a cylindrical Bessel function of order >> >>> 0? So, I expected that >> >>>NIntegrate[Exp[-k Abs[Z]]/(1 + (k rd)^2)^1.5 BesselJZero[0, k R], {k, >> >>> 0, \[Infinity]}] doing the same job. But it fails to converge and >> >>> gives 0.00185584- i4.96939*10^-18. Trying with WorkingPrecision >> didn't >> >>> make things better. How can this be fixed? >> >> >> Use the correct symbolic form of the inner integral. It involves >> BesselJ >> >> rather than BesselJZero. >> >> >> In[91]:= ff2[t_] = >> >> Integrate[Cos[t* Sin[\[Theta]]], {\[Theta], 0, \[Pi]}, >> >> Assumptions -> Element[t, Reals]] >> >> Out[91]= \[Pi] BesselJ[0, Abs[t]] >> >> >> In[92]:= Timing[ >> >> i3 =NIntegrate[ >> >> Exp[-k Abs[Z]]/(1 + (k *rd)^2)^(3/2)* ff2[k*R], {k, >> >> 0, \[Infinity]}]] >> >> Out[92]= {0.7019999999999982, 0.0004240679192434893} >> >> >> Not surprisingly this is much faster, and will help to get you past >> the >> >> speed bumps you allude to below. >> >> >>> 3) The above Nintegrals will go into a loop and should be evaluated >> as >> >>> fast as possible. How? With Compile, CompilationTarget -> "C", >> >>> Paralleization, etc.? >> >> >>> Any suggestions? >> >> >>> Marco. >> >> >> Compile will not help because most of the time will be spent in >> >>NIntegratecode called from the virtual machine of the run time library >> >> (that latter if you compile to C). Evaluating in parallel should >> help. >> >> Also there might be option settings that allowNIntegrateto handle >> this >> >> faster than by default but without significant degradation in >> quality of >> >> results. Here is a set of timings using a few different methods, and >> >> have PrecisionGoal set fairly low (three digits). >> >> >> In[109]:= Table[ >> >> Timing[NIntegrate[ >> >> Exp[-k Abs[Z]]/(1 + (k *rd)^2)^(3/2)* \[Pi] BesselJ[0, >> >> Abs[k*R]], {k, 0, \[Infinity]}, PrecisionGoal -> 3, >> >> Method -> meth]], {meth, {Automatic, "DoubleExponential", >> >> "Trapezoidal", "RiemannRule"}}] >> >> >> During evaluation of In[109]:=NIntegrate::ncvb:NIntegratefailed to >> >> converge to prescribed accuracy after 9 recursive bisections in k >> near >> >> {k} = {0.0002724458978988764}.NIntegrateobtained >> >> 0.00042483953211734914` and 0.000012161444876769691` for the integral >> >> and error estimates.>> >> >> >> Out[109]= {{0.6709999999999923, >> >> 0.0004240678889181539}, {0.0150000000000432, >> >> 0.0004240644189596502}, {0.03100000000000591, >> >> 0.0004240644189596502}, {0.04699999999996862, >> >> 0.0004248395321173491}} >> >> >> I rather suspect there are more option tweaks that could make this >> >> faster still without appreciable degradation in quality of results. >> >> >> Daniel Lichtblau >> >> Wolfram Research > > I am trying to numerically integrate, in Mathematica 8, the following: > NIntegrate[y Exp[-t],{y,-1,1},{t,-1,1}]. It gives me slow convergence > errors and is slow. Of course, it works fine if I just symbolically, > integrate this function. But my concern is timing. Is there a way to > have Mathematica give me the best answer it can reach in a specified > time? Setting PrecisionGoal and AccuracyGoals arent vvery helpful in > speeding up the process. Technically I am trying to do quadruple > integral about 11^4 times. Therefore speed is a huge concern, and > accuracy isn't. Especially if something is close to Zero. Thank you. > -- DrMajorBob at yahoo.com