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

📄 airy.c

📁 开放gsl矩阵运算
💻 C
📖 第 1 页 / 共 2 页
字号:
 [GJ] Sun Apr 19 18:14:31 EDT 1998 There was something wrong with these coefficients. I was getting errors after 3 or 4 digits. So I recomputed this table. Now I get double precision agreement with Mathematica. But it does not seem possible that the small differences here would account for the original discrepancy. There must have been something wrong with my original usage...*/static double data_aip[36] = { -0.0187519297793867540198, -0.0091443848250055004725,  0.0009010457337825074652, -0.0001394184127221491507,  0.0000273815815785209370, -0.0000062750421119959424,  0.0000016064844184831521, -0.0000004476392158510354,  0.0000001334635874651668, -0.0000000420735334263215,  0.0000000139021990246364, -0.0000000047831848068048,  0.0000000017047897907465, -0.0000000006268389576018,  0.0000000002369824276612, -0.0000000000918641139267,  0.0000000000364278543037, -0.0000000000147475551725,  0.0000000000060851006556, -0.0000000000025552772234,  0.0000000000010906187250, -0.0000000000004725870319,  0.0000000000002076969064, -0.0000000000000924976214,  0.0000000000000417096723, -0.0000000000000190299093,  0.0000000000000087790676, -0.0000000000000040927557,  0.0000000000000019271068, -0.0000000000000009160199,  0.0000000000000004393567, -0.0000000000000002125503,  0.0000000000000001036735, -0.0000000000000000509642,  0.0000000000000000252377, -0.0000000000000000125793/*  -.0187519297793868  -.0091443848250055,   .0009010457337825,  -.0001394184127221,   .0000273815815785,  -.0000062750421119,   .0000016064844184,  -.0000004476392158,   .0000001334635874,  -.0000000420735334,   .0000000139021990,  -.0000000047831848,   .0000000017047897,  -.0000000006268389,   .0000000002369824,  -.0000000000918641,   .0000000000364278,  -.0000000000147475,   .0000000000060851,  -.0000000000025552,   .0000000000010906,  -.0000000000004725,   .0000000000002076,  -.0000000000000924,   .0000000000000417,  -.0000000000000190,   .0000000000000087,  -.0000000000000040,   .0000000000000019,  -.0000000000000009,   .0000000000000004,  -.0000000000000002,   .0000000000000001,  -.0000000000000000*/};static cheb_series aip_cs = {  data_aip,  35,  -1, 1,  17};/* chebyshev for Bi(x) asymptotic factor    based on SLATEC bie() Series for BIP        on the interval  1.25000D-01 to  3.53553D-01                   with weighted error   1.91E-17                    log weighted error  16.72          significant figures required  15.35               decimal places required  17.41 Series for BIP2       on the interval  0.          to  1.25000D-01                   with weighted error   1.05E-18                    log weighted error  17.98          significant figures required  16.74               decimal places required  18.71*/static double data_bip[24] = {  -0.08322047477943447,   0.01146118927371174,   0.00042896440718911,  -0.00014906639379950,  -0.00001307659726787,   0.00000632759839610,  -0.00000042226696982,  -0.00000019147186298,   0.00000006453106284,  -0.00000000784485467,  -0.00000000096077216,   0.00000000070004713,  -0.00000000017731789,   0.00000000002272089,   0.00000000000165404,  -0.00000000000185171,   0.00000000000059576,  -0.00000000000012194,   0.00000000000001334,   0.00000000000000172,  -0.00000000000000145,   0.00000000000000049,  -0.00000000000000011,   0.00000000000000001};static cheb_series bip_cs = {  data_bip,  23,  -1, 1,  14};static double data_bip2[29] = {      -0.113596737585988679,   0.0041381473947881595,   0.0001353470622119332,   0.0000104273166530153,   0.0000013474954767849,   0.0000001696537405438,  -0.0000000100965008656,  -0.0000000167291194937,  -0.0000000045815364485,   0.0000000003736681366,   0.0000000005766930320,   0.0000000000621812650,  -0.0000000000632941202,  -0.0000000000149150479,   0.0000000000078896213,   0.0000000000024960513,  -0.0000000000012130075,  -0.0000000000003740493,   0.0000000000002237727,   0.0000000000000474902,  -0.0000000000000452616,  -0.0000000000000030172,   0.0000000000000091058,  -0.0000000000000009814,  -0.0000000000000016429,   0.0000000000000005533,   0.0000000000000002175,  -0.0000000000000001737,  -0.0000000000000000010};static cheb_series bip2_cs = {  data_bip2,  28,  -1, 1,  10};/* assumes x >= 1.0 */inline static int airy_aie(const double x, gsl_mode_t mode, gsl_sf_result * result){  double sqx = sqrt(x);  double z   = 2.0/(x*sqx) - 1.0;  double y   = sqrt(sqx);  gsl_sf_result result_c;  cheb_eval_mode_e(&aip_cs, z, mode, &result_c);  result->val = (0.28125 + result_c.val)/y;  result->err = result_c.err/y + GSL_DBL_EPSILON * fabs(result->val);  return GSL_SUCCESS;}/* assumes x >= 2.0 */static int airy_bie(const double x, gsl_mode_t mode, gsl_sf_result * result){  const double ATR =  8.7506905708484345;  const double BTR = -2.0938363213560543;  if(x < 4.0) {    double sqx = sqrt(x);    double z   = ATR/(x*sqx) + BTR;    double y   = sqrt(sqx);    gsl_sf_result result_c;    cheb_eval_mode_e(&bip_cs, z, mode, &result_c);    result->val = (0.625 + result_c.val)/y;    result->err = result_c.err/y + GSL_DBL_EPSILON * fabs(result->val);  }  else {    double sqx = sqrt(x);    double z   = 16.0/(x*sqx) - 1.0;    double y   = sqrt(sqx);    gsl_sf_result result_c;    cheb_eval_mode_e(&bip2_cs, z, mode, &result_c);    result->val = (0.625 + result_c.val)/y;    result->err = result_c.err/y + GSL_DBL_EPSILON * fabs(result->val);  }  return GSL_SUCCESS;}/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/intgsl_sf_airy_Ai_e(const double x, const gsl_mode_t mode, gsl_sf_result * result){  /* CHECK_POINTER(result) */  if(x < -1.0) {    gsl_sf_result mod;    gsl_sf_result theta;    gsl_sf_result cos_result;    int stat_mp  = airy_mod_phase(x, mode, &mod, &theta);    int stat_cos = gsl_sf_cos_err_e(theta.val, theta.err, &cos_result);    result->val  = mod.val * cos_result.val;    result->err  = fabs(mod.val * cos_result.err) + fabs(cos_result.val * mod.err);    result->err += GSL_DBL_EPSILON * fabs(result->val);    return GSL_ERROR_SELECT_2(stat_mp, stat_cos);  }  else if(x <= 1.0) {    const double z = x*x*x;    gsl_sf_result result_c0;    gsl_sf_result result_c1;    cheb_eval_mode_e(&aif_cs, z, mode, &result_c0);    cheb_eval_mode_e(&aig_cs, z, mode, &result_c1);    result->val  = 0.375 + (result_c0.val - x*(0.25 + result_c1.val));    result->err  = result_c0.err + fabs(x*result_c1.err);    result->err += GSL_DBL_EPSILON * fabs(result->val);    return GSL_SUCCESS;  }  else {    double x32 = x * sqrt(x);    double s   = exp(-2.0*x32/3.0);    gsl_sf_result result_aie;    int stat_aie = airy_aie(x, mode, &result_aie);    result->val  = result_aie.val * s;    result->err  = result_aie.err * s + result->val * x32 * GSL_DBL_EPSILON;    result->err += GSL_DBL_EPSILON * fabs(result->val);    CHECK_UNDERFLOW(result);    return stat_aie;  }}intgsl_sf_airy_Ai_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result){  /* CHECK_POINTER(result) */  if(x < -1.0) {    gsl_sf_result mod;    gsl_sf_result theta;    gsl_sf_result cos_result;    int stat_mp  = airy_mod_phase(x, mode, &mod, &theta);    int stat_cos = gsl_sf_cos_err_e(theta.val, theta.err, &cos_result);    result->val  = mod.val * cos_result.val;    result->err  = fabs(mod.val * cos_result.err) + fabs(cos_result.val * mod.err);    result->err += GSL_DBL_EPSILON * fabs(result->val);    return GSL_ERROR_SELECT_2(stat_mp, stat_cos);  }  else if(x <= 1.0) {    const double z = x*x*x;    gsl_sf_result result_c0;    gsl_sf_result result_c1;    cheb_eval_mode_e(&aif_cs, z, mode, &result_c0);    cheb_eval_mode_e(&aig_cs, z, mode, &result_c1);    result->val  = 0.375 + (result_c0.val - x*(0.25 + result_c1.val));    result->err  = result_c0.err + fabs(x*result_c1.err);    result->err += GSL_DBL_EPSILON * fabs(result->val);    if(x > 0.0) {      const double scale = exp(2.0/3.0 * sqrt(z));      result->val *= scale;      result->err *= scale;    }    return GSL_SUCCESS;  }  else {    return airy_aie(x, mode, result);  }}int gsl_sf_airy_Bi_e(const double x, gsl_mode_t mode, gsl_sf_result * result){  /* CHECK_POINTER(result) */  if(x < -1.0) {    gsl_sf_result mod;    gsl_sf_result theta;    gsl_sf_result sin_result;    int stat_mp  = airy_mod_phase(x, mode, &mod, &theta);    int stat_sin = gsl_sf_sin_err_e(theta.val, theta.err, &sin_result);    result->val  = mod.val * sin_result.val;    result->err  = fabs(mod.val * sin_result.err) + fabs(sin_result.val * mod.err);    result->err += GSL_DBL_EPSILON * fabs(result->val);    return GSL_ERROR_SELECT_2(stat_mp, stat_sin);  }  else if(x < 1.0) {    const double z = x*x*x;    gsl_sf_result result_c0;    gsl_sf_result result_c1;    cheb_eval_mode_e(&bif_cs, z, mode, &result_c0);    cheb_eval_mode_e(&big_cs, z, mode, &result_c1);    result->val  = 0.625 + result_c0.val + x*(0.4375 + result_c1.val);    result->err  = result_c0.err + fabs(x * result_c1.err);    result->err += GSL_DBL_EPSILON * fabs(result->val);    return GSL_SUCCESS;  }  else if(x <= 2.0) {    const double z = (2.0*x*x*x - 9.0)/7.0;    gsl_sf_result result_c0;    gsl_sf_result result_c1;    cheb_eval_mode_e(&bif2_cs, z, mode, &result_c0);    cheb_eval_mode_e(&big2_cs, z, mode, &result_c1);    result->val  = 1.125 + result_c0.val + x*(0.625 + result_c1.val);    result->err  = result_c0.err + fabs(x * result_c1.err);    result->err += GSL_DBL_EPSILON * fabs(result->val);    return GSL_SUCCESS;  }  else {    const double y = 2.0*x*sqrt(x)/3.0;    const double s = exp(y);    if(y > GSL_LOG_DBL_MAX - 1.0) {      OVERFLOW_ERROR(result);    }    else {      gsl_sf_result result_bie;      int stat_bie = airy_bie(x, mode, &result_bie);      result->val  = result_bie.val * s;      result->err  = result_bie.err * s + fabs(1.5*y * (GSL_DBL_EPSILON * result->val));      result->err += GSL_DBL_EPSILON * fabs(result->val);      return stat_bie;    }  }}intgsl_sf_airy_Bi_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result){  /* CHECK_POINTER(result) */  if(x < -1.0) {    gsl_sf_result mod;    gsl_sf_result theta;    gsl_sf_result sin_result;    int stat_mp  = airy_mod_phase(x, mode, &mod, &theta);    int stat_sin = gsl_sf_sin_err_e(theta.val, theta.err, &sin_result);    result->val  = mod.val * sin_result.val;    result->err  = fabs(mod.val * sin_result.err) + fabs(sin_result.val * mod.err);    result->err += GSL_DBL_EPSILON * fabs(result->val);    return GSL_ERROR_SELECT_2(stat_mp, stat_sin);  }  else if(x < 1.0) {    const double z = x*x*x;    gsl_sf_result result_c0;    gsl_sf_result result_c1;    cheb_eval_mode_e(&bif_cs, z, mode, &result_c0);    cheb_eval_mode_e(&big_cs, z, mode, &result_c1);    result->val  = 0.625 + result_c0.val + x*(0.4375 + result_c1.val);    result->err  = result_c0.err + fabs(x * result_c1.err);    result->err += GSL_DBL_EPSILON * fabs(result->val);    if(x > 0.0) {      const double scale = exp(-2.0/3.0 * sqrt(z));      result->val *= scale;      result->err *= scale;    }    return GSL_SUCCESS;  }  else if(x <= 2.0) {    const double x3 = x*x*x;    const double z  = (2.0*x3 - 9.0)/7.0;    const double s  = exp(-2.0/3.0 * sqrt(x3));    gsl_sf_result result_c0;    gsl_sf_result result_c1;    cheb_eval_mode_e(&bif2_cs, z, mode, &result_c0);    cheb_eval_mode_e(&big2_cs, z, mode, &result_c1);    result->val  = s * (1.125 + result_c0.val + x*(0.625 + result_c1.val));    result->err  = s * (result_c0.err + fabs(x * result_c1.err));    result->err += GSL_DBL_EPSILON * fabs(result->val);    return GSL_SUCCESS;  }  else {    return airy_bie(x, mode, result);  }}/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/#include "eval.h"double gsl_sf_airy_Ai(const double x, gsl_mode_t mode){  EVAL_RESULT(gsl_sf_airy_Ai_e(x, mode, &result));}double gsl_sf_airy_Ai_scaled(const double x, gsl_mode_t mode){  EVAL_RESULT(gsl_sf_airy_Ai_scaled_e(x, mode, &result));}double gsl_sf_airy_Bi(const double x, gsl_mode_t mode){  EVAL_RESULT(gsl_sf_airy_Bi_e(x, mode, &result));}double gsl_sf_airy_Bi_scaled(const double x, gsl_mode_t mode){  EVAL_RESULT(gsl_sf_airy_Bi_scaled_e(x, mode, &result));}

⌨️ 快捷键说明

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