Пример #1
0
scalar sasfit_peak_GiddingsAmplitude(scalar x, sasfit_param * param)
{
	scalar y, bckgr, a_tmp, amplitude, center, width, y0, x0;
	gsl_sf_result besselI1;
	int status;

	SASFIT_ASSERT_PTR( param );

	sasfit_get_param(param, 4, &amplitude, &center, &width, &bckgr);

	SASFIT_CHECK_COND1((width <= 0), param, "width(%lg) <= 0 ",width);
	SASFIT_CHECK_COND1((center <= 0), param, "center(%lg) <= 0 ",center);

	gsl_set_error_handler_off();

	if (x<0) return bckgr;

	a_tmp = amplitude;
	param->p[0]=1.0;
	x0=x;
	x = sasfit_peak_GiddingsMode(param);
	param->p[0]=a_tmp;
	if (x0==0.0) {
		y0 = exp(-center/width)*center/gsl_pow_2(width);
	} else {
		status = gsl_sf_bessel_I1_e(2*sqrt(center*x)/width,&besselI1);
		if (status) {
//			SASFIT_CHECK_COND1((status != 0), param, "%s",gsl_strerror(status));
//			return 0;
			besselI1.val = 0;
		}
		y0 = 1.0/width * sqrt(center/x) *
			besselI1.val*
			exp((-x-center)/width);
	}

	x = x0;
	if (x==0.0) {
		y = bckgr +
			amplitude/y0;
	} else {
		status = gsl_sf_bessel_I1_e(2*sqrt(center*x)/width,&besselI1);
		if (status) {
//			SASFIT_CHECK_COND1((status != 0), param, "%s",gsl_strerror(status));
//			return 0;
			besselI1.val = 0;
		}
		y = bckgr +
			amplitude/y0/width * sqrt(center/x) *
			besselI1.val*
			exp((-x-center)/width);
	}
	return y;
}
Пример #2
0
int gsl_sf_bessel_K1_e(const double x, gsl_sf_result * result)
{
  /* CHECK_POINTER(result) */

  if(x <= 0.0) {
    DOMAIN_ERROR(result);
  }
  else if(x < 2.0*GSL_DBL_MIN) {
    OVERFLOW_ERROR(result);
  }
  else if(x <= 2.0) {
    const double lx = log(x);
    int stat_I1;
    gsl_sf_result I1;
    gsl_sf_result c;
    cheb_eval_e(&bk1_cs, 0.5*x*x-1.0, &c);
    stat_I1 = gsl_sf_bessel_I1_e(x, &I1);
    result->val  = (lx-M_LN2)*I1.val + (0.75 + c.val)/x;
    result->err  = c.err/x + fabs(lx)*I1.err;
    result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
    return stat_I1;
  }
  else {
    gsl_sf_result K1_scaled;
    int stat_K1 = gsl_sf_bessel_K1_scaled_e(x, &K1_scaled);
    int stat_e  = gsl_sf_exp_mult_err_e(-x, 0.0,
                                           K1_scaled.val, K1_scaled.err,
					   result);
    result->err = fabs(result->val) * (GSL_DBL_EPSILON*fabs(x) + K1_scaled.err/K1_scaled.val);
    return GSL_ERROR_SELECT_2(stat_e, stat_K1);
  }
}
Пример #3
0
int gsl_sf_bessel_K1_scaled_e(const double x, gsl_sf_result * result)
{
  /* CHECK_POINTER(result) */

  if(x <= 0.0) {
    DOMAIN_ERROR(result);
  }
  else if(x < 2.0*GSL_DBL_MIN) {
    OVERFLOW_ERROR(result);
  }
  else if(x <= 2.0) {
    const double lx = log(x);
    const double ex = exp(x);
    int stat_I1;
    gsl_sf_result I1;
    gsl_sf_result c;
    cheb_eval_e(&bk1_cs, 0.5*x*x-1.0, &c);
    stat_I1 = gsl_sf_bessel_I1_e(x, &I1);
    result->val  = ex * ((lx-M_LN2)*I1.val + (0.75 + c.val)/x);
    result->err  = ex * (c.err/x + fabs(lx)*I1.err);
    result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
    return stat_I1;
  }
  else if(x <= 8.0) {
    const double sx = sqrt(x);
    gsl_sf_result c;
    cheb_eval_e(&ak1_cs, (16.0/x-5.0)/3.0, &c);
    result->val  = (1.25 + c.val) / sx;
    result->err  = c.err / sx;
    result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
    return GSL_SUCCESS;
  }
  else {
    const double sx = sqrt(x);
    gsl_sf_result c;
    cheb_eval_e(&ak12_cs, 16.0/x-1.0, &c);
    result->val  = (1.25 + c.val) / sx;
    result->err  = c.err / sx;
    result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
    return GSL_SUCCESS;
  }
}
Пример #4
0
double gsl_sf_bessel_I1(const double x)
{
  EVAL_RESULT(gsl_sf_bessel_I1_e(x, &result));
}