PROGRAM d10r11(input,output);
(* driver for routine DFPMIN *)

(*$I MODFILE.PAS *)

CONST
   ndim = 3;
   ftol = 1.0e-6;
   pio2 = 1.5707963;
TYPE
   RealArrayNP = ARRAY [1..ndim] OF real;
   RealArrayNPbyNP = ARRAY [1..ndim,1..ndim] OF real;
VAR
   LinminNcom: integer;
   LinminPcom,LinminXicom: RealArrayNP; 
   angl,fret: real;
   iter,k: integer;
   p: RealArrayNP;

(*$I BESSJ0.PAS *)

(*$I BESSJ1.PAS *)

FUNCTION fnc(VAR x: RealArrayNP): real;
BEGIN
   fnc := 1.0-bessj0(x[1]-0.5)*bessj0(x[2]-0.5)*bessj0(x[3]-0.5)
END;

PROCEDURE dfnc(VAR x,df: RealArrayNP);
BEGIN
   df[1] := bessj1(x[1]-0.5)*bessj0(x[2]-0.5)*bessj0(x[3]-0.5);
   df[2] := bessj0(x[1]-0.5)*bessj1(x[2]-0.5)*bessj0(x[3]-0.5);
   df[3] := bessj0(x[1]-0.5)*bessj0(x[2]-0.5)*bessj1(x[3]-0.5)
END;

(*$I F1DIM.PAS *)

(*$I MNBRAK.PAS *)

(*$I BRENT.PAS *)

(*$I LINMIN.PAS *)

(*$I DFPMIN.PAS *)

BEGIN
   writeln('Program finds the minimum of a function');
   writeln('with different trial starting vectors.');
   writeln('True minimum is (0.5,0.5,0.5)');
   FOR k := 0 TO 4 DO BEGIN
      angl := pio2*k/4.0;
      p[1] := 2.0*cos(angl);
      p[2] := 2.0*sin(angl);
      p[3] := 0.0;
      writeln;
      writeln('Starting vector: (',
         p[1]:6:4,',',p[2]:6:4,',',p[3]:6:4,')');
      dfpmin(p,ndim,ftol,iter,fret);
      writeln('Iterations:',iter:3);
      writeln('Solution vector: (',
         p[1]:6:4,',',p[2]:6:4,',',p[3]:6:4,')');
      writeln('Func. value at solution',fret:14)
   END
END.