maxfun - Maple Help
For the best experience, we recommend viewing online help using Google Chrome or Microsoft Edge.

Online Help

All Products    Maple    MapleSim


Option maxfun for Numerical Solution of ODE Initial Value Problems

 

Description

Examples

Description

• 

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=f1t,xt,yt

y't=f2t,xt,yt

• 

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).

Examples

Consider the DE:

DEdiffyt&comma;t=cost2yt

DE&DifferentialD;&DifferentialD;tyt=cost2yt

(1)

A numerical routine for the solution of this DE is obtained by using dsolve and the rkf45 method as follows:

ysoldsolveDE&comma;y0=1&comma;numeric&comma;method=rkf45

ysolprocx_rkf45...end proc

(2)

The routine is then applied to a value to obtain the numerical solution at that point:

ysol5

t=5.&comma;yt=1.84313059855996

(3)

Suppose that instead we wanted to integrate out to t=200. If we attempt to do this with the generated routine, a problem occurs.

ysol200

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 Ot2 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:

ysoldsolveDE&comma;y0=1&comma;numeric&comma;method=rkf45&comma;maxfun=500000

ysolprocx_rkf45...end proc

(4)

ysol200

t=200.&comma;yt=1.87563347676955

(5)

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:

dsysdiffyt&comma;t=yt21100yt&comma;y0=1200&colon;

has a fast blow-up singularity just past t=30.

If we attempt to numerically integrate this IVP to t=31, we get:

ysoldsolvedsys&comma;numeric&comma;method=rkf45&comma;abserr=1.×10−7&comma;relerr=1.×10−7

ysolprocx_rkf45...end proc

(6)

ysol31

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:

ysoldsolvedsys&comma;numeric&comma;method=rkf45&comma;abserr=1.×10−7&comma;relerr=1.×10−7&comma;range=0..31

ysolprocx_rkf45...end proc

(7)

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:

ysoldsolvedsys&comma;numeric&comma;method=rkf45&comma;abserr=1.×10−7&comma;relerr=1.×10−7&comma;maxfun=100000

ysolprocx_rkf45...end proc

(8)

ysol31

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]