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

Last change on this file 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.