PDF version (NAG web site
, 64-bit version, 64-bit version)
NAG Toolbox: nag_numdiff_rcomm (d04ba)
Purpose
nag_numdiff_rcomm (d04ba) calculates a set of derivatives (up to order
) of a function at a point with respect to a single variable. A corresponding set of error estimates is also returned. Derivatives are calculated using an extension of the Neville algorithm. This function differs from
nag_numdiff (d04aa), in that the abscissae and corresponding function values must be calculated before this function is called. The abscissae may be generated using
nag_numdiff_sample (d04bb).
Syntax
Description
nag_numdiff_rcomm (d04ba) provides a set of approximations:
to the derivatives:
of a real valued function
at a real abscissa
, together with a set of error estimates:
which hopefully satisfy:
The results
and
are based on
function values:
The abscissae
and the corresponding function values
should be passed into
nag_numdiff_rcomm (d04ba) as the vectors
xval and
fval respectively. The step size
is derived from the abscissae in
xval. See
Further Comments for a discussion of how the derived value of
may affect the results of
nag_numdiff_rcomm (d04ba). The order in which the abscissae and function values are stored in
xval and
fval is irrelevant, provided that the function value at any given index corresponds to the value of the abscissa at the same index. Abscissae may be automatically generated using
nag_numdiff_sample (d04bb) if desired. For each derivative
nag_numdiff_rcomm (d04ba) employs an extension of the Neville Algorithm (see
Lyness and Moler (1969)) to obtain a selection of approximations.
For example, for odd derivatives, this function calculates a set of numbers:
each of which is an approximation to
. A specific approximation
is of polynomial degree
and is based on polynomial interpolation using function values
, for
. In the absence of round-off error, the better approximations would be associated with the larger values of
and of
. However, round-off error in function values has an increasingly contaminating effect for successively larger values of
. This function proceeds to make a judicious choice between all the approximations in the following way.
For a specified value of
, let:
where
and
, for
, and let
be such that
, for
.
This function returns:
and
where
is a safety factor which has been assigned the values:
, |
|
, |
|
|
, |
on the basis of performance statistics.
The even order derivatives are calculated in a precisely analogous manner.
References
Lyness J N and Moler C B (1969) Generalised Romberg methods for integrals of derivatives Numer. Math. 14 1–14
Parameters
Compulsory Input Parameters
- 1:
– double array
-
The abscissae at which the function has been evaluated, as described in
Description. These can be generated by calling
nag_numdiff_sample (d04bb). The order of the abscissae is irrelevant.
Constraint:
the values in
xval must span the set
, for
.
- 2:
– double array
-
must contain the function value at , for .
Optional Input Parameters
None.
Output Parameters
- 1:
– double array
-
The 14 derivative estimates.
- 2:
– double array
-
The 14 error estimates for the derivatives.
- 3:
– int64int32nag_int scalar
unless the function detects an error (see
Error Indicators and Warnings).
Error Indicators and Warnings
Errors or warnings detected by the function:
-
-
On entry, the values of
xval are not correctly spaced.
The derived is below tolerance.
-
An unexpected error has been triggered by this routine. Please
contact
NAG.
-
Your licence key may have expired or may not have been installed correctly.
-
Dynamic memory allocation failed.
Accuracy
The accuracy of the results is problem dependent. An estimate of the accuracy of each result
is returned in
(see
Description,
Arguments and
Further Comments).
A basic feature of any floating-point function for numerical differentiation based on real function values on the real axis is that successively higher order derivative approximations are successively less accurate. It is expected that in most cases will be unusable. As an aid to this process, the sign of is set negative when the estimated absolute error is greater than the approximate derivative itself, i.e., when the approximate derivative may be so inaccurate that it may even have the wrong sign. It is also set negative in some other cases when information available to nag_numdiff_rcomm (d04ba) indicates that the corresponding value of is questionable.
The actual values in
erest depend on the accuracy of the function values, the properties of the machine arithmetic, the analytic properties of the function being differentiated and the step length
(see
Further Comments). The only hard and fast rule is that for a given objective function and
, the values of
increase with increasing
. The limit of
is dictated by experience. Only very rarely can one obtain meaningful approximations for higher order derivatives on conventional machines.
Further Comments
The results depend very critically on the choice of the step length . The overall accuracy is diminished as becomes small (because of the effect of round-off error) and as becomes large (because the discretization error also becomes large). If this function is used four or five times with different values of one can find a reasonably good value. A process in which the value of is successively halved (or doubled) is usually quite effective. Experience has shown that in cases in which the Taylor series for the objective function about has a finite radius of convergence , the choices of are not likely to lead to good results. In this case some function values lie outside the circle of convergence.
As mentioned, the order of the abscissae in
xval does not matter, provided the corresponding values of
fval are ordered identically. If the abscissae are generated by
nag_numdiff_sample (d04bb), then they will be in ascending order. In particular, the target abscissa
will be stored in
.
Example
This example evaluates the derivatives of the polygamma function, calculated using
nag_specfun_psi_deriv_real (s14ae), and compares the first
derivatives calculated to those found using
nag_specfun_psi_deriv_real (s14ae).
Open in the MATLAB editor:
d04ba_example
function d04ba_example
fprintf('d04ba example results\n\n');
fprintf('Find the derivatives of the polygamma (psi) function\n');
fprintf('using function values generated by s14ae.\n\n');
fprintf('Demonstrate the effect of successively reducing hbase.\n\n');
x_0 = 0.05;
[f_0, ifail] = s14ae(x_0, int64(0));
actder = zeros(3, 1);
for j=1:3
[actder(j), ifail] = s14ae(x_0, int64(j));
end
der_comp = zeros(14, 3, 4);
for j=1:4
hbase = 0.025*10^(-j);
[xval] = d04bb(x_0, hbase);
fval(11) = f_0;
for k=[1:10,12:21]
[fval(k), ifail] = s14ae(xval(k), int64(0));
end
[der, erest, ifail] = d04ba(xval, fval);
der_comp(:, 1, j) = hbase;
der_comp(:, 2, j) = der;
der_comp(:, 3, j) = erest;
end
for i=1:3
fprintf('\nderivative %d calculated using s14ae: %11.4e\n', i, actder(i));
fprintf('Derivative and error estimates for derivative %d\n', i);
fprintf(' hbase der(%d) erest(%d)\n', i, i);
for j=1:4
fprintf(' %12.4e %12.4e %12.4e\n', der_comp(i,:,j));
end
end
d04ba example results
Find the derivatives of the polygamma (psi) function
using function values generated by s14ae.
Demonstrate the effect of successively reducing hbase.
derivative 1 calculated using s14ae: 4.0153e+02
Derivative and error estimates for derivative 1
hbase der(1) erest(1)
2.5000e-03 4.0204e+02 1.3940e+02
2.5000e-04 4.0153e+02 4.9170e-11
2.5000e-05 4.0153e+02 2.1799e-10
2.5000e-06 4.0153e+02 1.1826e-09
derivative 2 calculated using s14ae: -1.6002e+04
Derivative and error estimates for derivative 2
hbase der(2) erest(2)
2.5000e-03 -1.6022e+04 5.5760e+03
2.5000e-04 -1.6002e+04 1.2831e-07
2.5000e-05 -1.6002e+04 6.0543e-06
2.5000e-06 -1.6002e+04 9.5762e-04
derivative 3 calculated using s14ae: 9.6001e+05
Derivative and error estimates for derivative 3
hbase der(3) erest(3)
2.5000e-03 9.1465e+05 -7.3750e+06
2.5000e-04 9.6001e+05 2.3718e-04
2.5000e-05 9.6001e+05 4.2253e-02
2.5000e-06 9.6001e+05 5.9679e+01
PDF version (NAG web site
, 64-bit version, 64-bit version)
© The Numerical Algorithms Group Ltd, Oxford, UK. 2009–2015