bads[1/4, 1/16]
generates four distinct error messages, in addition to General::stop
, which limits the number of identical errors printed. They are
Do[test[1/4, 1/16, x, y], {x, 5, 40}, {y, x, 80}]; $MessageList // Union // Rest
(* {HoldForm[InterpolatingFunction::dmval], HoldForm[NDSolveValue::mxst],
HoldForm[NDSolveValue::nderr], HoldForm[NDSolveValue::ndtol]} *)
InterpolatingFunction::dmval
occurs here when integration stops before reachingx = 0
NDSolveValue::ndtol
occurs when the requestedPrecisionGoal
andAccuracyGoal
are too large in comparison withWorkingPrecision
NDSolveValue::mxst
occurs when the number of integration steps exceedsMaxSteps
NDSolveValue::nderr
is an inexplicable error often associated with largeWorkingPrecision
The ListPlot
in the question can be modified to distinguish among these errors, for instance,
dmval = Quiet[ListPlot[Reap[Do[Check[test[1/4, 1/16, x, y], Sow[{x, y}],
InterpolatingFunction::dmval], {x, 5, 40}, {y, x, 80}]][[2, 1]],
PlotRange -> All, PlotStyle -> Blue]]
and similarly for the other errors. Combining the results gives
Show[dmval, ndtol, mxst, nderr, ImageSize -> Large,
AxesLabel -> {AccuracyGoal, WorkingPrecision}, LabelStyle -> {15, Bold, Black}]
which is intended to indicate the primary error. Of course, multiple errors can occur from a single call to NDSolveValue
, and almost any other error also causes InterpolatingFunction::dmval
. As noted in my earlier comment, in those instances where it is the only error, the integration has inexplicably stopped just short of the endpoint. Adjusting the endpoint slightly seems to solve the problem here. NDSolveValue::ndtol
is resolved by increasing WorkingPrecision
or (here) decreasing AccuracyGoal
. NDSolveValue::mxst
, is eliminated simply by increasing MaxSteps
. Method -> "StiffnessSwitching"
sometimes eliminates NDSolveValue::nderr
, and sometimes not.