⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 brent.c

📁 最大似然估计算法
💻 C
字号:
#include "timeseries.h"#define SHFT(a,b,c,d) (a)=(b); (b) = (c); (c) = (d);double brent(double *start_value, time_series ts, data_kernel dk, noise_model nm, options op, int color_only, double *params_final, double *cov_final) {	int j, jj, k, i, iter;	int imax       = 100;	int count      = 0;	int got_answer = 0;	double a, b, d, etemp, fu, fv, fw, fx, p, q, r, tol1, tol2, u, v, w, x, xm;	double min_cn, wh_mle, MLE, xmin, wh_rms, dummy1, dummy2;	double m, c, delta, sx, sx2, sy, sxy;	double e         = 0.0;	double zeps      = 1.0e-10;	double cgold     = 0.3819660;	double tolerance = 0.01;	double *start, *params_mle, *cov_mle, *params, *cov;	double *value, *wh, *cn, *mle, *par;	if (op.verbose) {		fprintf(op.fpout, " Starting the one-dimensional minimisation : initial ");		fprintf(op.fpout, " %s = %5.2f\n", par_names[nm.key_num[0]], nm.model == 'f' ? pow(10.0, start_value[1]) : start_value[1]);	}		a = (start_value[0] < start_value[2] ? start_value[0] : start_value[2]);	b = (start_value[0] > start_value[2] ? start_value[0] : start_value[2]);	x = w = v = start_value[1];		start      = (double *) calloc((size_t)(3),       sizeof(double));	mle        = (double *) calloc((size_t)(200),     sizeof(double));	value      = (double *) calloc((size_t)(200),     sizeof(double));	wh         = (double *) calloc((size_t)(200),     sizeof(double));	cn         = (double *) calloc((size_t)(200),     sizeof(double));	params_mle = (double *) calloc((size_t)(dk.n_par+2),                sizeof(double));	cov_mle    = (double *) calloc((size_t)((dk.n_par+2)*(dk.n_par+2)), sizeof(double));	params     = (double *) calloc((size_t)(dk.n_par+1),                sizeof(double));	cov        = (double *) calloc((size_t)((dk.n_par+1)*(dk.n_par+1)), sizeof(double));	j = 0;	nm.par[0] = (nm.model == 'f' ? pow(10.0,x) : x); 	if (color_only) {		par = (double *) calloc((size_t)(dk.n_par+1), sizeof(double));		MLE =  cats_CN_only_stripped2(ts, dk, nm, op, par);		for (k = 0; k < dk.n_par; k++) params_mle[k] = par[k];		params_mle[dk.n_par] = 0.0;		params_mle[dk.n_par+1] = par[dk.n_par];		free(par);	} else {		/* MLE = cats_simplex(start, ts, dk, nm, op, params_mle, cov_mle,0); */		MLE = brent_angle(ts, dk, nm, op, params_mle, cov_mle,0);	}	value[j] = x; mle[j] = MLE; wh[j] = params_mle[dk.n_par]; cn[j] = params_mle[dk.n_par+1]; j++;		if (op.verbose) {		fprintf(op.fpout, " %s = %11.6f ", par_names[nm.key_num[0]], nm.model == 'f' ? pow(10.0,x) : x); 		fprintf(op.fpout, "mle = %13.8f ", MLE);		fprintf(op.fpout, "wh = %12.6f ",  params_mle[dk.n_par]*1000.0);		fprintf(op.fpout, "cn = %12.6f\n", params_mle[dk.n_par+1]*1000.0); 	}	fw=fv=fx=-MLE;	for (iter=0; iter < imax; iter++) {		xm   = 0.5*(a+b);		tol2 = 2.0*(tol1=tolerance*fabs(x)+zeps);		if (fabs(x-xm) <= (tol2-0.5*(b-a))) {			got_answer = 1;			xmin = x;			break;		}		if (fabs(e) > tol1) {			r = (x-w)*(fx-fv);			q = (x-v)*(fx-fw);			p = (x-v)*q-(x-w)*r;			q = 2.0 * (q-r);			if (q > 0.0) p = -p;			q = fabs(q);			etemp = e;			e = d;			if (fabs(p) >= fabs(0.5 * q* etemp) || p <= q*(a-x) || p >= q * (b-x)) {				d = cgold*(e=(x >= xm ? a-x : b-x));			} else {				d = p / q;				u = x+d;				if (u-a < tol2 || b-u < tol2) {					d = (xm-x < 0.0 ? -fabs(tol1) : fabs(tol1) );				}			}		} else {			d = cgold*(e=(x >= xm ? a-x : b-x));		}		u = (fabs(d) >= tol1 ? x+d : x + (d < 0.0 ? -fabs(tol1) : fabs(tol1) ));		if (op.verbose) fprintf(op.fpout, " Next choice of %s = %9.6f\n", par_names[nm.key_num[0]], nm.model == 'f' ? pow(10.0,u) : u);		nm.par[0] = (nm.model == 'f' ? pow(10.0,u) : u); 		if (color_only) {			par = (double *) calloc((size_t)(dk.n_par+1), sizeof(double));			MLE =  cats_CN_only_stripped2(ts, dk, nm, op, par);			for (k = 0; k < dk.n_par; k++) params_mle[k] = par[k];			params_mle[dk.n_par] = 0.0;			params_mle[dk.n_par+1] = par[dk.n_par];			free(par);		} else {			/* MLE = cats_simplex(start, ts, dk, nm, op, params_mle, cov_mle,0); */			MLE = brent_angle(ts, dk, nm, op, params_mle, cov_mle,0);		}		value[j] = u; mle[j] = MLE; wh[j] = params_mle[dk.n_par]; cn[j] = params_mle[dk.n_par+1]; j++;		if (op.verbose) {			fprintf(op.fpout, " %s = %11.6f ", par_names[nm.key_num[0]], nm.model == 'f' ? pow(10.0,u) : u); 			fprintf(op.fpout, "mle = %13.8f ", MLE);			fprintf(op.fpout, "wh = %12.6f ",  wh[j-1]*1000.0);			fprintf(op.fpout, "cn = %12.6f\n", cn[j-1]*1000.0); 		}		fu = -MLE;		if (fu <= fx) {			if (u >= x) a = x; else b = x;			SHFT(v,w,x,u)			SHFT(fv,fw,fx,fu)		} else {			if (u < x) a = u; else b = u;			if (fu <= fw || w == x) {				v = w;				w = u;				fv = fw;				fw = fu;			} else if (fu <= fv || v == x || v == w) {					v = u;				fv = fu;			}		}	}	if (got_answer) {		if (op.verbose) fprintf(op.fpout, " Finished : \n\n");		for (k = 0; k < j; k++) {			if (op.verbose) {				fprintf(op.fpout, " %s = %11.6f ", par_names[nm.key_num[0]], nm.model == 'f' ? pow(10.0,value[k]) : value[k]); 				fprintf(op.fpout, "mle = %13.8f ", mle[k]);				fprintf(op.fpout, "wh = %12.6f ",  wh[k]*1000.0);				fprintf(op.fpout, "cn = %12.6f\n", cn[k]*1000.0); 			}			if (value[k] == xmin) {				start[0] = wh[k];				start[1] = cn[k];			}		}		nm.par[0] = (nm.model == 'f' ? pow(10.0,x) : x); 		MLE = linefit_final(start, ts, dk, nm, op, params_mle, cov_mle);		i = dk.n_par+2;		for (j = 0; j < i; j++) params_final[j] = params_mle[j];		params_final[i] = nm.model == 'f' ? pow(10.0,x) : x;		for (j = 0; j < i; j++) {			for (k = 0; k < i; k++) {				cov_final[j + (i+1)*k] = cov_mle[j + i * k];			}		}		cov_final[i * (i+2)] = 1e-6;	} else {		MLE = 0.0;	}	free(start);	free(params_mle);	free(cov_mle);	free(params);	free(cov);        free(value);	free(wh);	free(cn);	free(mle);	return(MLE);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -