#include #include #include "nr.h" using namespace std; void NR::dfpmin(Vec_IO_DP &p, const DP gtol, int &iter, DP &fret, DP func(Vec_I_DP &), void dfunc(Vec_I_DP &, Vec_O_DP &)) { const int ITMAX=200; const DP EPS=numeric_limits::epsilon(); const DP TOLX=4*EPS,STPMX=100.0; bool check; int i,its,j; DP den,fac,fad,fae,fp,stpmax,sum=0.0,sumdg,sumxi,temp,test; int n=p.size(); Vec_DP dg(n),g(n),hdg(n),pnew(n),xi(n); Mat_DP hessin(n,n); fp=func(p); dfunc(p,g); for (i=0;i test) test=temp; } if (test < TOLX) return; for (i=0;i test) test=temp; } if (test < gtol) return; for (i=0;i sqrt(EPS*sumdg*sumxi)) { fac=1.0/fac; fad=1.0/fae; for (i=0;i