NAG Library Routine Document
D02BGF integrates a system of first-order ordinary differential equations over an interval with suitable initial conditions, using a Runge–Kutta–Merson method, until a specified component attains a given value.
|SUBROUTINE D02BGF (
||X, XEND, N, Y, TOL, HMAX, M, VAL, FCN, W, IFAIL)
||N, M, IFAIL
||X, XEND, Y(N), TOL, HMAX, VAL, W(N,10)
D02BGF advances the solution of a system of ordinary differential equations
using a Merson form of the Runge–Kutta method. The system is defined by FCN
, which evaluates
in terms of
(see Section 5
), and the values of
must be given at
As the integration proceeds, a check is made on the specified component of the solution to determine an interval where it attains a given value . The position where this value is attained is then determined accurately by interpolation on the solution and its derivative. It is assumed that the solution of can be determined by searching for a change in sign in the function .
The accuracy of the integration and, indirectly, of the determination of the position where
is controlled by the parameter TOL
For a description of Runge–Kutta methods and their practical implementation see Hall and Watt (1976)
Hall G and Watt J M (ed.) (1976) Modern Numerical Methods for Ordinary Differential Equations Clarendon Press, Oxford
- 1: X – REAL (KIND=nag_wp)Input/Output
On entry: must be set to the initial value of the independent variable .
: the point where the component
attains the value
unless an error has occurred, when it contains the value of
at the error. In particular, if
anywhere on the range
, it will contain XEND
- 2: XEND – REAL (KIND=nag_wp)Input
: the final value of the independent variable
If on entry integration will proceed in the negative direction.
- 3: N – INTEGERInput
On entry: , the number of differential equations.
- 4: Y(N) – REAL (KIND=nag_wp) arrayInput/Output
On entry: the initial values of the solution .
: the computed values of the solution at a point near the solution X
, unless an error has occurred when they contain the computed values at the final value of X
- 5: TOL – REAL (KIND=nag_wp)Input/Output
: must be set to a positive tolerance for controlling the error in the integration and in the determination of the position where
D02BGF has been designed so that, for most problems, a reduction in TOL
leads to an approximately proportional reduction in the error in the solution obtained in the integration. The relation between changes in TOL
and the error in the determination of the position where
is less clear, but for TOL
small enough the error should be approximately proportional to TOL
. However, the actual relation between TOL
and the accuracy cannot be guaranteed. You are strongly recommended to call D02BGF with more than one value for TOL
and to compare the results obtained to estimate their accuracy. In the absence of any prior knowledge you might compare results obtained by calling D02BGF with
correct decimal digits in the solution are required.
: normally unchanged. However if the range from X
to the position where
(or to the final value of X
if an error occurs) is so short that a small change in TOL
is unlikely to make any change in the computed solution then, on return, TOL
has its sign changed. To check results returned with
, D02BGF should be called again with a positive value of TOL
whose magnitude is considerably smaller than that of the previous call.
- 6: HMAX – REAL (KIND=nag_wp)Input
: controls how the sign of
- is checked at every internal integration step.
- The computed solution is checked for a change in sign of at steps of not greater than . This facility should be used if there is any chance of ‘missing’ the change in sign by checking too infrequently. For example, if two changes of sign of are expected within a distance , say, of each other then a suitable value for HMAX might be . If only one change of sign in is expected on the range X to XEND then is most appropriate.
- 7: M – INTEGERInput
On entry: the index of the component of the solution whose value is to be checked.
- 8: VAL – REAL (KIND=nag_wp)Input
: the value of
in the equation
to be solved for X
- 9: FCN – SUBROUTINE, supplied by the user.External Procedure
must evaluate the functions
(i.e., the derivatives
) for given values of its arguments
The specification of FCN
|SUBROUTINE FCN (
||X, Y, F)
||X, Y(*), F(*)
In the description of the parameters of D02BGF below,
denotes the actual value of N
in the call of D02BGF.
- 1: X – REAL (KIND=nag_wp)Input
On entry: , the value of the argument.
- 2: Y() – REAL (KIND=nag_wp) arrayInput
On entry: , for , the value of the argument.
- 3: F() – REAL (KIND=nag_wp) arrayOutput
On exit: the value of
, for .
must either be a module subprogram USEd by, or declared as EXTERNAL in, the (sub)program from which D02BGF is called. Parameters denoted as Input
be changed by this procedure.
- 10: W(N,) – REAL (KIND=nag_wp) arrayWorkspace
- 11: IFAIL – INTEGERInput/Output
must be set to
. If you are unfamiliar with this parameter you should refer to Section 3.3
in the Essential Introduction for details.
For environments where it might be inappropriate to halt program execution when an error is detected, the value
is recommended. If the output of error messages is undesirable, then the value
is recommended. Otherwise, if you are not familiar with this parameter, the recommended value is
. When the value is used it is essential to test the value of IFAIL on exit.
unless the routine detects an error or a warning has been flagged (see Section 6
6 Error Indicators and Warnings
If on entry
, explanatory error messages are output on the current error message unit (as defined by X04AAF
Errors or warnings detected by the routine:
With the given value of TOL
, no further progress can be made across the integration range from the current point
, or dependence of the error on TOL
would be lost if further progress across the integration range were attempted (see Section 8
for a discussion of this error exit). The components
contain the computed values of the solution at the current point
. No point at which
changes sign has been located up to the point
is too small for the routine to take an initial step (see Section 8
retain their initial values.
At no point in the range X
did the function
change sign. It is assumed that
has no solution.
A serious error has occurred in an internal call to the specified routine. Check all subroutine calls and array dimensions. Seek expert help.
A serious error has occurred in an internal call to an integration routine. Check all subroutine calls and array dimensions. Seek expert help.
A serious error has occurred in an internal call to an interpolation routine. Check all (sub)program calls and array dimensions. Seek expert help.
The accuracy depends on TOL
, on the mathematical properties of the differential system, on the position where
and on the method. It can be controlled by varying TOL
but the approximate proportionality of the error to TOL
holds only for a restricted range of values of TOL
. For TOL
too large, the underlying theory may break down and the result of varying TOL
may be unpredictable. For TOL
too small, rounding error may affect the solution significantly and an error exit with
The time taken by D02BGF depends on the complexity and mathematical properties of the system of differential equations defined by FCN
, on the range, the position of solution and the tolerance. There is also an overhead of the form
are machine-dependent computing times.
For some problems it is possible that D02BGF will exit with
due to inaccuracy of the computed value
. For example, consider a case where the component
has a maximum in the integration range and
is close to the maximum value. If TOL
is too large, it is possible that the maximum might be estimated as less than
, or even that the integration step length chosen might be so long that the maximum of
and the (two) positions where
are all in the same step and so the position where
remains undetected. Both these difficulties can be overcome by reducing TOL
sufficiently and, if necessary, by choosing HMAX
sufficiently small. For similar reasons, care should be taken when choosing XEND
. If possible, you should choose XEND
well beyond the point where
is expected to equal
, for example
should be made about
longer than the expected range. As a simple check, if, with XEND
fixed, a change in TOL
does not lead to a significant change in
, then inaccuracy is not a likely source of error.
If D02BGF fails with
, then it could be called again with a larger value of TOL
if this has not already been tried. If the accuracy requested is really needed and cannot be obtained with this routine, the system may be very stiff (see below) or so badly scaled that it cannot be solved to the required accuracy.
If D02BGF fails with
, it is likely that it has been called with a value of TOL
which is so small that a solution cannot be obtained on the range X
. This can happen for well-behaved systems and very small values of TOL
. You should, however, consider whether there is a more fundamental difficulty. For example:
||in the region of a singularity (infinite value) of the solution, the routine will usually stop with , unless overflow occurs first. If overflow occurs using D02BGF, routine D02PFF can be used instead to detect the increasing solution before overflow occurs. In any case, numerical integration cannot be continued through a singularity, and analytical treatment should be considered;
||for ‘stiff’ equations, where the solution contains rapidly decaying components the routine will use very small steps in (internally to D02BGF) to preserve stability. This will usually exhibit itself by making the computing time excessively long, or occasionally by an exit with . Merson's method is not efficient in such cases, and you should try the method D02EJF which uses a Backward Differentiation Formula. To determine whether a problem is stiff, D02PEF may be used.
For well-behaved systems with no difficulties such as stiffness or singularities, the Merson method should work well for low accuracy calculations (three or four figures). For high accuracy calculations or where FCN
is costly to evaluate, Merson's method may not be appropriate and a computationally less expensive method may be D02CJF
which uses an Adams method.
For problems for which D02BGF is not sufficiently general, you should consider the routines D02BHF
. Routine D02BHF
can be used to solve an equation involving the components
and their derivatives (for example, to find where a component passes through zero or to find the maximum value of a component). It also permits a more general form of error control and may be preferred to D02BGF if the component whose value is to be determined is very small in modulus on the integration range. D02BHF
can always be used in place of D02BGF, but will usually be computationally more expensive for solving the same problem. D02PFF
is a more general routine with many facilities including a more general error control criterion. D02PFF
can be combined with the root-finder C05AZF
and the interpolation routine D02PSF
to solve equations involving
and their derivatives.
This routine is only intended to be used to locate the first zero of the function . If later zeros are required you are strongly advised to construct your own more general root-finding routines as discussed above.
This example finds the value
, are defined by
and where at
we are given
. We write
and we set
in turn so that we can compare the solutions obtained. We expect the solution
and we set
so that the point where
is not too near the end of the range of integration. The initial values and range are read from a data file.
9.1 Program Text
Program Text (d02bgfe.f90)
9.2 Program Data
Program Data (d02bgfe.d)
9.3 Program Results
Program Results (d02bgfe.r)