Integer type:  int32  int64  nag_int  show int32  show int32  show int64  show int64  show nag_int  show nag_int

Chapter Contents
Chapter Introduction
NAG Toolbox

# NAG Toolbox: nag_roots_sys_deriv_check (c05zd)

## Purpose

nag_roots_sys_deriv_check (c05zd) checks the user-supplied gradients of a set of nonlinear functions in several variables, for consistency with the functions themselves. The function must be called twice.

## Syntax

[xp, err, ifail] = c05zd(mode, x, fvec, fjac, fvecp, 'm', m, 'n', n)
[xp, err, ifail] = nag_roots_sys_deriv_check(mode, x, fvec, fjac, fvecp, 'm', m, 'n', n)

## Description

nag_roots_sys_deriv_check (c05zd) is based on the MINPACK routine CHKDER (see Moré et al. (1980)). It checks the i$i$th gradient for consistency with the i$i$th function by computing a forward-difference approximation along a suitably chosen direction and comparing this approximation with the user-supplied gradient along the same direction. The principal characteristic of nag_roots_sys_deriv_check (c05zd) is its invariance under changes in scale of the variables or functions.

## References

Moré J J, Garbow B S and Hillstrom K E (1980) User guide for MINPACK-1 Technical Report ANL-80-74 Argonne National Laboratory

## Parameters

### Compulsory Input Parameters

1:     mode – int64int32nag_int scalar
The value 1$1$ on the first call and the value 2$2$ on the second call of nag_roots_sys_deriv_check (c05zd).
Constraint: mode = 1${\mathbf{mode}}=1$ or 2$2$.
2:     x(n) – double array
n, the dimension of the array, must satisfy the constraint n1${\mathbf{n}}\ge 1$.
The components of a point x$x$, at which the consistency check is to be made. (See Section [Accuracy].)
3:     fvec(m) – double array
m, the dimension of the array, must satisfy the constraint m1${\mathbf{m}}\ge 1$.
If mode = 2${\mathbf{mode}}=2$, fvec must contain the value of the functions evaluated at x$x$. If mode = 1${\mathbf{mode}}=1$, fvec is not referenced.
4:     fjac(m,n) – double array
m, the first dimension of the array, must satisfy the constraint m1${\mathbf{m}}\ge 1$.
If mode = 2${\mathbf{mode}}=2$, fjac must contain the value of (fi)/(xj) $\frac{\partial {f}_{i}}{\partial {x}_{j}}$ at the point x$x$, for i = 1,2,,m$\mathit{i}=1,2,\dots ,m$ and j = 1,2,,n$\mathit{j}=1,2,\dots ,n$. If mode = 1${\mathbf{mode}}=1$, fjac is not referenced.
5:     fvecp(m) – double array
m, the dimension of the array, must satisfy the constraint m1${\mathbf{m}}\ge 1$.
If mode = 2${\mathbf{mode}}=2$, fvecp must contain the value of the functions evaluated at xp (as output by a preceding call to nag_roots_sys_deriv_check (c05zd) with mode = 1${\mathbf{mode}}=1$). If mode = 1${\mathbf{mode}}=1$, fvecp is not referenced.

### Optional Input Parameters

1:     m – int64int32nag_int scalar
Default: The dimension of the arrays fvec, fvecp and the first dimension of the array fjac. (An error is raised if these dimensions are not equal.)
m$m$, the number of functions.
Constraint: m1${\mathbf{m}}\ge 1$.
2:     n – int64int32nag_int scalar
Default: The dimension of the array x and the second dimension of the array fjac. (An error is raised if these dimensions are not equal.)
n$n$, the number of variables. For use with nag_roots_sys_deriv_easy (c05rb), nag_roots_sys_deriv_expert (c05rc) and nag_roots_sys_deriv_rcomm (c05rd), m = n${\mathbf{m}}={\mathbf{n}}$.
Constraint: n1${\mathbf{n}}\ge 1$.

None.

### Output Parameters

1:     xp(n) – double array
If mode = 1${\mathbf{mode}}=1$, xp is set to a point neighbouring x. If mode = 2${\mathbf{mode}}=2$, xp is undefined.
2:     err(m) – double array
If mode = 2${\mathbf{mode}}=2$, err contains measures of correctness of the respective gradients. If mode = 1${\mathbf{mode}}=1$, err is undefined. If there is no loss of significance (see Section [Accuracy]), then if err(i)${\mathbf{err}}\left(i\right)$ is 1.0$1.0$ the i$i$th user-supplied gradient (fi)/(xj) $\frac{\partial {f}_{i}}{\partial {x}_{j}}$, for j = 1,2,,n$\mathit{j}=1,2,\dots ,n$ is correct, whilst if err(i)${\mathbf{err}}\left(i\right)$ is 0.0$0.0$ the i$i$th gradient is incorrect. For values of err(i)${\mathbf{err}}\left(i\right)$ between 0.0$0.0$ and 1.0$1.0$ the categorisation is less certain. In general, a value of err(i) > 0.5${\mathbf{err}}\left(i\right)>0.5$ indicates that the i$i$th gradient is probably correct.
3:     ifail – int64int32nag_int scalar
${\mathrm{ifail}}={\mathbf{0}}$ unless the function detects an error (see [Error Indicators and Warnings]).

## Error Indicators and Warnings

Errors or warnings detected by the function:
ifail = 1${\mathbf{ifail}}=1$
Constraint: mode = 1${\mathbf{mode}}=1$ or 2$2$.
ifail = 2${\mathbf{ifail}}=2$
Constraint: m1${\mathbf{m}}\ge 1$.
ifail = 3${\mathbf{ifail}}=3$
Constraint: n1${\mathbf{n}}\ge 1$.

## Accuracy

nag_roots_sys_deriv_check (c05zd) does not perform reliably if cancellation or rounding errors cause a severe loss of significance in the evaluation of a function. Therefore, none of the components of x$x$ should be unusually small (in particular, zero) or any other value which may cause loss of significance. The relative differences between corresponding elements of fvecp and fvec should be at least two orders of magnitude greater than the machine precision returned by nag_machine_precision (x02aj).

The time required by nag_roots_sys_deriv_check (c05zd) increases with m and n.

## Example

```function nag_roots_sys_deriv_check_example
% Point at which to check gradients:
x = [0.92, 0.13, 0.54];

fvec  = zeros(15, 1);
fjac  = zeros(15, 3);
fvecp = zeros(15, 1);

y = 0.01*[14, 18, 22, 25, 29, 32, 35, 39, 47, 58, 73, 96, 134, 210, 439];

[xp, err, ifail] = nag_roots_sys_deriv_check(int64(1), x, fvec, fjac, fvecp);

for i=1:15
u = i;
v = 16 - i;
w = min(u, v);
fvec(i)  = y(i) - (x(1)+u/(v*x(2)+w*x(3)));
fvecp(i) = y(i) - (xp(1)+u/(v*xp(2)+w*xp(3)));
denom = (v*x(2)+w*x(3))^(-2);
fjac(i,:) = [-1, u*v*denom, u*w*denom];
end

[xp, err, ifail] = nag_roots_sys_deriv_check(int64(2), x, fvec, fjac, fvecp);

fprintf('\nAt point %12.4f %12.4f %12.4f\n', x);
if any(err <= 0.5)
for i=1:15
if err(i) <= 0.5
fprintf('Suspicious gradient number %d with error measure %12.4f\n', i, err(i));
end
end
else
end
```
```

At point       0.9200       0.1300       0.5400

```
```function c05zd_example
% Point at which to check gradients:
x = [0.92, 0.13, 0.54];

fvec  = zeros(15, 1);
fjac  = zeros(15, 3);
fvecp = zeros(15, 1);

y = 0.01*[14, 18, 22, 25, 29, 32, 35, 39, 47, 58, 73, 96, 134, 210, 439];

[xp, err, ifail] = c05zd(int64(1), x, fvec, fjac, fvecp);

for i=1:15
u = i;
v = 16 - i;
w = min(u, v);
fvec(i)  = y(i) - (x(1)+u/(v*x(2)+w*x(3)));
fvecp(i) = y(i) - (xp(1)+u/(v*xp(2)+w*xp(3)));
denom = (v*x(2)+w*x(3))^(-2);
fjac(i,:) = [-1, u*v*denom, u*w*denom];
end

[xp, err, ifail] = c05zd(int64(2), x, fvec, fjac, fvecp);

fprintf('\nAt point %12.4f %12.4f %12.4f\n', x);
if any(err <= 0.5)
for i=1:15
if err(i) <= 0.5
fprintf('Suspicious gradient number %d with error measure %12.4f\n', i, err(i));
end
end
else
end
```
```

At point       0.9200       0.1300       0.5400