[2403] | 1 | *
|
---|
| 2 | * $Id: mnseek.F,v 1.1.1.1 2003-06-11 14:18:29 cmv Exp $
|
---|
| 3 | *
|
---|
| 4 | * $Log: not supported by cvs2svn $
|
---|
| 5 | * Revision 1.1.1.1 1996/03/07 14:31:31 mclareni
|
---|
| 6 | * Minuit
|
---|
| 7 | *
|
---|
| 8 | *
|
---|
| 9 | #include "minuit/pilot.h"
|
---|
| 10 | SUBROUTINE MNSEEK(FCN,FUTIL)
|
---|
| 11 | #include "minuit/d506dp.inc"
|
---|
| 12 | CC Performs a rough (but global) minimization by monte carlo search.
|
---|
| 13 | CC Each time a new minimum is found, the search area is shifted
|
---|
| 14 | CC to be centered at the best value. Random points are chosen
|
---|
| 15 | CC uniformly over a hypercube determined by current step sizes.
|
---|
| 16 | CC The Metropolis algorithm accepts a worse point with probability
|
---|
| 17 | CC exp(-d/UP), where d is the degradation. Improved points
|
---|
| 18 | CC are of course always accepted. Actual steps are random
|
---|
| 19 | CC multiples of the nominal steps (DIRIN).
|
---|
| 20 | CC
|
---|
| 21 | #include "minuit/d506cm.inc"
|
---|
| 22 | EXTERNAL FCN,FUTIL
|
---|
| 23 | PARAMETER (TWOPI=2.0*3.141593)
|
---|
| 24 | DIMENSION XBEST(MNI), XMID(MNI)
|
---|
| 25 | MXFAIL = WORD7(1)
|
---|
| 26 | IF (MXFAIL .LE. 0) MXFAIL=100+20*NPAR
|
---|
| 27 | MXSTEP = 10*MXFAIL
|
---|
| 28 | IF (AMIN .EQ. UNDEFI) CALL MNAMIN(FCN,FUTIL)
|
---|
| 29 | ALPHA = WORD7(2)
|
---|
| 30 | IF (ALPHA .LE. ZERO) ALPHA=3.
|
---|
| 31 | IF (ISW(5) .GE. 1) WRITE (ISYSWR, 3) MXFAIL,MXSTEP,ALPHA
|
---|
| 32 | 3 FORMAT (' MNSEEK: MONTE CARLO MINIMIZATION USING METROPOLIS',
|
---|
| 33 | + ' ALGORITHM'/' TO STOP AFTER',I6,' SUCCESSIVE FAILURES, OR',
|
---|
| 34 | + I7,' STEPS'/' MAXIMUM STEP SIZE IS',F9.3,' ERROR BARS.')
|
---|
| 35 | CSTATU= 'INITIAL '
|
---|
| 36 | IF (ISW(5) .GE. 2) CALL MNPRIN(2,AMIN)
|
---|
| 37 | CSTATU = 'UNCHANGED '
|
---|
| 38 | IFAIL = 0
|
---|
| 39 | RNUM = ZERO
|
---|
| 40 | RNUM1 = ZERO
|
---|
| 41 | RNUM2 = ZERO
|
---|
| 42 | NPARX = NPAR
|
---|
| 43 | FLAST = AMIN
|
---|
| 44 | C set up step sizes, starting values
|
---|
| 45 | DO 10 IPAR = 1, NPAR
|
---|
| 46 | IEXT = NEXOFI(IPAR)
|
---|
| 47 | DIRIN(IPAR) = 2.0*ALPHA*WERR(IPAR)
|
---|
| 48 | IF (NVARL(IEXT) .GT. 1) THEN
|
---|
| 49 | C parameter with limits
|
---|
| 50 | CALL MNDXDI(X(IPAR),IPAR,DXDI)
|
---|
| 51 | IF (DXDI .EQ. ZERO) DXDI=1.
|
---|
| 52 | DIRIN(IPAR) = 2.0*ALPHA*WERR(IPAR)/DXDI
|
---|
| 53 | IF (ABS(DIRIN(IPAR)).GT.TWOPI) DIRIN(IPAR)=TWOPI
|
---|
| 54 | ENDIF
|
---|
| 55 | XMID(IPAR) = X(IPAR)
|
---|
| 56 | 10 XBEST(IPAR) = X(IPAR)
|
---|
| 57 | C search loop
|
---|
| 58 | DO 500 ISTEP= 1, MXSTEP
|
---|
| 59 | IF (IFAIL .GE. MXFAIL) GO TO 600
|
---|
| 60 | DO 100 IPAR= 1, NPAR
|
---|
| 61 | CALL MNRN15(RNUM1,ISEED)
|
---|
| 62 | CALL MNRN15(RNUM2,ISEED)
|
---|
| 63 | 100 X(IPAR) = XMID(IPAR) + 0.5*(RNUM1+RNUM2-1.)*DIRIN(IPAR)
|
---|
| 64 | CALL MNINEX(X)
|
---|
| 65 | CALL FCN(NPARX,GIN,FTRY,U,4,FUTIL)
|
---|
| 66 | NFCN = NFCN + 1
|
---|
| 67 | IF (FTRY .LT. FLAST) THEN
|
---|
| 68 | IF (FTRY .LT. AMIN) THEN
|
---|
| 69 | CSTATU = 'IMPROVEMNT'
|
---|
| 70 | AMIN = FTRY
|
---|
| 71 | DO 200 IB= 1, NPAR
|
---|
| 72 | 200 XBEST(IB) = X(IB)
|
---|
| 73 | IFAIL = 0
|
---|
| 74 | IF (ISW(5) .GE. 2) CALL MNPRIN(2,AMIN)
|
---|
| 75 | ENDIF
|
---|
| 76 | GO TO 300
|
---|
| 77 | ELSE
|
---|
| 78 | IFAIL = IFAIL + 1
|
---|
| 79 | C Metropolis algorithm
|
---|
| 80 | BAR = (AMIN-FTRY)/UP
|
---|
| 81 | CALL MNRN15(RNUM,ISEED)
|
---|
| 82 | IF (BAR .LT. LOG(RNUM)) GO TO 500
|
---|
| 83 | ENDIF
|
---|
| 84 | C Accept new point, move there
|
---|
| 85 | 300 CONTINUE
|
---|
| 86 | DO 350 J= 1, NPAR
|
---|
| 87 | XMID(J) = X(J)
|
---|
| 88 | 350 CONTINUE
|
---|
| 89 | FLAST = FTRY
|
---|
| 90 | 500 CONTINUE
|
---|
| 91 | C end search loop
|
---|
| 92 | 600 CONTINUE
|
---|
| 93 | IF (ISW(5) .GT. 1) WRITE (ISYSWR,601) IFAIL
|
---|
| 94 | 601 FORMAT(' MNSEEK:',I5,' SUCCESSIVE UNSUCCESSFUL TRIALS.')
|
---|
| 95 | DO 700 IB= 1, NPAR
|
---|
| 96 | 700 X(IB) = XBEST(IB)
|
---|
| 97 | CALL MNINEX(X)
|
---|
| 98 | IF (ISW(5) .GE. 1) CALL MNPRIN(2,AMIN)
|
---|
| 99 | IF (ISW(5) .EQ. 0) CALL MNPRIN(0,AMIN)
|
---|
| 100 | RETURN
|
---|
| 101 | END
|
---|