Re: Precision available with NIntegrate {Method -> Oscillatory}
- To: mathgroup at smc.vnet.net
- Subject: [mg74111] Re: Precision available with NIntegrate {Method -> Oscillatory}
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Sat, 10 Mar 2007 06:55:44 -0500 (EST)
- Organization: The Open University, Milton Keynes, UK
- References: <eslsev$q3h$1@smc.vnet.net><esol7r$eeh$1@smc.vnet.net> <esr0pf$6ir$1@smc.vnet.net>
Peter wrote: > On Mar 8, 1:32 am, Jean-Marc Gulliet <jeanmarc.gull... at gmail.com> > wrote: >> Peter wrote: >>> Hi. I'm helping someone with a scientific programming problem, and I >>> wanted to get a high accuracy result to use as a reference solution. >>> I am able to get 15 digits of accuracy for a non-oscillatory integral, >>> but it appears that when I specify the option Method -> Oscillatory >>> for NIntegrate, it ignores my precision request: >>> -------------------------------------------------------------------- >>> a = 0; >>> b = 6706902 * 10^\(-7); >>> c = 589300 * 10^(-6); >>> d = 9802874 * 10^(-7); >>> t = -5026548 * 10^(-6); >>> =CE=B1 = 0; >>> Iint = NIntegrate[(b^2 - 2 d Cos[t + x] b + d^2 + (a + b c >>> x)^2)^(-3/2), {x, =CE=B1, Infinity}, {PrecisionGoal -> 15, WorkingPrecision >>> -> 30, MaxRecursion -> 200}] >>> NIntegrate::slwcon : >>> Numerical integration converging too slowly; suspect one of the >>> following: singularity, value of the integration being 0, oscillatory >>> integrand, or insufficient WorkingPrecision. If your integrand is >>> oscillatory try using the option Method->Oscillatory in NIntegrate. >>> More... >>> 1=2E46869038002327 >>> Cint = NIntegrate[Cos[x]/(b^2 - 2 d Cos[t + x] b + d^2 + (a + b c >>> x)^2)^(3/2), {x, =CE=B1, Infinity}, {PrecisionGoal -> 15, WorkingPrecision - >>>> 25, MaxRecursion -> 300, Method -> Oscillatory}] >>> 0=2E2592156 >>> -------------------------------------------------------------------- >>> I'm not concerned about the slow convergence warning on the first >>> integral, Iint. Rather, the second integral, Cint, is only evaluated >>> to a precision of 8 digits, despite the explicit request for more in >>> the call to Nintegrate. Does anyone have a suggestion to obtain 15 >>> digits of precision on the second integral? >>> Thanks, >>> Peter >> Set the system variable $MinPrecision to 15. >> >> In[1]:= >> a = 0; >> b = 6706902/10^7; >> c = 589300/10^6; >> d = 9802874/10^7; >> t = -5026548/10^6; >> >> Block[{$MinPrecision = 15}, >> Cint = NIntegrate[Cos[x]/(b^2 - 2*d*Cos[t + x]*b + >> d^2 + (a + b*c*x)^2)^(3/2), {x, 0, Infinity}, >> {PrecisionGoal -> 15, WorkingPrecision -> 30, >> MaxRecursion -> 300, Method -> Oscillatory}]] >> >> Precision[Cint] >> >> Out[6]= >> 0.2592155970460264 >> >> Out[7]= >> 15.988 >> >> Regards, >> Jean-Marc > > Thank-you, Jean-Marc. It worked. Could you please explain why it is > necessary? I thought that the options I passed to NIntegrate were > sufficient. > > Thanks, > Peter > > Hi Peter, Options such as PrecisionGoal as a wish. That is, NIntegrate will try to return a result with the desired precision. This is not guarantee, however. From the online help, "Even though you may specify PrecisionGoal -> n, the results you get may sometimes have much less than nâ??digit precision." OTOH, $MinPrecision is a system-wide variable. Setting it to a specific value coerces Mathematica to work at least at given level of precision: "By making the global assignment $MinPrecision = n, you can effectively apply SetPrecision[expr, n] at every step in a computation. This means that even when the number of correct digits in an arbitraryâ??precision number drops below n, the number will always be padded to have n digits. [1]" Section 3.1.5 "Arbitrary-Precision Numbers" is worth reading [1]. HTH, Jean-Marc [1] "The Mathematica Book Online / Advanced Mathematics in Mathematica / Numbers / 3.1.5 Arbitrary-Precision Numbers", http://documents.wolfram.com/mathematica/book/section-3.1.5