Beispiel #1
0
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];
	}
}