void dlinmin(float p[], float xi[], int n, float *fret, float (*func)(float []), void (*dfunc)(float [], float [])) { float dbrent(float ax, float bx, float cx, float (*f)(float), float (*df)(float), float tol, float *xmin); float f1dim(float x); float df1dim(float x); void mnbrak(float *ax, float *bx, float *cx, float *fa, float *fb, float *fc, float (*func)(float)); int j; float xx,xmin,fx,fb,fa,bx,ax; ncom=n; pcom=vector(1,n); xicom=vector(1,n); nrfunc=func; nrdfun=dfunc; for (j=1;j<=n;j++) { pcom[j]=p[j]; xicom[j]=xi[j]; } ax=0.0; xx=1.0; mnbrak(&ax,&xx,&bx,&fa,&fx,&fb,f1dim); *fret=dbrent(ax,xx,bx,f1dim,df1dim,TOL,&xmin); for (j=1;j<=n;j++) { xi[j] *= xmin; p[j] += xi[j]; } free_vector(xicom,1,n); free_vector(pcom,1,n); }
int main(void) { int i,iflag,j,nmin=0; float ax,bx,cx,fa,fb,fc,xmin,dbr,amin[21]; printf("\nMinima of the function bessj0\n"); printf("%10s %8s %16s %12s %11s\n", "min. #","x","bessj0(x)","bessj1(x)","DBRENT"); for (i=1;i<=100;i++) { ax=i; bx=i+1.0; mnbrak(&ax,&bx,&cx,&fa,&fb,&fc,func); dbr=dbrent(ax,bx,cx,func,dfunc,TOL,&xmin); if (nmin == 0) { amin[1]=xmin; nmin=1; printf("%7d %15.6f %12.6f %12.6f %12.6f\n", nmin,xmin,func(xmin),dfunc(xmin),dbr); } else { iflag=0; for (j=1;j<=nmin;j++) if (fabs(xmin-amin[j]) <= EQL*xmin) iflag=1; if (iflag == 0) { amin[++nmin]=xmin; printf("%7d %15.6f %12.6f %12.6f %12.6f\n", nmin,xmin,func(xmin),dfunc(xmin),dbr); } } } return 0; }
const MDOUBLE likeDist2Codon::giveDistanceBrent( const countTableComponentGam& ctc, MDOUBLE& resL, const MDOUBLE initialGuess) const { const MDOUBLE ax=0,bx=initialGuess,cx=_maxPairwiseDistance,tol=_toll; MDOUBLE dist=-1.0; resL = -dbrent(ax,bx,cx, C_evalLikeDist2Codon(ctc,_spVec), C_evalLikeDist_d_2Codon(ctc,_spVec), tol, &dist); return dist; }
void CostFunction::dlinmin(real* &p, real* &xi, real &fret) { const real TOL=2.0e-8; int j; real xx,xmin,fx,fb,fa,bx,ax; // Fill the temporary state vector for (j=0; j<nState; j++) { tempState[j] = p[j]; tempGradient[j] = xi[j]; } ax = 0.0; xx = 1.0; xmin = 0.0; mnbrack(ax,xx,bx,fa,fx,fb); fret = dbrent(ax,xx,bx,TOL,xmin); for (j=0; j<nState; j++) { xi[j] *= xmin; p[j] += xi[j]; } }