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
|
---|