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(これは [-infinity, infinity] を (0-1] 間隔にマップするために gsl が適用する変換です) から、x = 0 が t = 1 にマップされていると言えます。さらに、次に、オフセットがゼロのときに積分器が関数を見落とす可能性は非常に小さいです (そのため、 qagit = half_length (1.0 + 0.991455371120812639206854697526329) ~ 1を使用して x=0 で合理的な関数の中心を積分することに問題はありません)。の場合、関数全体 (サポートが非常に限られています) を 30 の評価点のうちの 2 点の間に当てはめます. この場合、GSL は関数を完全に見逃してゼロを返します.

簡単な言葉で要約: GSL は、最初の反復で 30 ポイントのみを使用して [-infinity, infinity] 間隔全体を分析しようとしています。任意の x を中心としたサポートが非常に限られている関数を見逃す可能性は非常に高いです!! 関数のサポートが非常に大きい場合にのみ、qagi を使用してください。

于 2013-08-28T06:26:55.297 に答える