mirror of
https://git.planet-casio.com/Lephenixnoir/OpenLibm.git
synced 2025-01-01 06:23:39 +01:00
c977aa998f
Replace amos with slatec
158 lines
5.7 KiB
Fortran
158 lines
5.7 KiB
Fortran
*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
|