template void dfpmin(VecDoub_IO &p, const Doub gtol, Int &iter, Doub &fret, T &funcd) { const Int ITMAX=200; const Doub EPS=numeric_limits::epsilon(); const Doub TOLX=4*EPS,STPMX=100.0; Bool check; Doub den,fac,fad,fae,fp,stpmax,sum=0.0,sumdg,sumxi,temp,test; Int n=p.size(); VecDoub dg(n),g(n),hdg(n),pnew(n),xi(n); MatDoub hessin(n,n); fp=funcd(p); funcd.df(p,g); for (Int i=0;i test) test=temp; } if (test < TOLX) return; for (Int i=0;i test) test=temp; } if (test < gtol) return; for (Int i=0;i sqrt(EPS*sumdg*sumxi)) { fac=1.0/fac; fad=1.0/fae; for (Int i=0;i struct Funcd { Doub EPS; T &func; Doub f; Funcd(T &funcc) : EPS(1.0e-8), func(funcc) {} Doub operator() (VecDoub_I &x) { return f=func(x); } void df(VecDoub_I &x, VecDoub_O &df) { Int n=x.size(); VecDoub xh=x; Doub fold=f; for (Int j=0;j