template struct Amebsa { T &funk; const Doub ftol; Ranq1 ran; Doub yb; Int ndim; VecDoub pb; Int mpts; VecDoub y; MatDoub p; Doub tt; Amebsa(VecDoub_I &point, const Doub del, T &funkk, const Doub ftoll) : funk(funkk), ftol(ftoll), ran(1234), yb(numeric_limits::max()), ndim(point.size()), pb(ndim), mpts(ndim+1), y(mpts), p(mpts,ndim) { for (Int i=0;i::max()), ndim(point.size()), pb(ndim), mpts(ndim+1), y(mpts), p(mpts,ndim) { for (Int i=0;i::max()), ndim(pp.ncols()), pb(ndim), mpts(pp.nrows()), y(mpts), p(pp) { inity(); } void inity() { VecDoub x(ndim); for (Int i=0;i yhi) { ihi=0; ilo=1; ynhi=yhi; yhi=ylo; ylo=ynhi; } for (Int i=3;i<=mpts;i++) { Doub yt=y[i-1]+tt*log(ran.doub()); if (yt <= ylo) { ilo=i-1; ylo=yt; } if (yt > yhi) { ynhi=yhi; ihi=i-1; yhi=yt; } else if (yt > ynhi) { ynhi=yt; } } Doub rtol=2.0*abs(yhi-ylo)/(abs(yhi)+abs(ylo)); if (rtol < ftol || iter < 0) { SWAP(y[0],y[ilo]); for (Int n=0;n= ynhi) { Doub ysave=yhi; ytry=amotsa(p,y,psum,ihi,yhi,0.5); if (ytry >= ysave) { for (Int i=0;i