code 34433; real procedure MININ(X, A, B, FX, TOLX); real X, A, B, FX, TOLX; begin comment SEE BRENT, 1973, P79; real Z, C, D, E, M, P, Q, R, TOL, T, U, V, W, FU, FV, FW, FZ; C:= (3 - SQRT(5)) / 2; if A > B then begin Z:= A; A:= B; B:= Z end; W:= X:= A; FW:= FX; Z:= X:= B; FZ:= FX; if FZ > FW then begin Z:= W; W:= X; V:= FZ; FZ:= FW; FW:= V end; V:= W; FV:= FW; E:= 0; LOOP: M:= (A + B) * 0.5; TOL:= TOLX; T:= TOL * 2; if ABS(Z - M) > T - (B - A) * 0.5 then begin P:= Q:= R:= 0; if ABS(E) > TOL then begin R:= (Z - W) * (FZ - FV); Q:= (Z - V) * (FZ - FW); P:= (Z - V) * Q - (Z - W) * R; Q:= (Q - R) * 2; if Q>0 then P:= -P else Q:= -Q; R:= E; E:= D end; if ABS(P) < ABS(Q * R * 0.5) and P > (A - Z) * Q and P < (B - Z) * Q then begin D:= P / Q; U:= Z + D; if U - A < T or B - U < T then D:= if Z < M then TOL else -TOL end else begin E:= (if Z < M then B else A) - Z; D:= C * E end; U:= X:= Z + (if ABS(D) >= TOL then D else if D > 0 then TOL else -TOL); FU:= FX; if FU <= FZ then begin if U < Z then B:= Z else A:= Z; V:= W; FV:= FW; W:= Z; FW:= FZ; Z:= U; FZ:= FU end else begin if U < Z then A:= U else B:= U; if FU <= FW then begin V:= W; FV:= FW; W:= U; FW:= FU end else if FU <= FV or V = W then begin V:= U; FV:= FU end end; goto LOOP end; X:= Z; MININ:= FZ end MININ; eop