PROGRAM d10r4(input,output); (* driver for routine DBRENT *) CONST tol=1.0e-6; eql=1.0e-4; VAR ax,bx,cx,fa,fb,fc,xmin,dbr : real; i,iflag,j,nmin : integer; amin : ARRAY [1..20] OF real; (*$I MODFILE.PAS *) (*$I BESSJ1.PAS *) FUNCTION dfunc(x: real): real; BEGIN dfunc := -bessj1(x) END; (*$I BESSJ0.PAS *) FUNCTION func(x: real): real; BEGIN func := bessj0(x) END; (*$I MNBRAK.PAS *) (*$I DBRENT.PAS *) BEGIN nmin := 0; writeln; writeln('minima of the function bessj0'); writeln('min. #':10,'x':8, 'bessj0(x)':16,'bessj1(x)':12,'DBRENT':11); FOR i := 1 to 100 DO BEGIN ax := i; bx := i+1.0; mnbrak(ax,bx,cx,fa,fb,fc); dbr := dbrent(ax,bx,cx,tol,xmin); IF (nmin = 0) THEN BEGIN amin[1] := xmin; nmin := 1; writeln(nmin:7,xmin:15:6,func(xmin):12:6, dfunc(xmin):12:6,dbr:12:6); END ELSE BEGIN iflag := 0; FOR j := 1 to nmin DO BEGIN IF (abs(xmin-amin[j]) <= eql*xmin) THEN iflag := 1 END; IF (iflag = 0) THEN BEGIN nmin := nmin+1; amin[nmin] := xmin; writeln(nmin:7,xmin:15:6,func(xmin):12:6, dfunc(xmin):12:6,dbr:12:6) END END END END.