1 | *
|
---|
2 | * $Id: mnsimp.F,v 1.1.1.1 2003-06-11 14:18:29 cmv Exp $
|
---|
3 | *
|
---|
4 | * $Log: not supported by cvs2svn $
|
---|
5 | * Revision 1.2 1996/03/15 18:02:54 james
|
---|
6 | * Modified Files:
|
---|
7 | * mnderi.F eliminate possible division by zero
|
---|
8 | * mnexcm.F suppress print on STOP when print flag=-1
|
---|
9 | * set FVAL3 to flag if FCN already called with IFLAG=3
|
---|
10 | * mninit.F set version 96.03
|
---|
11 | * mnlims.F remove arguments, not needed
|
---|
12 | * mnmigr.F VLEN -> LENV in debug print statement
|
---|
13 | * mnparm.F move call to MNRSET to after NPAR redefined, to zero all
|
---|
14 | * mnpsdf.F eliminate possible division by zero
|
---|
15 | * mnscan.F suppress printout when print flag =-1
|
---|
16 | * mnset.F remove arguments in call to MNLIMS
|
---|
17 | * mnsimp.F fix CSTATU so status is PROGRESS only if new minimum
|
---|
18 | * mnvert.F eliminate possible division by zero
|
---|
19 | *
|
---|
20 | * Revision 1.1.1.1 1996/03/07 14:31:31 mclareni
|
---|
21 | * Minuit
|
---|
22 | *
|
---|
23 | *
|
---|
24 | #include "minuit/pilot.h"
|
---|
25 | SUBROUTINE MNSIMP(FCN,FUTIL)
|
---|
26 | #include "minuit/d506dp.inc"
|
---|
27 | CC Performs a minimization using the simplex method of Nelder
|
---|
28 | CC and Mead (ref. -- Comp. J. 7,308 (1965)).
|
---|
29 | CC
|
---|
30 | #include "minuit/d506cm.inc"
|
---|
31 | EXTERNAL FCN,FUTIL
|
---|
32 | DIMENSION Y(MNI+1)
|
---|
33 | DATA ALPHA,BETA,GAMMA,RHOMIN,RHOMAX / 1.0, 0.5, 2.0, 4.0, 8.0/
|
---|
34 | IF (NPAR .LE. 0) RETURN
|
---|
35 | IF (AMIN .EQ. UNDEFI) CALL MNAMIN(FCN,FUTIL)
|
---|
36 | CFROM = 'SIMPLEX '
|
---|
37 | NFCNFR = NFCN
|
---|
38 | CSTATU= 'UNCHANGED '
|
---|
39 | NPFN=NFCN
|
---|
40 | NPARP1=NPAR+1
|
---|
41 | NPARX = NPAR
|
---|
42 | RHO1 = 1.0 + ALPHA
|
---|
43 | RHO2 = RHO1 + ALPHA*GAMMA
|
---|
44 | WG = 1.0/FLOAT(NPAR)
|
---|
45 | IF (ISW(5) .GE. 0) WRITE(ISYSWR,100) EPSI
|
---|
46 | 100 FORMAT(' START SIMPLEX MINIMIZATION. CONVERGENCE WHEN EDM .LT.'
|
---|
47 | +,E10.2 )
|
---|
48 | DO 2 I= 1, NPAR
|
---|
49 | DIRIN(I) = WERR(I)
|
---|
50 | CALL MNDXDI(X(I),I,DXDI)
|
---|
51 | IF (DXDI .NE. ZERO) DIRIN(I)=WERR(I)/DXDI
|
---|
52 | DMIN = EPSMA2*ABS(X(I))
|
---|
53 | IF (DIRIN(I) .LT. DMIN) DIRIN(I)=DMIN
|
---|
54 | 2 CONTINUE
|
---|
55 | C** choose the initial simplex using single-parameter searches
|
---|
56 | 1 CONTINUE
|
---|
57 | YNPP1 = AMIN
|
---|
58 | JL = NPARP1
|
---|
59 | Y(NPARP1) = AMIN
|
---|
60 | ABSMIN = AMIN
|
---|
61 | DO 10 I= 1, NPAR
|
---|
62 | AMING = AMIN
|
---|
63 | PBAR(I) = X(I)
|
---|
64 | BESTX = X(I)
|
---|
65 | KG = 0
|
---|
66 | NS = 0
|
---|
67 | NF = 0
|
---|
68 | 4 X(I) = BESTX + DIRIN(I)
|
---|
69 | CALL MNINEX(X)
|
---|
70 | CALL FCN(NPARX,GIN, F, U, 4, FUTIL)
|
---|
71 | NFCN = NFCN + 1
|
---|
72 | IF (F .LT. AMING) GO TO 6
|
---|
73 | C failure
|
---|
74 | IF (KG .EQ. 1) GO TO 8
|
---|
75 | KG = -1
|
---|
76 | NF = NF + 1
|
---|
77 | DIRIN(I) = DIRIN(I) * (-0.4)
|
---|
78 | IF (NF .LT. 3) GO TO 4
|
---|
79 | C stop after three failures
|
---|
80 | BESTX = X(I)
|
---|
81 | DIRIN(I) = DIRIN(I) * 3.0
|
---|
82 | AMING = F
|
---|
83 | GO TO 8
|
---|
84 | C
|
---|
85 | C success
|
---|
86 | 6 BESTX = X(I)
|
---|
87 | DIRIN(I) = DIRIN(I) * 3.0
|
---|
88 | AMING = F
|
---|
89 | CSTATU= 'PROGRESS '
|
---|
90 | KG = 1
|
---|
91 | NS = NS + 1
|
---|
92 | IF (NS .LT. 6) GO TO 4
|
---|
93 | C
|
---|
94 | C 3 failures or 6 successes or
|
---|
95 | C local minimum found in ith direction
|
---|
96 | 8 Y(I) = AMING
|
---|
97 | IF (AMING .LT. ABSMIN) JL = I
|
---|
98 | IF (AMING .LT. ABSMIN) ABSMIN = AMING
|
---|
99 | X(I) = BESTX
|
---|
100 | DO 9 K= 1, NPAR
|
---|
101 | 9 P(K,I) = X(K)
|
---|
102 | 10 CONTINUE
|
---|
103 | JH = NPARP1
|
---|
104 | AMIN=Y(JL)
|
---|
105 | CALL MNRAZZ(YNPP1,PBAR,Y,JH,JL)
|
---|
106 | DO 20 I= 1, NPAR
|
---|
107 | 20 X(I) = P(I,JL)
|
---|
108 | CALL MNINEX(X)
|
---|
109 | IF (ISW(5) .GE. 1) CALL MNPRIN(5,AMIN)
|
---|
110 | EDM = BIGEDM
|
---|
111 | SIG2 = EDM
|
---|
112 | NCYCL=0
|
---|
113 | C . . . . . start main loop
|
---|
114 | 50 CONTINUE
|
---|
115 | IF (SIG2 .LT. EPSI .AND. EDM.LT.EPSI) GO TO 76
|
---|
116 | SIG2 = EDM
|
---|
117 | IF ((NFCN-NPFN) .GT. NFCNMX) GO TO 78
|
---|
118 | C calculate new point * by reflection
|
---|
119 | DO 60 I= 1, NPAR
|
---|
120 | PB = 0.
|
---|
121 | DO 59 J= 1, NPARP1
|
---|
122 | 59 PB = PB + WG * P(I,J)
|
---|
123 | PBAR(I) = PB - WG * P(I,JH)
|
---|
124 | 60 PSTAR(I)=(1.+ALPHA)*PBAR(I)-ALPHA*P(I,JH)
|
---|
125 | CALL MNINEX(PSTAR)
|
---|
126 | CALL FCN(NPARX,GIN,YSTAR,U,4,FUTIL)
|
---|
127 | NFCN=NFCN+1
|
---|
128 | IF(YSTAR.GE.AMIN) GO TO 70
|
---|
129 | C point * better than jl, calculate new point **
|
---|
130 | CSTATU = 'PROGRESS '
|
---|
131 | DO 61 I=1,NPAR
|
---|
132 | 61 PSTST(I)=GAMMA*PSTAR(I)+(1.-GAMMA)*PBAR(I)
|
---|
133 | CALL MNINEX(PSTST)
|
---|
134 | CALL FCN(NPARX,GIN,YSTST,U,4,FUTIL)
|
---|
135 | NFCN=NFCN+1
|
---|
136 | C try a parabola through ph, pstar, pstst. min = prho
|
---|
137 | Y1 = (YSTAR-Y(JH)) * RHO2
|
---|
138 | Y2 = (YSTST-Y(JH)) * RHO1
|
---|
139 | RHO = 0.5 * (RHO2*Y1 -RHO1*Y2) / (Y1 -Y2)
|
---|
140 | IF (RHO .LT. RHOMIN) GO TO 66
|
---|
141 | IF (RHO .GT. RHOMAX) RHO = RHOMAX
|
---|
142 | DO 64 I= 1, NPAR
|
---|
143 | 64 PRHO(I) = RHO*PBAR(I) + (1.0-RHO)*P(I,JH)
|
---|
144 | CALL MNINEX(PRHO)
|
---|
145 | CALL FCN(NPARX,GIN,YRHO, U,4,FUTIL)
|
---|
146 | NFCN = NFCN + 1
|
---|
147 | IF (YRHO .LT. AMIN) CSTATU = 'PROGRESS '
|
---|
148 | IF (YRHO .LT. Y(JL) .AND. YRHO .LT. YSTST) GO TO 65
|
---|
149 | IF (YSTST .LT. Y(JL)) GO TO 67
|
---|
150 | IF (YRHO .GT. Y(JL)) GO TO 66
|
---|
151 | C accept minimum point of parabola, PRHO
|
---|
152 | 65 CALL MNRAZZ (YRHO,PRHO,Y,JH,JL)
|
---|
153 | GO TO 68
|
---|
154 | 66 IF (YSTST .LT. Y(JL)) GO TO 67
|
---|
155 | CALL MNRAZZ(YSTAR,PSTAR,Y,JH,JL)
|
---|
156 | GO TO 68
|
---|
157 | 67 CALL MNRAZZ(YSTST,PSTST,Y,JH,JL)
|
---|
158 | 68 NCYCL=NCYCL+1
|
---|
159 | IF (ISW(5) .LT. 2) GO TO 50
|
---|
160 | IF (ISW(5) .GE. 3 .OR. MOD(NCYCL, 10) .EQ. 0) CALL MNPRIN(5,AMIN)
|
---|
161 | GO TO 50
|
---|
162 | C point * is not as good as jl
|
---|
163 | 70 IF (YSTAR .GE. Y(JH)) GO TO 73
|
---|
164 | JHOLD = JH
|
---|
165 | CALL MNRAZZ(YSTAR,PSTAR,Y,JH,JL)
|
---|
166 | IF (JHOLD .NE. JH) GO TO 50
|
---|
167 | C calculate new point **
|
---|
168 | 73 DO 74 I=1,NPAR
|
---|
169 | 74 PSTST(I)=BETA*P(I,JH)+(1.-BETA)*PBAR(I)
|
---|
170 | CALL MNINEX (PSTST)
|
---|
171 | CALL FCN(NPARX,GIN,YSTST,U,4,FUTIL)
|
---|
172 | NFCN=NFCN+1
|
---|
173 | IF(YSTST.GT.Y(JH)) GO TO 1
|
---|
174 | C point ** is better than jh
|
---|
175 | IF (YSTST .LT. AMIN) CSTATU = 'PROGRESS '
|
---|
176 | IF (YSTST .LT. AMIN) GO TO 67
|
---|
177 | CALL MNRAZZ(YSTST,PSTST,Y,JH,JL)
|
---|
178 | GO TO 50
|
---|
179 | C . . . . . . end main loop
|
---|
180 | 76 IF (ISW(5) .GE. 0) WRITE(ISYSWR,'(A)')
|
---|
181 | + ' SIMPLEX MINIMIZATION HAS CONVERGED.'
|
---|
182 | ISW(4) = 1
|
---|
183 | GO TO 80
|
---|
184 | 78 IF (ISW(5) .GE. 0) WRITE(ISYSWR,'(A)')
|
---|
185 | + ' SIMPLEX TERMINATES WITHOUT CONVERGENCE.'
|
---|
186 | CSTATU= 'CALL LIMIT'
|
---|
187 | ISW(4) = -1
|
---|
188 | ISW(1) = 1
|
---|
189 | 80 DO 82 I=1,NPAR
|
---|
190 | PB = 0.
|
---|
191 | DO 81 J=1,NPARP1
|
---|
192 | 81 PB = PB + WG * P(I,J)
|
---|
193 | 82 PBAR(I) = PB - WG * P(I,JH)
|
---|
194 | CALL MNINEX(PBAR)
|
---|
195 | CALL FCN(NPARX,GIN,YPBAR,U,4,FUTIL)
|
---|
196 | NFCN=NFCN+1
|
---|
197 | IF (YPBAR .LT. AMIN) CALL MNRAZZ(YPBAR,PBAR,Y,JH,JL)
|
---|
198 | CALL MNINEX(X)
|
---|
199 | IF (NFCNMX+NPFN-NFCN .LT. 3*NPAR) GO TO 90
|
---|
200 | IF (EDM .GT. 2.0*EPSI) GO TO 1
|
---|
201 | 90 IF (ISW(5) .GE. 0) CALL MNPRIN(5, AMIN)
|
---|
202 | RETURN
|
---|
203 | END
|
---|