#include #include #include "nr.h" using namespace std; Vec_DP *fvec_p; void (*nrfuncv)(Vec_I_DP &v, Vec_O_DP &f); void NR::broydn(Vec_IO_DP &x, bool &check, void vecfunc(Vec_I_DP &, Vec_O_DP &)) { const int MAXITS=200; const DP EPS=numeric_limits::epsilon(); const DP TOLF=1.0e-8, TOLX=EPS, STPMX=100.0, TOLMIN=1.0e-12; bool restrt,sing,skip; int i,its,j,k; DP den,f,fold,stpmax,sum,temp,test; int n=x.size(); Mat_DP qt(n,n),r(n,n); Vec_DP c(n),d(n),fvcold(n),g(n),p(n),s(n),t(n),w(n),xold(n); fvec_p=new Vec_DP(n); nrfuncv=vecfunc; Vec_DP &fvec=*fvec_p; f=fmin(x); test=0.0; for (i=0;i test) test=fabs(fvec[i]); if (test < 0.01*TOLF) { check=false; delete fvec_p; return; } for (sum=0.0,i=0;i= EPS*(fabs(fvec[i])+fabs(fvcold[i]))) skip=false; else w[i]=0.0; } if (!skip) { for (i=0;i=0;i--) { for (sum=0.0,j=0;j<=i;j++) sum -= r[j][i]*p[j]; g[i]=sum; } for (i=0;i test) test=fabs(fvec[i]); if (test < TOLF) { check=false; delete fvec_p; return; } if (check) { if (restrt) { delete fvec_p; return; } else { test=0.0; den=MAX(f,0.5*n); for (i=0;i test) test=temp; } if (test < TOLMIN) { delete fvec_p; return; } else restrt=true; } } else { restrt=false; test=0.0; for (i=0;i test) test=temp; } if (test < TOLX) { delete fvec_p; return; } } } nrerror("MAXITS exceeded in broydn"); return; }