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

📄 miser.c

📁 该文件为c++的数学函数库!是一个非常有用的编程工具.它含有各种数学函数,为科学计算、工程应用等程序编写提供方便!
💻 C
📖 第 1 页 / 共 2 页
字号:
      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 + -