Code:
USE NEQNJ_INT
USE UMACH_INT
IMPLICIT NONE
! Declare variables
INTEGER N
PARAMETER (N=3)
!
INTEGER K, NOUT
DOUBLE PRECISION FNORM, X(N), XGUESS(N)
EXTERNAL FCN, LSJAC
! Set values of initial guess
! XGUESS = ( 4.0 4.0 4.0 )
!
DATA XGUESS/4.0D0, 4.0D0, 4.0D0/
!
!
CALL UMACH (2, NOUT)
! Find the solution
!WRITE(NOUT,*) 'XGUESS:', XGUESS
CALL D_NEQNJ (FCN, LSJAC, X, XGUESS=XGUESS, FNORM=FNORM)
! Output
WRITE (NOUT,99999) (X(K),K=1,N), FNORM
99999 FORMAT (' The roots found are', /, ' X = (', 3F5.1, &
')', /, ' with FNORM = ',F5.4, //)
!
END
! User-supplied subroutine
SUBROUTINE FCN (X, F, N)
INTEGER N
REAL X(N), F(N)
!
REAL EXP, SIN
INTRINSIC EXP, SIN
!
F(1) = X(1) + EXP(X(1)-1.0D0) + (X(2)+X(3))*(X(2)+X(3)) - 27.0D0
F(2) = EXP(X(2)-2.0D0)/X(1) + X(3)*X(3) - 10.0D0
F(3) = X(3) + SIN(X(2)-2.0D0) + X(2)*X(2) - 7.0D0
RETURN
END
! User-supplied subroutine to
! compute Jacobian
SUBROUTINE LSJAC (N, X, FJAC)
INTEGER N
REAL X(N), FJAC(N,N)
!
REAL COS, EXP
INTRINSIC COS, EXP
!
FJAC(1,1) = 1.0D0 + EXP(X(1)-1.0D0)
FJAC(1,2) = 2.0D0*(X(2)+X(3))
FJAC(1,3) = 2.0D0*(X(2)+X(3))
FJAC(2,1) = -EXP(X(2)-2.0D0)*(1.0D0/X(1)**2)
FJAC(2,2) = EXP(X(2)-2.0D0)*(1.0D0/X(1))
FJAC(2,3) = 2.0D0*X(3)
FJAC(3,1) = 0.0D0
FJAC(3,2) = COS(X(2)-2.0D0) + 2.0D0*X(2)
FJAC(3,3) = 1.0D0
RETURN
END