How to force Mathematica to throw an error for NIntegrate

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.


This looks like a bug. May be another branch cut bug. So, Mathematica can't throw an error, since it does not know that it is a bug.

sol = Integrate[BesselJ[2, x], x];
N[Limit[sol, x -> 50000] - Limit[sol, x -> 0]]
(* 1.00248   *)

The problem is in the NIntegrate when it evaluated the limits.

 sol = N[Integrate[BesselJ[2, x], {x, 0, 50000}]]
 (*1.00248*)

 sol = NIntegrate[BesselJ[2, x], {x, 0, 50000}]
 (*0.00247764*)

Version 10.02, windows.

Please report this to [email protected]