To get the warning
Raise the PrecisionGoal
:
NIntegrate[BesselJ[2, x], {x, 0, 50000}, PrecisionGoal -> 10]
NIntegrate::ncvb: NIntegrate failed to converge to prescribed accuracy after 9 recursive bisections in x near {x} = {97.6563}. NIntegrate obtained -0.00247946 and 0.004932015473174114` for the integral and error estimates. >>
(* -0.00247946 *)
Or raise the number of "Points"
:
NIntegrate[BesselJ[2, x], {x, 0, 50000}, Method -> {"LevinRule", "Points" -> 11}]
NIntegrate::ncvb: NIntegrate failed to converge to prescribed accuracy after 9 recursive bisections in x near {x} = {97.6563}. NIntegrate obtained 0.029764272686778833and 0.029476870687760864
for the integral and error estimates. >>
(* 0.0297643 *)
Some fixes
Raise recursion:
NIntegrate[BesselJ[2, x], {x, 0, 50000}, PrecisionGoal -> 10, MaxRecursion -> 20]
(* 1.00248 *)
Or raise the number of "Points" further:
NIntegrate[BesselJ[2, x], {x, 0, 50000}, Method -> {"LevinRule", "Points" -> 101}]
(* 1.00248 *)
Or use infinite intervals:
NIntegrate[BesselJ[2, x], {x, 0, Infinity}] -
NIntegrate[BesselJ[2, x], {x, 50000, Infinity}]
(* 1.00248 *)
How to detect
Users are warned that the error estimator can be tricked in tutorial/NIntegrateIntegrationRules#81420002
. Some possible checks one might try are: The default PrecisionGoal
seems to be about 6
. Raising this to 8
or 10
might lead to a significantly different result when the numerical integration has not yet converged. I usually first try WorkingPrecision -> 20
, which simultaneously raises PrecisionGoal
to 10
. In a highly oscillatory integral like this one (many periods over a finite interval), one has to worry about the sampling being sufficiently fine. Note that infinite intervals are handled better in this case; I'm not sure what NIntegrate
does differently, but integrals to infinity probably require a different sort of handling.