+++ /dev/null
-*DECK FDJAC3
- SUBROUTINE FDJAC3 (FCN, M, N, X, FVEC, FJAC, LDFJAC, IFLAG,
- + EPSFCN, WA)
-C***BEGIN PROLOGUE FDJAC3
-C***SUBSIDIARY
-C***PURPOSE Subsidiary to SNLS1 and SNLS1E
-C***LIBRARY SLATEC
-C***TYPE SINGLE PRECISION (FDJAC3-S, DFDJC3-D)
-C***AUTHOR (UNKNOWN)
-C***DESCRIPTION
-C
-C This subroutine computes a forward-difference approximation
-C to the M by N Jacobian matrix associated with a specified
-C problem of M functions in N variables.
-C
-C The subroutine statement is
-C
-C SUBROUTINE FDJAC3(FCN,M,N,X,FVEC,FJAC,LDFJAC,IFLAG,EPSFCN,WA)
-C
-C where
-C
-C FCN is the name of the user-supplied subroutine which
-C calculates the functions. FCN must be declared
-C in an external statement in the user calling
-C program, and should be written as follows.
-C
-C SUBROUTINE FCN(IFLAG,M,N,X,FVEC,FJAC,LDFJAC)
-C INTEGER LDFJAC,M,N,IFLAG
-C REAL X(N),FVEC(M),FJAC(LDFJAC,N)
-C ----------
-C When IFLAG.EQ.1 calculate the functions at X and
-C return this vector in FVEC.
-C ----------
-C RETURN
-C END
-C
-C The value of IFLAG should not be changed by FCN unless
-C the user wants to terminate execution of FDJAC3.
-C In this case set IFLAG to a negative integer.
-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. N must not exceed M.
-C
-C X is an input array of length N.
-C
-C FVEC is an input array of length M which must contain the
-C functions evaluated at X.
-C
-C FJAC is an output M by N array which contains the
-C approximation to the Jacobian matrix evaluated at X.
-C
-C LDFJAC is a positive integer input variable not less than M
-C which specifies the leading dimension of the array FJAC.
-C
-C IFLAG is an integer variable which can be used to terminate
-C THE EXECUTION OF FDJAC3. See description of FCN.
-C
-C EPSFCN is an input variable used in determining a suitable
-C step length for the forward-difference approximation. This
-C approximation assumes that the relative errors in the
-C functions are of the order of EPSFCN. If EPSFCN is less
-C than the machine precision, it is assumed that the relative
-C errors in the functions are of the order of the machine
-C precision.
-C
-C WA is a work array of length M.
-C
-C***SEE ALSO SNLS1, SNLS1E
-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 891214 Prologue converted to Version 4.0 format. (BAB)
-C 900326 Removed duplicate information from DESCRIPTION section.
-C (WRB)
-C 900328 Added TYPE section. (WRB)
-C***END PROLOGUE FDJAC3
- INTEGER M,N,LDFJAC,IFLAG
- REAL EPSFCN
- REAL X(*),FVEC(*),FJAC(LDFJAC,*),WA(*)
- INTEGER I,J
- REAL EPS,EPSMCH,H,TEMP,ZERO
- REAL R1MACH
- SAVE ZERO
- DATA ZERO /0.0E0/
-C***FIRST EXECUTABLE STATEMENT FDJAC3
- EPSMCH = R1MACH(4)
-C
- EPS = SQRT(MAX(EPSFCN,EPSMCH))
-C SET IFLAG=1 TO INDICATE THAT FUNCTION VALUES
-C ARE TO BE RETURNED BY FCN.
- IFLAG = 1
- DO 20 J = 1, N
- TEMP = X(J)
- H = EPS*ABS(TEMP)
- IF (H .EQ. ZERO) H = EPS
- X(J) = TEMP + H
- CALL FCN(IFLAG,M,N,X,WA,FJAC,LDFJAC)
- IF (IFLAG .LT. 0) GO TO 30
- X(J) = TEMP
- DO 10 I = 1, M
- FJAC(I,J) = (WA(I) - FVEC(I))/H
- 10 CONTINUE
- 20 CONTINUE
- 30 CONTINUE
- RETURN
-C
-C LAST CARD OF SUBROUTINE FDJAC3.
-C
- END