Function BRENT(AX, BX, CX, TOL:real;var XMIN:real):real; label 1,2,3; const ITMAX = 100; CGOLD = 0.381966; ZEPS = 0.1e-9; var A,B,D,V,X,W,E,FV1,XM,TOL1,TOL2,FX,FW,P,Q,R,ETEMP,DUM,U,ZZ,FU:real; ITER,I:integer; begin A:=AX; If CX < AX Then A:=CX; B:=AX; If CX > AX Then B:=CX; V:=BX; W:=V; X:=V; E:=0; FX:=FUNC(X); FV1:=FX; FW:=FX; For ITER:=1 To ITMAX do begin XM:=0.5 * (A + B); TOL1:=TOL * Abs(X) + ZEPS; TOL2:=2 * TOL1; If Abs(X - XM) <= TOL2 - 0.5 * (B - A) Then goto 3; If Abs(E) > TOL1 Then begin R:=(X - W) * (FX - FV1); Q:=(X - V) * (FX - FW); P:=(X - V) * Q - (X - W) * R; Q:=2 * (Q - R); If Q > 0 Then P:=-P; Q:=Abs(Q); ETEMP:=E; E:=D; DUM:=Abs(0.5 * Q * ETEMP); If (Abs(P)>=DUM) or (P<=Q*(B - X)) or (P>=Q*(B - X)) Then GOTO 1; D:=P / Q; U:=X + D; If (U - A < TOL2) Or (B - U < TOL2) Then begin if XM-X>=0 then ZZ:=1 else ZZ:=-1; D:=Abs(TOL1) * ZZ; end; goto 2; end; 1: If X >= XM Then E:=A - X Else E:=B - X; D:=CGOLD * E; 2: If Abs(D) >= TOL1 Then U:=X + D Else begin if D >= 0 THEN ZZ:=1 else ZZ:=-1; U:=X + Abs(TOL1) * ZZ; end; FU:=FUNC(U); If FU <= FX Then begin If U >= X Then A:=X Else B:=X; V:=W; FV1:=FW; W:=X; FW:=FX; X:=U; FX:=FU; end else begin If U < X Then A:=U else B:=U; If (FU <= FW) Or (W = X) Then begin V:=W; FV1:=FW; W:=U; FW:=FU; end Else If (FU <= FV1) Or (V = X) Or (V = W) Then begin V:=U; FV1:=FU; end; end; end; If ITER > ITMAX Then ShowMessage('Brent exceed maximum iterations.'); 3: XMIN:=X; BRENT:=FX; end;