code 34210;
procedure LINEMIN(N, X, D, ND, ALFA, G, FUNCT, F0, F1, DF0, DF1,
EVLMAX, STRONGSEARCH, IN); value N, ND, F0, DF0, STRONGSEARCH;
integer N, EVLMAX; boolean STRONGSEARCH;
real ND, ALFA, F0, F1, DF0, DF1;
array X, D, G, IN;
real procedure FUNCT;
begin integer I, EVL;
boolean NOTININT;
real F,OLDF,DF,OLDDF,MU,ALFA0,Q,W,Y,Z,RELTOL,ABSTOL
,EPS, AID;
array X0[1:N];
RELTOL:= IN[1]; ABSTOL:= IN[2]; MU:= IN[3]; EVL:= 0;
ALFA0:= 0; OLDF:= F0; OLDDF:= DF0; Y:= ALFA; NOTININT:= true;
DUPVEC(1, N, 0, X0, X);
EPS:= (SQRT(VECVEC(1, N, 0, X, X)) * RELTOL + ABSTOL) / ND;
Q:= (F1 - F0) / (ALFA * DF0);
INT: if NOTININT then NOTININT:= DF1 < 0 and Q > MU;
AID:= ALFA; if DF1 >= 0 then
begin Z:= 3 * (OLDF - F1) / ALFA + OLDDF + DF1;
W:= SQRT(Z ** 2 - OLDDF * DF1);
ALFA:= ALFA * (1 - (DF1 + W - Z) / (DF1 - OLDDF + W * 2));
if ALFA < EPS then ALFA:= EPS else
if AID - ALFA < EPS then ALFA:= AID - EPS
end CUBIC INTERPOLATION
else if NOTININT then
begin ALFA0:= ALFA:= Y; OLDDF:= DF1; OLDF:= F1 end
else ALFA:= 0.5 * ALFA; Y:= ALFA + ALFA0;
DUPVEC(1, N, 0, X, X0); ELMVEC(1, N, 0, X, D, Y);
EPS:= (SQRT(VECVEC(1, N, 0, X, X)) * RELTOL + ABSTOL) / ND;
F:= FUNCT(N, X, G); EVL:= EVL +1 ; DF:= VECVEC(1, N, 0, D, G);
Q:= (F - F0) / (Y * DF0);
if (if NOTININT or STRONGSEARCH then true else
Q < MU or Q > 1 - MU) and EVL < EVLMAX then
begin if NOTININT or DF > 0 or Q < MU then
begin DF1:= DF; F1:= F end
else
begin ALFA0:= Y; ALFA:= AID - ALFA; OLDDF:= DF; OLDF:= F
end;
if ALFA > EPS * 2 then goto INT
end;
ALFA:= Y; EVLMAX:= EVL; DF1:= DF; F1:= F
end LINEMIN
eop