CHHES

Checks a user-supplied Hessian of an analytic function.

Required Arguments

GRAD — User-supplied subroutine to compute the gradient at the point X. The usage is
CALL GRAD (N, X, G), where

N – Length of X and G. (Input)

X – The point at which the gradient is evaluated. X should not be changed by GRAD. (Input)

G – The gradient evaluated at the point X. (Output)

GRAD must be declared EXTERNAL in the calling program.

HESS — User-supplied subroutine to compute the Hessian at the point X. The usage is
CALL HESS (N, X, H, LDH), where

N – Length of X. (Input)

X – The point at which the Hessian is evaluated. (Input)
X should not be changed by HESS.

H – The Hessian evaluated at the point X. (Output)

LDH – Leading dimension of H exactly as specified in in the dimension statement of the calling program. (Input)

HESS must be declared EXTERNAL in the calling program.

X — Vector of length N containing the point at which the Hessian is to be checked. (Input)

INFO — Integer matrix of dimension N by N. (Output)

INFO(I, J) = 0 means the Hessian is a poor estimate for function I at the point X(J).

INFO(I, J) = 1 means the Hessian is a good estimate for function I at the point X(J).

INFO(I, J) = 2 means the Hessian disagrees with the numerical Hessian for function I at the point X(J), but it might be impossible to calculate the numerical Hessian.

INFO(I, J) = 3 means the Hessian for function I at the point X(J) and the numerical Hessian are both zero, and, therefore, the gradient should be rechecked at a different point.

Optional Arguments

N — Dimension of the problem. (Input)
Default: N = SIZE (X,1).

LDINFO — Leading dimension of INFO exactly as specified in the dimension statement of the calling program. (Input)
Default: LDINFO = SIZE (INFO,1).

FORTRAN 90 Interface

Generic: CALL CHHES (GRAD, HESS, X, INFO [])

Specific: The specific interface names are S_CHHES and D_CHHES.

FORTRAN 77 Interface

Single: CALL CHHES (GRAD, HESS, N, X, INFO, LDINFO)

Double: The double precision name is DCHHES.

Description

The routine CHHES uses the following finite-difference formula to estimate the Hessian of a function of n variables at x:

 

where

hj = ɛ1/2   max{xj,  1/sj} sign(xj),

ɛ is the machine epsilon,

ej

is the j-th unit vector,

sj

is the scaling factor of the j-th variable, and

gi(x)

is the gradient of the function with respect to the i-th variable.

Next, CHHES checks the user-supplied Hessian H(x) by comparing it with the finite difference approximation B(x). If

Bij(x)Hij(x) <  Hij(x)

where

= ɛ1/4,

then

Hij(x)

is declared correct; otherwise, CHHES computes the bounds of calculation error and approximation error. When both bounds are too small to account for the difference,

Hij(x)

is reported as incorrect. In the case of a large error bound, CHHES uses a nearly optimal stepsize to recompute

Bij(x)

and reports that

Bij(x)

is correct if

Bij(x)Hij(x) < 2 Hij(x)

Otherwise, Hij(x) is considered incorrect unless the error bound for the optimal step is greater than  Hij(x). In this case, the numeric approximation may be impossible to compute correctly. For more details, see Schnabel (1985).

Comments

Workspace may be explicitly provided, if desired, by use of C2HES/DC2HES. The reference is

CALL C2HES (GRAD, HESS, N, X, INFO, LDINFO, G, HX, HS, XSCALE, EPSFCN, INFT, NEWX)

The additional arguments are as follows:

G — Vector of length N containing the value of the gradient GRD at X.

HX — Real matrix of dimension N by N containing the Hessian evaluated at X.

HS — Real work vector of length N.

XSCALE — Vector of length N used to store the diagonal scaling matrix for the variables.

EPSFCN — Estimate of the relative noise in the function.

INFT — Vector of length N. For I = 1 through N, INFT contains information about the Jacobian.

NEWX — Real work array of length N.

Example

The user-supplied Hessian of

 

at (1.2, 1.0) is checked, and the error is found.

 

USE CHHES_INT

 

IMPLICIT NONE

INTEGER LDINFO, N

PARAMETER (N=2, LDINFO=N)

!

INTEGER INFO(LDINFO,N)

REAL X(N)

EXTERNAL GRD, HES

!

! Input values for X

! X = (-1.2, 1.0)

!

DATA X/-1.2, 1.0/

!

CALL CHHES (GRD, HES, X, INFO)

!

END

!

SUBROUTINE GRD (N, X, UG)

INTEGER N

REAL X(N), UG(N)

!

UG(1) = -400.0*X(1)*(X(2)-X(1)*X(1)) + 2.0*X(1) - 2.0

UG(2) = 200.0*X(2) - 200.0*X(1)*X(1)

RETURN

END

!

SUBROUTINE HES (N, X, HX, LDHS)

INTEGER N, LDHS

REAL X(N), HX(LDHS,N)

!

HX(1,1) = -400.0*X(2) + 1200.0*X(1)*X(1) + 2.0

HX(1,2) = -400.0*X(1)

HX(2,1) = -400.0*X(1)

! A sign change is made to HX(2,2)

!

HX(2,2) = -200.0

RETURN

END

Output

 

*** FATAL ERROR 1 from CHHES. The Hessian evaluation with respect to

*** X(2) and X(2) is a poor estimate.