source: Sophya/trunk/SophyaExt/CodeMinuit/code/mnseek.F@ 2907

Last change on this file since 2907 was 2403, checked in by cmv, 22 years ago

Creation du module de code source de MINUIT (CERNLIB) extrait par CMV

cmv 11/06/2003

File size: 3.4 KB
Line 
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"
12CC Performs a rough (but global) minimization by monte carlo search.
13CC Each time a new minimum is found, the search area is shifted
14CC to be centered at the best value. Random points are chosen
15CC uniformly over a hypercube determined by current step sizes.
16CC The Metropolis algorithm accepts a worse point with probability
17CC exp(-d/UP), where d is the degradation. Improved points
18CC are of course always accepted. Actual steps are random
19CC multiples of the nominal steps (DIRIN).
20CC
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
44C 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
49C 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)
57C 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
79C Metropolis algorithm
80 BAR = (AMIN-FTRY)/UP
81 CALL MNRN15(RNUM,ISEED)
82 IF (BAR .LT. LOG(RNUM)) GO TO 500
83 ENDIF
84C 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
91C 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
Note: See TracBrowser for help on using the repository browser.