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.029764272686778833
and 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]