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