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