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, &litude, ¢er, &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; }
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); } }
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; } }
double gsl_sf_bessel_I1(const double x) { EVAL_RESULT(gsl_sf_bessel_I1_e(x, &result)); }