code 34435;
real procedure MININDER(X, Y, FX, DFX, TOLX);
real X, Y, FX, DFX, TOLX;
begin comment THE FUNCTION IS APPROXIMATED BY A CUBIC AS
GIVEN BY DAVIDON, 1958, THE STRUCTURE IS SIMILAR TO THE
STRUCTURE OF THE PROGRAM GIVEN BY BRENT, 1973, THIS IS
A REVISION OF 760407;
integer SGN;
real A, B, C, FA, FB, FU, DFA, DFB, DFU, E, D, TOL, BA,
Z, P, Q, S;
if X <= Y then
begin A:= X; FA:= FX; DFA:= DFX;
B:= X:= Y; FB:= FX; DFB:= DFX
end else
begin B:= X; FB:= FX; DFB:= DFX;
A:= X:= Y; FA:= FX; DFA:= DFX
end;
C:= (3 - SQRT(5)) / 2; D:= B - A; E:= D * 2; Z:= E * 2;
LOOP: BA:= B - A; TOL:= TOLX; if BA >= TOL * 3 then
begin if ABS(DFA) <= ABS(DFB) then
begin X:=A; SGN:= 1 end else
begin X:= B; SGN:= -1 end;
if DFA <= 0 and DFB >= 0 then
begin Z:= (FA - FB) * 3 / BA + DFA + DFB;
S:= SQRT(Z ** 2 - DFA * DFB);
P:= if SGN = 1 then DFA - S - Z else
DFB + S - Z; P:= P * BA;
Q:= DFB - DFA + S * 2; Z:= E; E:= D;
D:= if ABS(P) <= ABS(Q) * TOL then TOL * SGN
else -P / Q
end else D:= BA;
if ABS(D) >= ABS(Z * 0.5) or ABS(D) > BA * 0.5 then
begin E:= BA; D:= C * BA * SGN end;
X:= X + D; FU:= FX; DFU:= DFX;
if DFU >= 0 or (FU >= FA and DFA <= 0) then
begin B:= X; FB:= FU; DFB:= DFU end else
begin A:= X; FA:= FU; DFA:= DFU end;
goto LOOP
end; if FA <= FB then
begin X:= A; Y:= B; MININDER:= FA end else
begin X:= B; Y:= A; MININDER:= FB end
end MININDER;
eop