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.