C MAIN PROGRAM TO MINIMIZE A FUNCTION REPRESENTED BY ROUTINE CALCF
C
      PARAMETER (N = 10, LWORK = N*(N+10))
      REAL X0(N), X(N), F, WORK(LWORK)
      EXTERNAL CALCF
C
C SPECIFY INITIAL ESTIMATE OF THE SOLUTION
C
      WRITE (*,*) 'COMPUTING...'
      DO 10 I = 1,N
         X0(I) = I / FLOAT(N+1)
10    CONTINUE
C
C MINIMIZE FUNCTION
C
      CALL UNCMIN (N, X0, CALCF, X, F, IERROR, WORK, LWORK)
C
C PRINT RESULTS
C
      WRITE (*,*) 'UNCMIN RESULTS'
      IF (IERROR .NE. 0) WRITE (*,*) ' ERROR CODE =', IERROR
      WRITE (*,*) ' F(X*) =', F
      WRITE (*,*) ' X* ='
      WRITE (*,800) (X(I), I = 1,N)
C
      WRITE (*,*)
      WRITE (*,*) 'REFERENCE RESULTS FROM IBM PC/AT'
      WRITE (*,*) ' UNCMIN WARNING -- INFO = 3: CANNOT FIND LOWER POINT'
      WRITE (*,*) ' ERROR CODE =           3'
      WRITE (*,*) ' F(X*) =    1.00116'    
      WRITE (*,*) ' X* ='
      WRITE (*,*) 
     *  '   0.999745    0.999598    0.999370    0.998893    0.998021'
      WRITE (*,*) 
     *  '   0.996177    0.992586    0.985264    0.970914    0.942591'
C
      STOP
800   FORMAT (5F12.6)
      END
C
C OBJECTIVE FUNCTION
C
      SUBROUTINE CALCF (N, X, F)
      REAL X(N), F, T1, T2
C
      T1 = 0.0
      T2 = 0.0
      DO 10 I = 2,N
         T1 = T1 + (X(I)-X(I-1)**2)**2
         T2 = T2 + (1.0-X(I-1))**2
10    CONTINUE
      F = 1.0 + 100.0*T1 + T2
C
      RETURN
      END
