FUNCTION BRENT(AX,BX,CX,F,TOL,XMIN) PARAMETER (ITMAX=100,CGOLD=.3819660,ZEPS=1.0E-10) A=MIN(AX,CX) B=MAX(AX,CX) V=BX W=V X=V E=0. FX=F(X) FV=FX FW=FX DO 11 ITER=1,ITMAX XM=0.5*(A+B) TOL1=TOL*ABS(X)+ZEPS TOL2=2.*TOL1 IF(ABS(X-XM).LE.(TOL2-.5*(B-A))) GOTO 3 IF(ABS(E).GT.TOL1) THEN R=(X-W)*(FX-FV) Q=(X-V)*(FX-FW) P=(X-V)*Q-(X-W)*R Q=2.*(Q-R) IF(Q.GT.0.) P=-P Q=ABS(Q) ETEMP=E E=D IF(ABS(P).GE.ABS(.5*Q*ETEMP).OR.P.LE.Q*(A-X).OR. * P.GE.Q*(B-X)) GOTO 1 D=P/Q U=X+D IF(U-A.LT.TOL2 .OR. B-U.LT.TOL2) D=SIGN(TOL1,XM-X) GOTO 2 ENDIF 1 IF(X.GE.XM) THEN E=A-X ELSE E=B-X ENDIF D=CGOLD*E 2 IF(ABS(D).GE.TOL1) THEN U=X+D ELSE U=X+SIGN(TOL1,D) ENDIF FU=F(U) IF(FU.LE.FX) THEN IF(U.GE.X) THEN A=X ELSE B=X ENDIF V=W FV=FW W=X FW=FX X=U FX=FU ELSE IF(U.LT.X) THEN A=U ELSE B=U ENDIF IF(FU.LE.FW .OR. W.EQ.X) THEN V=W FV=FW W=U FW=FU ELSE IF(FU.LE.FV .OR. V.EQ.X .OR. V.EQ.W) THEN V=U FV=FU ENDIF ENDIF 11 CONTINUE PAUSE 'Brent exceed maximum iterations.' 3 XMIN=X BRENT=FX RETURN END