123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- *DECK CHKDER
- SUBROUTINE CHKDER (M, N, X, FVEC, FJAC, LDFJAC, XP, FVECP, MODE,
- + ERR)
- C***BEGIN PROLOGUE CHKDER
- C***PURPOSE Check the gradients of M nonlinear functions in N
- C variables, evaluated at a point X, for consistency
- C with the functions themselves.
- C***LIBRARY SLATEC
- C***CATEGORY F3, G4C
- C***TYPE SINGLE PRECISION (CHKDER-S, DCKDER-D)
- C***KEYWORDS GRADIENTS, JACOBIAN, MINPACK, NONLINEAR
- C***AUTHOR Hiebert, K. L. (SNLA)
- C***DESCRIPTION
- C
- C This subroutine is a companion routine to SNLS1,SNLS1E,SNSQ,and
- C SNSQE which may be used to check the calculation of the Jacobian.
- C
- C SUBROUTINE CHKDER
- C
- C This subroutine checks the gradients of M nonlinear functions
- C in N variables, evaluated at a point X, for consistency with
- C the functions themselves. The user must call CKDER twice,
- C first with MODE = 1 and then with MODE = 2.
- C
- C MODE = 1. On input, X must contain the point of evaluation.
- C On output, XP is set to a neighboring point.
- C
- C MODE = 2. On input, FVEC must contain the functions and the
- C rows of FJAC must contain the gradients
- C of the respective functions each evaluated
- C at X, and FVECP must contain the functions
- C evaluated at XP.
- C On output, ERR contains measures of correctness of
- C the respective gradients.
- C
- C The subroutine does not perform reliably if cancellation or
- C rounding errors cause a severe loss of significance in the
- C evaluation of a function. Therefore, none of the components
- C of X should be unusually small (in particular, zero) or any
- C other value which may cause loss of significance.
- C
- C The SUBROUTINE statement is
- C
- C SUBROUTINE CHKDER(M,N,X,FVEC,FJAC,LDFJAC,XP,FVECP,MODE,ERR)
- C
- C where
- C
- C M is a positive integer input variable set to the number
- C of functions.
- C
- C N is a positive integer input variable set to the number
- C of variables.
- C
- C X is an input array of length N.
- C
- C FVEC is an array of length M. On input when MODE = 2,
- C FVEC must contain the functions evaluated at X.
- C
- C FJAC is an M by N array. On input when MODE = 2,
- C the rows of FJAC must contain the gradients of
- C the respective functions evaluated at X.
- C
- C LDFJAC is a positive integer input parameter not less than M
- C which specifies the leading dimension of the array FJAC.
- C
- C XP is an array of length N. On output when MODE = 1,
- C XP is set to a neighboring point of X.
- C
- C FVECP is an array of length M. On input when MODE = 2,
- C FVECP must contain the functions evaluated at XP.
- C
- C MODE is an integer input variable set to 1 on the first call
- C and 2 on the second. Other values of MODE are equivalent
- C to MODE = 1.
- C
- C ERR is an array of length M. On output when MODE = 2,
- C ERR contains measures of correctness of the respective
- C gradients. If there is no severe loss of significance,
- C then if ERR(I) is 1.0 the I-th gradient is correct,
- C while if ERR(I) is 0.0 the I-th gradient is incorrect.
- C For values of ERR between 0.0 and 1.0, the categorization
- C is less certain. In general, a value of ERR(I) greater
- C than 0.5 indicates that the I-th gradient is probably
- C correct, while a value of ERR(I) less than 0.5 indicates
- C that the I-th gradient is probably incorrect.
- C
- C***REFERENCES M. J. D. Powell, A hybrid method for nonlinear equa-
- C tions. In Numerical Methods for Nonlinear Algebraic
- C Equations, P. Rabinowitz, Editor. Gordon and Breach,
- C 1988.
- C***ROUTINES CALLED R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 800301 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CHKDER
- INTEGER M,N,LDFJAC,MODE
- REAL X(*),FVEC(*),FJAC(LDFJAC,*),XP(*),FVECP(*),ERR(*)
- INTEGER I,J
- REAL EPS,EPSF,EPSLOG,EPSMCH,FACTOR,ONE,TEMP,ZERO
- REAL R1MACH
- SAVE FACTOR, ONE, ZERO
- C
- DATA FACTOR,ONE,ZERO /1.0E2,1.0E0,0.0E0/
- C***FIRST EXECUTABLE STATEMENT CHKDER
- EPSMCH = R1MACH(4)
- C
- EPS = SQRT(EPSMCH)
- C
- IF (MODE .EQ. 2) GO TO 20
- C
- C MODE = 1.
- C
- DO 10 J = 1, N
- TEMP = EPS*ABS(X(J))
- IF (TEMP .EQ. ZERO) TEMP = EPS
- XP(J) = X(J) + TEMP
- 10 CONTINUE
- GO TO 70
- 20 CONTINUE
- C
- C MODE = 2.
- C
- EPSF = FACTOR*EPSMCH
- EPSLOG = LOG10(EPS)
- DO 30 I = 1, M
- ERR(I) = ZERO
- 30 CONTINUE
- DO 50 J = 1, N
- TEMP = ABS(X(J))
- IF (TEMP .EQ. ZERO) TEMP = ONE
- DO 40 I = 1, M
- ERR(I) = ERR(I) + TEMP*FJAC(I,J)
- 40 CONTINUE
- 50 CONTINUE
- DO 60 I = 1, M
- TEMP = ONE
- IF (FVEC(I) .NE. ZERO .AND. FVECP(I) .NE. ZERO
- 1 .AND. ABS(FVECP(I)-FVEC(I)) .GE. EPSF*ABS(FVEC(I)))
- 2 TEMP = EPS*ABS((FVECP(I)-FVEC(I))/EPS-ERR(I))
- 3 /(ABS(FVEC(I)) + ABS(FVECP(I)))
- ERR(I) = ONE
- IF (TEMP .GT. EPSMCH .AND. TEMP .LT. EPS)
- 1 ERR(I) = (LOG10(TEMP) - EPSLOG)/EPSLOG
- IF (TEMP .GE. EPS) ERR(I) = ZERO
- 60 CONTINUE
- 70 CONTINUE
- C
- RETURN
- C
- C LAST CARD OF SUBROUTINE CHKDER.
- C
- END
|