In addition the difference between NDSolve
and other solvers that @acl cites, the following about whether "and" in the quoted passage means "and":
NDSolve adapts its step size so that the estimated error in the solution is just within the tolerances specified by PrecisionGoal and AccuracyGoal.
Here, the "estimated error" refers to local error at the step, not to an estimate of accumulated error. I refer to Norms in NDSolve:
NDSolve uses norms of error estimates to determine when solutions satisfy error tolerances. In nearly all cases the norm has been weighted, or scaled, such that it is less than 1 if error tolerances have been satisfied and greater than 1 if error tolerances are not satisfied.
The norm may be specified by NormFunction
. The standard one used is NDSolve`ScaledVectorNorm
, which is documented at the end of the norms tutorial. Its usage has the following form. Let prec
and acc
be the PrecisionGoal
and AccuracyGoal
respectively. Let sol
and err
be the solution vector and truncation error estimate (actual, not relative). Finally, let p
be the exponent of the norm (1 <= p <= Infinity
, as in the $L^p$ norm). Then the typical usage is the following:
ScaledVectorNorm[p, {10^-prec, 10^-acc}][err, sol]
And the form
$$\left(\frac{1}{n} \sum _{j=1}^n \left(\frac{\left|
\text{err}_j\right| }{10^{-\text{acc}}+10^{-\text{prec}} \left|
\text{sol}_j\right| }\right){}^p\right){}^{{1}/{p}}\tag{1}$$
The scaled norm used in an NDSolve
problem may be obtained like this (from the tutorial):
state = First[
NDSolve`ProcessEquations[{x''[t] + x[t] == 0,
x[0] == 1, x'[0] == 0}, x, t]];
(*...*)
svn = state["Norm"]
(* Out[]= NDSolve`ScaledVectorNorm[2, {1.05367*10^-8,
1.05367*10^-8}, NDSolve`ProcessEquations]*)
Now, what about "and"? It's closer to an "or", a "fuzzy or", if you will.
As noted in my answer to Is manual adjustment of AccuracyGoal and PrecisionGoal useless?,
when
When $10^{-\text{prec}}\,\|\text{sol}\| <\mskip-4mu< 10^{-\text{acc}}$, the approximation
$$10^{-\text{acc}} + 10^{-\text{prec}}\,\|\text{sol}\| \approx 10^{-\text{acc}}$$
implies that if the error indicates that $\text{sol}$ is correct to at least $\text{acc}$ digits past the decimal point, the error is acceptable.
And when $10^{-\text{acc}} <\mskip-4mu< 10^{-\text{prec}}\,\|\text{sol}\|$, the approximation
$$10^{-\text{acc}} + 10^{-\text{prec}}\,\|\text{sol}\| \approx 10^{-\text{prec}}\,\|\text{sol}\|$$
implies that if the error indicates that $\text{sol}$ is correct to at least the leading $\text{prec}$ digits, the error is acceptable.
When $10^{-\text{prec}}\,\|\text{sol}\|$ is approximately equal to $10^{-\text{acc}}$, there is a fuzzy transition, with the acceptable error being $2\times10^{-\text{acc}}$ when they are dead equal.
Thus depending on how $\|\text{sol}\|$ varies,
the error criterion can be dominated by precision or accuracy. Ignoring the transistion, one could roughly simplify the criterion as
$$\|\text{err}\| \lessapprox \mathop{\text{max}}\left(10^{-\text{prec}}\,\|\text{sol}\|,10^{-\text{acc}}\right) \,.$$
Finally a caveat:
The error estimations are usually theoretical bounds on the error. They are based on (1) assumptions about the differential equation and its solution and (2) discrete sampling. Thus in various ways the error may be mis-estimated in edge-cases.
In sum, the OP seems to have accurately grasped WorkingPrecision
. In my mind, I think of it as a way to manage the effect of round-off errors. In a numerically unstable problem, raising it may be the best way to solve the problem. I think of AccuracyGoal
as defining how big zero is: that is, errors less than it can be accepted as equivalent to zero error. It also mean that it is acceptable for solutions less than it in magnitude to bounce between positive and negative values. I think of PrecisionGoal
as the precision goal for solutions when they are larger than the magnitude implied by AccuracyGoal.