PROGRAM d10r6(input,output); (* driver for routine POWELL *) (*$I MODFILE.PAS *) CONST ndim = 3; ftol = 1.0e-6; TYPE RealArrayNP = ARRAY [1..ndim] OF real; RealArrayNPbyNP = ARRAY [1..ndim,1..ndim] OF real; RealArray3 = RealArrayNP; VAR LinminNcom: integer; LinminPcom,LinminXicom: RealArrayNP; fret: real; i,iter,j: integer; p: RealArrayNP; xi: RealArrayNPbyNP; (*$I BESSJ0.PAS *) FUNCTION fnc(VAR x: RealArray3): real; (* Programs using FNC must define the type TYPE RealArray3 = ARRAY [1..3] OF real; in the main routine. *) BEGIN fnc := 0.5-bessj0(sqr(x[1]-1.0)+sqr(x[2]-2.0)+sqr(x[3]-3.0)) END; (*$I F1DIM.PAS *) (*$I MNBRAK.PAS *) (*$I BRENT.PAS *) (*$I LINMIN.PAS *) (*$I POWELL.PAS *) BEGIN xi[1,1] := 1.0; xi[1,2] := 0.0; xi[1,3] := 0.0; xi[2,1] := 0.0; xi[2,2] := 1.0; xi[2,3] := 0.0; xi[3,1] := 0.0; xi[3,2] := 0.0; xi[3,3] := 1.0; p[1] := 1.5; p[2] := 1.5; p[3] := 2.5; powell(p,xi,ndim,ftol,iter,fret); writeln('Iterations:',iter:3); writeln; writeln('Minimum found at: '); FOR i := 1 TO ndim DO write(p[i]:12:6); writeln; writeln; writeln('Minimum function value =',fret:12:6); writeln; writeln('True minimum of function is at:'); writeln(1.0:12:6,2.0:12:6,3.0:12:6) END.