PDF version (NAG web site
, 64-bit version, 64-bit version)
NAG Toolbox: nag_opt_lsq_check_deriv (e04ya)
Purpose
nag_opt_lsq_check_deriv (e04ya) checks that a user-supplied function for evaluating a vector of functions and the matrix of their first derivatives produces derivative values which are consistent with the function values calculated.
Syntax
Note: the interface to this routine has changed since earlier releases of the toolbox:
At Mark 24: |
w and iw were removed from the interface; user was added to the interface |
At Mark 22: |
liw and lw were removed from the interface |
Description
Routines for minimizing a sum of squares of
nonlinear functions (or ‘residuals’),
, for
and
, may require you to supply a function to evaluate the
and their first derivatives.
nag_opt_lsq_check_deriv (e04ya) checks the derivatives calculated by such user-supplied functions, e.g., functions of the form required for
nag_opt_lsq_uncon_quasi_deriv_comp (e04gb),
nag_opt_lsq_uncon_mod_deriv_comp (e04gd) and
nag_opt_lsq_uncon_mod_deriv2_comp (e04he). As well as the function to be checked (
lsqfun), you must supply a point
at which the check will be made.
nag_opt_lsq_check_deriv (e04ya) is essentially identical to CHKLSJ in the NPL Algorithms Library.
nag_opt_lsq_check_deriv (e04ya) first calls
lsqfun to evaluate the
and their first derivatives, and uses these to calculate the sum of squares
,
and its first derivatives
, for
. The components of
along two orthogonal directions (defined by unit vectors
and
, say) are then calculated; these will be
and
respectively. The same components are also estimated by finite differences, giving quantities
where
is a small positive scalar. If the relative difference between
and
or between
and
is judged too large, an error indicator is set.
References
None.
Parameters
Compulsory Input Parameters
- 1:
– int64int32nag_int scalar
-
The number of residuals, , and the number of variables, .
Constraint:
.
- 2:
– function handle or string containing name of m-file
-
lsqfun must calculate the vector of values
and their first derivatives
at any point
. (The minimization functions mentioned in
Description give you the option of resetting a argument to terminate immediately.
nag_opt_lsq_check_deriv (e04ya) will also terminate immediately, without finishing the checking process, if the argument in question is reset.)
[iflag, fvec, fjac, user] = lsqfun(iflag, m, n, xc, ldfjac, user)
Input Parameters
- 1:
– int64int32nag_int scalar
-
To
lsqfun,
iflag will be set to
.
- 2:
– int64int32nag_int scalar
-
The numbers of residuals.
- 3:
– int64int32nag_int scalar
-
The numbers of variables.
- 4:
– double array
-
, the point at which the values of the and the are required.
- 5:
– int64int32nag_int scalar
-
The first dimension of the array
fjac.
- 6:
– Any MATLAB object
lsqfun is called from
nag_opt_lsq_check_deriv (e04ya) with the object supplied to
nag_opt_lsq_check_deriv (e04ya).
Output Parameters
- 1:
– int64int32nag_int scalar
-
If you reset
iflag to some negative number in
lsqfun and return control to
nag_opt_lsq_check_deriv (e04ya), the function will terminate immediately with
ifail set to your setting of
iflag.
- 2:
– double array
-
Unless
iflag is reset to a negative number,
must contain the value of
at the point
, for
.
- 3:
– double array
-
Unless
iflag is reset to a negative number,
must contain the value of
at the point
, for
and
.
- 4:
– Any MATLAB object
- 3:
– double array
-
, for
, must be set to the coordinates of a suitable point at which to check the derivatives calculated by
lsqfun. ‘Obvious’ settings, such as
or
, should not be used since, at such particular points, incorrect terms may take correct values (particularly zero), so that errors can go undetected. For a similar reason, it is preferable that no two elements of
x should have the same value.
Optional Input Parameters
- 1:
– int64int32nag_int scalar
-
Default:
For
n, the dimension of the array
x.
The number of residuals, , and the number of variables, .
Constraint:
.
- 2:
– Any MATLAB object
user is not used by
nag_opt_lsq_check_deriv (e04ya), but is passed to
lsqfun. Note that for large objects it may be more efficient to use a global variable which is accessible from the m-files than to use
user.
Output Parameters
- 1:
– double array
-
Unless you set
iflag negative in the first call of
lsqfun,
contains the value of
at the point supplied by you in
x, for
.
- 2:
– double array
-
Unless you set
iflag negative in the first call of
lsqfun,
contains the value of the first derivative
at the point given in
x, as calculated by
lsqfun, for
and
.
- 3:
– Any MATLAB object
- 4:
– int64int32nag_int scalar
unless the function detects an error (see
Error Indicators and Warnings).
Error Indicators and Warnings
Note: nag_opt_lsq_check_deriv (e04ya) may return useful information for one or more of the following detected errors or warnings.
Errors or warnings detected by the function:
Cases prefixed with W are classified as warnings and
do not generate an error of type NAG:error_n. See nag_issue_warnings.
- W
-
A negative value of
ifail indicates an exit from
nag_opt_lsq_check_deriv (e04ya) because you have set
iflag negative in
lsqfun. The setting of
ifail will be the same as your setting of
iflag. The check on
lsqfun will not have been completed.
-
-
On entry, | , |
or | , |
or | , |
or | , |
or | . |
- W
-
You should check carefully the derivation and programming of expressions for the
, because it is very unlikely that
lsqfun is calculating them correctly.
-
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
ifail is set to
if
for
. (See
Description for definitions of the quantities involved.) The scalar
is set equal to
, where
is the
machine precision as given by
nag_machine_precision (x02aj).
Further Comments
nag_opt_lsq_check_deriv (e04ya) calls
lsqfun three times.
Before using
nag_opt_lsq_check_deriv (e04ya) to check the calculation of the first derivatives, you should be confident that
lsqfun is calculating the residuals correctly.
nag_opt_lsq_check_deriv (e04ya) only checks the derivatives calculated by a user-supplied function when
. So, if
lsqfun is intended for use in conjunction with a minimization function which may set
iflag to
, you must check that, for given settings of the
,
lsqfun produces the same values for the
when
iflag is set to
as when
iflag is set to
.
Example
Suppose that it is intended to use
nag_opt_lsq_uncon_quasi_deriv_comp (e04gb) or
nag_opt_lsq_uncon_mod_deriv_comp (e04gd) to find least squares estimates of
and
in the model
using the
sets of data given in the following table.
The following program could be used to check the first derivatives calculated by
lsqfun. (The tests of whether
or
in
lsqfun are present ready for when
lsqfun is called by
nag_opt_lsq_uncon_quasi_deriv_comp (e04gb) or
nag_opt_lsq_uncon_mod_deriv_comp (e04gd).
nag_opt_lsq_check_deriv (e04ya) will always call
lsqfun with
iflag set to 2.)
Open in the MATLAB editor:
e04ya_example
function e04ya_example
fprintf('e04ya example results\n\n');
m = int64(15);
x = [0.19; -1.34; 0.88];
y = [0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, ...
0.58, 0.73, 0.96, 1.34, 2.10, 4.39];
t = [1.0, 15.0, 1.0;
2.0, 14.0, 2.0;
3.0, 13.0, 3.0;
4.0, 12.0, 4.0;
5.0, 11.0, 5.0;
6.0, 10.0, 6.0;
7.0, 9.0, 7.0;
8.0, 8.0, 8.0;
9.0, 7.0, 7.0;
10.0, 6.0, 6.0;
11.0, 5.0, 5.0;
12.0, 4.0, 4.0;
13.0, 3.0, 3.0;
14.0, 2.0, 2.0;
15.0, 1.0, 1.0];
user = {y; t};
[fvec, fjac, user, ifail] = e04ya( ...
m, @lsqfun, x, 'user', user);
fprintf('The test point is:\n');
fprintf('%9.5f',x);
fprintf('\n\n1st derivatives are consistent with residual values\n\n');
fprintf('At the test point, lsqfun gives:\n\n');
fprintf(' Residuals 1st derivatives\n');
fprintf('%10.4f %10.4f%10.4f%10.4f\n',[fvec fjac]');
fprintf('\n');
function [iflag, fvecc, fjacc, user] = lsqfun(iflag, m, n, xc, ljc, user)
y = user{1};
t = user{2};
fvecc = zeros(m, 1);
fjacc = zeros(ljc, n);
for i = 1:double(m)
denom = xc(2)*t(i,2) + xc(3)*t(i,3);
if (iflag ~= 1)
fvecc(i) = xc(1) + t(i,1)/denom - y(i);
end
if (iflag ~= 0)
fjacc(i,1) = 1;
dummy = -1/(denom*denom);
fjacc(i,2) = t(i,1)*t(i,2)*dummy;
fjacc(i,3) = t(i,1)*t(i,3)*dummy;
end
end
e04ya example results
The test point is:
0.19000 -1.34000 0.88000
1st derivatives are consistent with residual values
At the test point, lsqfun gives:
Residuals 1st derivatives
-0.0020 1.0000 -0.0406 -0.0027
-0.1076 1.0000 -0.0969 -0.0138
-0.2330 1.0000 -0.1785 -0.0412
-0.3785 1.0000 -0.3043 -0.1014
-0.5836 1.0000 -0.5144 -0.2338
-0.8689 1.0000 -0.9100 -0.5460
-1.3464 1.0000 -1.8098 -1.4076
-2.3739 1.0000 -4.7259 -4.7259
-2.9750 1.0000 -6.0762 -6.0762
-4.0132 1.0000 -7.8765 -7.8765
-5.3226 1.0000 -10.3970 -10.3970
-7.2917 1.0000 -14.1777 -14.1777
-10.5703 1.0000 -20.4789 -20.4789
-17.1274 1.0000 -33.0813 -33.0813
-36.8087 1.0000 -70.8885 -70.8885
PDF version (NAG web site
, 64-bit version, 64-bit version)
© The Numerical Algorithms Group Ltd, Oxford, UK. 2009–2015