Option maxfun for Numerical Solution of ODE Initial Value Problems
Description
Examples
Invoking the dsolve function with the numeric option and output=procedurelist (default), output=listprocedure or output=operator causes dsolve to return procedure(s) to numerically solve the input ODE system.
Prior to returning this procedure, the input system is converted to a first order system (by introduction of new variables if necessary), then solved with respect to those first order derivatives giving a system of the form:
x'⁡t=f1⁡t,x⁡t,y⁡t
y'⁡t=f2⁡t,x⁡t,y⁡t
During the course of the numerical solution of the ODE system, it is necessary to evaluate the functions f1, f2 above for different values of t, x, y, to obtain the values of the derivatives x', y'.
The option maxfun=n in the call to dsolve,numeric gives an upper limit of n on the total number of evaluations performed on f1, f2 for any single call to the procedure returned by dsolve. Note that the evaluation of both f1, f2 at one set of values of t, x, y is considered to be a single evaluation.
This option is provided as a means of limiting the amount of work performed on any single call to the solution procedure, and as a means of preventing the computation from running forever when it encounters a singularity in the solution of the ODE.
When the maxfun function evaluation limit is exceeded, the solution procedure halts with an error of the form Error, (in <proc>) too many function evaluations in <method>.
This option is available for the rkf45, ck45, rosenbrock, dverk78, lsode, gear, and classical methods.
For the dverk78, lsode, and gear methods, this option is disabled by default. For the rkf45, ck45, and rosenbrock methods, the default setting is maxfun=30000, while for the classical methods, the default setting is maxfun=50000.
A setting of maxfun=0 disables the option.
This option is useful for some variable step methods, as without this limit it is possible for a calculation to run forever, and never get past a certain point in the integration (if the step size were, for example, halving at each step of the numerical integration). This can happen when singularities are present. It is also useful when the function to be evaluated is large and complex or is expensive to evaluate (say, for example, a procedure call that does a numerical sum).
Consider the DE:
DE≔diff⁡y⁡t,t=cos⁡t2⁢y⁡t
DE≔ⅆⅆty⁡t=cos⁡t2⁢y⁡t
A numerical routine for the solution of this DE is obtained by using dsolve and the rkf45 method as follows:
ysol≔dsolve⁡DE,y⁡0=1,numeric,method=rkf45
ysol ≔ procx_rkf45...end proc
The routine is then applied to a value to obtain the numerical solution at that point:
ysol⁡5
t=5.,y⁡t=1.84313059855996
Suppose that instead we wanted to integrate out to t=200. If we attempt to do this with the generated routine, a problem occurs.
ysol⁡200
Error, (in ysol) cannot evaluate the solution further right of 50.435782, maxfun limit exceeded (see ?dsolve,maxfun for details)
Integrating this DE out to t=200 actually requires nearly half a million function evaluations due to the O⁡t2 increase in the rate of change of the function on the right-hand side. This can take some time for computation, so maxfun acts like a stopcheck here.
If we really want this value, we can increase the value of maxfun from its default of 30000 to 500000, and obtain a solution as follows:
ysol≔dsolve⁡DE,y⁡0=1,numeric,method=rkf45,maxfun=500000
t=200.,y⁡t=1.87563347676955
Alternatively, we could have set maxfun to 0, and then the routine would proceed until it found the value at the specified point, or recognized a singularity.
The ODE IVP:
dsys≔diff⁡y⁡t,t=y⁡t21−100⁢y⁡t,y⁡0=1200:
has a fast blow-up singularity just past t=30.
If we attempt to numerically integrate this IVP to t=31, we get:
ysol≔dsolve⁡dsys,numeric,method=rkf45,abserr=1.×10−7,relerr=1.×10−7
ysol⁡31
Error, (in ysol) cannot evaluate the solution further right of 30.685303, maxfun limit exceeded (see ?dsolve,maxfun for details)
Or implicitly using the range argument:
ysol≔dsolve⁡dsys,numeric,method=rkf45,abserr=1.×10−7,relerr=1.×10−7,range=0..31
This error tells us that integration over this region required more than the default of 30000 evaluations of the DE. This seems to indicate that we need to increase maxfun. In doing so, we get:
ysol≔dsolve⁡dsys,numeric,method=rkf45,abserr=1.×10−7,relerr=1.×10−7,maxfun=100000
Error, (in ysol) cannot evaluate the solution further right of 30.685337, maxfun limit exceeded (see ?dsolve,maxfun for details)
we see that we still hit the maxfun barrier, though the integration does proceed a small bit further.
Since there is an actual singularity, this is a case where the singularity detection fails and maxfun set to 30000 prevents the calculation from running for an excessive time while serving no useful purpose.
See Also
dsolve[ck45]
dsolve[classical]
dsolve[dverk78]
dsolve[gear]
dsolve[lsode]
dsolve[numeric,IVP]
dsolve[numeric]
dsolve[rkf45]
dsolve[rosenbrock]
Download Help Document