📄 miser.c
字号:
GSL_ERROR_VAL ("failed to allocate space for sigma_l", GSL_ENOMEM, 0); } s->sigma_r = (double *) malloc (dim * sizeof (double)); if (s->sigma_r == 0) { free (s->sigma_l); free (s->xmid); free (s->x); free (s); GSL_ERROR_VAL ("failed to allocate space for sigma_r", GSL_ENOMEM, 0); } s->fmax_l = (double *) malloc (dim * sizeof (double)); if (s->fmax_l == 0) { free (s->sigma_r); free (s->sigma_l); free (s->xmid); free (s->x); free (s); GSL_ERROR_VAL ("failed to allocate space for fmax_l", GSL_ENOMEM, 0); } s->fmax_r = (double *) malloc (dim * sizeof (double)); if (s->fmax_r == 0) { free (s->fmax_l); free (s->sigma_r); free (s->sigma_l); free (s->xmid); free (s->x); free (s); GSL_ERROR_VAL ("failed to allocate space for fmax_r", GSL_ENOMEM, 0); } s->fmin_l = (double *) malloc (dim * sizeof (double)); if (s->fmin_l == 0) { free (s->fmax_r); free (s->fmax_l); free (s->sigma_r); free (s->sigma_l); free (s->xmid); free (s->x); free (s); GSL_ERROR_VAL ("failed to allocate space for fmin_l", GSL_ENOMEM, 0); } s->fmin_r = (double *) malloc (dim * sizeof (double)); if (s->fmin_r == 0) { free (s->fmin_l); free (s->fmax_r); free (s->fmax_l); free (s->sigma_r); free (s->sigma_l); free (s->xmid); free (s->x); free (s); GSL_ERROR_VAL ("failed to allocate space for fmin_r", GSL_ENOMEM, 0); } s->fsum_l = (double *) malloc (dim * sizeof (double)); if (s->fsum_l == 0) { free (s->fmin_r); free (s->fmin_l); free (s->fmax_r); free (s->fmax_l); free (s->sigma_r); free (s->sigma_l); free (s->xmid); free (s->x); free (s); GSL_ERROR_VAL ("failed to allocate space for fsum_l", GSL_ENOMEM, 0); } s->fsum_r = (double *) malloc (dim * sizeof (double)); if (s->fsum_r == 0) { free (s->fsum_l); free (s->fmin_r); free (s->fmin_l); free (s->fmax_r); free (s->fmax_l); free (s->sigma_r); free (s->sigma_l); free (s->xmid); free (s->x); free (s); GSL_ERROR_VAL ("failed to allocate space for fsum_r", GSL_ENOMEM, 0); } s->fsum2_l = (double *) malloc (dim * sizeof (double)); if (s->fsum2_l == 0) { free (s->fsum_r); free (s->fsum_l); free (s->fmin_r); free (s->fmin_l); free (s->fmax_r); free (s->fmax_l); free (s->sigma_r); free (s->sigma_l); free (s->xmid); free (s->x); free (s); GSL_ERROR_VAL ("failed to allocate space for fsum2_l", GSL_ENOMEM, 0); } s->fsum2_r = (double *) malloc (dim * sizeof (double)); if (s->fsum2_r == 0) { free (s->fsum2_l); free (s->fsum_r); free (s->fsum_l); free (s->fmin_r); free (s->fmin_l); free (s->fmax_r); free (s->fmax_l); free (s->sigma_r); free (s->sigma_l); free (s->xmid); free (s->x); free (s); GSL_ERROR_VAL ("failed to allocate space for fsum2_r", GSL_ENOMEM, 0); } s->hits_r = (size_t *) malloc (dim * sizeof (size_t)); if (s->hits_r == 0) { free (s->fsum2_r); free (s->fsum2_l); free (s->fsum_r); free (s->fsum_l); free (s->fmin_r); free (s->fmin_l); free (s->fmax_r); free (s->fmax_l); free (s->sigma_r); free (s->sigma_l); free (s->xmid); free (s->x); free (s); GSL_ERROR_VAL ("failed to allocate space for fsum2_r", GSL_ENOMEM, 0); } s->hits_l = (size_t *) malloc (dim * sizeof (size_t)); if (s->hits_l == 0) { free (s->hits_r); free (s->fsum2_r); free (s->fsum2_l); free (s->fsum_r); free (s->fsum_l); free (s->fmin_r); free (s->fmin_l); free (s->fmax_r); free (s->fmax_l); free (s->sigma_r); free (s->sigma_l); free (s->xmid); free (s->x); free (s); GSL_ERROR_VAL ("failed to allocate space for fsum2_r", GSL_ENOMEM, 0); } s->dim = dim; gsl_monte_miser_init (s); return s;}intgsl_monte_miser_init (gsl_monte_miser_state * s){ /* We use 8 points in each halfspace to estimate the variance. There are 2*dim halfspaces. A variance estimate requires a minimum of 2 points. */ s->min_calls = 16 * s->dim; s->min_calls_per_bisection = 32 * s->min_calls; s->estimate_frac = 0.1; s->alpha = 2.0; s->dither = 0.0; return GSL_SUCCESS;}voidgsl_monte_miser_free (gsl_monte_miser_state * s){ free (s->hits_r); free (s->hits_l); free (s->fsum2_r); free (s->fsum2_l); free (s->fsum_r); free (s->fsum_l); free (s->fmin_r); free (s->fmin_l); free (s->fmax_r); free (s->fmax_l); free (s->sigma_r); free (s->sigma_l); free (s->xmid); free (s->x); free (s);}static intestimate_corrmc (gsl_monte_function * f, const double xl[], const double xu[], size_t dim, size_t calls, gsl_rng * r, gsl_monte_miser_state * state, double *result, double *abserr, const double xmid[], double sigma_l[], double sigma_r[]){ size_t i, n; double *x = state->x; double *fsum_l = state->fsum_l; double *fsum_r = state->fsum_r; double *fsum2_l = state->fsum2_l; double *fsum2_r = state->fsum2_r; size_t *hits_l = state->hits_l; size_t *hits_r = state->hits_r; double m = 0.0, q = 0.0; double vol = 1.0; for (i = 0; i < dim; i++) { vol *= xu[i] - xl[i]; hits_l[i] = hits_r[i] = 0; fsum_l[i] = fsum_r[i] = 0.0; fsum2_l[i] = fsum2_r[i] = 0.0; sigma_l[i] = sigma_r[i] = -1; } for (n = 0; n < calls; n++) { double fval; unsigned int j = (n/2) % dim; unsigned int side = (n % 2); for (i = 0; i < dim; i++) { double z = gsl_rng_uniform_pos (r) ; if (i != j) { x[i] = xl[i] + z * (xu[i] - xl[i]); } else { if (side == 0) { x[i] = xmid[i] + z * (xu[i] - xmid[i]); } else { x[i] = xl[i] + z * (xmid[i] - xl[i]); } } } fval = GSL_MONTE_FN_EVAL (f, x); /* recurrence for mean and variance */ { double d = fval - m; m += d / (n + 1.0); q += d * d * (n / (n + 1.0)); } /* compute the variances on each side of the bisection */ for (i = 0; i < dim; i++) { if (x[i] <= xmid[i]) { fsum_l[i] += fval; fsum2_l[i] += fval * fval; hits_l[i]++; } else { fsum_r[i] += fval; fsum2_r[i] += fval * fval; hits_r[i]++; } } } for (i = 0; i < dim; i++) { double fraction_l = (xmid[i] - xl[i]) / (xu[i] - xl[i]); if (hits_l[i] > 0) { fsum_l[i] /= hits_l[i]; sigma_l[i] = sqrt (fsum2_l[i] - fsum_l[i] * fsum_l[i] / hits_l[i]); sigma_l[i] *= fraction_l * vol / hits_l[i]; } if (hits_r[i] > 0) { fsum_r[i] /= hits_r[i]; sigma_r[i] = sqrt (fsum2_r[i] - fsum_r[i] * fsum_r[i] / hits_r[i]); sigma_r[i] *= (1 - fraction_l) * vol / hits_r[i]; } } *result = vol * m; if (calls < 2) { *abserr = GSL_POSINF; } else { *abserr = vol * sqrt (q / (calls * (calls - 1.0))); } return GSL_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -