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