3

我正在使用 gsl_integration_qagi 例程对 (-infty, +infty) 进行集成。我的期望是沿 x 轴平移时,积分结果(曲线下面积)不应改变。然而那不是,我观察到的。我在某个地方犯了错误吗?代码附在下面:

变量偏移量基本上创建了平移。对于 0、10.0、20.0 的偏移值,该区域保持不变(如预期的那样),但在偏移 ~ 40.0 之后突然下降到零

double offset=200.0;

double f (double x, void * params) {
   double alpha = *(double *) params;
   x += offset;
   double f = exp(-x*x);
   return f;
}

int main(int argc, const char * argv[])
{

    gsl_integration_workspace * w
     = gsl_integration_workspace_alloc (1000);

    double result, error;
    double expected = -4.0;
    double alpha = 1.0;

    gsl_function F;
    F.function = &f;
    F.params = α

    gsl_integration_qagi (&F, 0, 0.001, 1000,
                          w, &result, &error);

    printf ("result = % .18f\n", result);

    return 0;
}

在此先感谢,尼基尔

4

1 回答 1

4

您正在尝试使用 qagi 集成一个支持非常有限的功能,这很糟糕。积分完全错过被积函数的可能性很大。为什么?

Qagi 使用 15 点高斯法则。这大约意味着它将在以下固定点评估函数(第一次迭代)

  const double center = 0.5 * (a + b);
  const double half_length = 0.5 * (b - a);
  const double abscissa = half_length * xgk[jtw];
  const double fval1 = GSL_FN_EVAL (f, center - abscissa);
  const double fval2 = GSL_FN_EVAL (f, center + abscissa);  

在哪里

  static const double xgk[8] =    /* abscissae of the 15-point kronrod rule */
  {
     0.991455371120812639206854697526329,
     0.949107912342758524526189684047851,
     0.864864423359769072789712788640926,
     0.741531185599394439863864773280788,
     0.586087235467691130294144838258730,
     0.405845151377397166906606412076961,
     0.207784955007898467600689403773245,
     0.000000000000000000000000000000000
 };

(这直接取自 GSL 代码)。然后,根据 GSL 从这些点获得的值,它可以进一步划分特定区域并再次应用此规则。

从非线性变换x = (1-t)/t(这是 gsl 应用于将 [-infinity, infinity] 映射到 (0-1] 区间)的变换,我们可以说 x = 0 映射到 t = 1。此外,其中一个点评估是t = half_length (1.0 + 0.991455371120812639206854697526329) ~ 1。然后,当偏移量为零时,积分器错过您的函数的机会非常小(这就是为什么使用 qagi 在 x=0 处积分合理的函数没有问题)。但是,当您将 x 平移一个偏移量时, 你在 30 个评估点中的两个之间拟合整个函数(支持非常有限)。在这种情况下,GSL 完全错过了你的函数并返回零。

简而言之:GSL 试图在第一次迭代中仅使用 30 个点来分析整个 [-infinity, infinity] 区间。它错过以任意 x 为中心的支持非常有限的函数的可能性非常高!仅当您的功能支持非常大时才使用 qagi!

于 2013-08-28T06:26:55.297 回答