【发布时间】:2013-08-28 14:56:22
【问题描述】:
我正在使用 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;
}
提前致谢, 尼基尔
【问题讨论】:
-
你能解决这个问题吗?我复制了您的问题,但由于对函数的有限支持和 qagi 使用的低阶 (15) 高斯近似,GSL 错过了被积函数,我想不出其他解释。
-
嗨,我认为你是对的。问题是由于两个原因:(a)您正确指出的支持有限,但更重要的是,(b)由于 x= (1-t)/t 变换导致的非线性收缩因子,它收缩了 a因子 1/t^2... 在 t = 1000 时,由于 10^-6 的收缩,支撑基本上看起来像一条狭窄的垂直线:(...我还没有找到一个好的方法来获得摆脱这个问题。我的主要问题是两个(或更多)由 x = 1000+ 分隔的高斯需要积分......所以我需要一些绝对好的方法来处理积分,没有太多损失
-
这些功能的大致支持你都知道,所以不用qagi了!从 x_median - epsilon 到 x_median + epsilon 的简单 qag 适合,其中 epsilon 是一个合理的数字。对每个高斯分别执行此操作,然后对最终结果求和。没有适用于所有情况的通用自适应积分器。您需要向集成商提供有关该功能的任何“额外”信息(限制集成范围是提供这些额外信息的一种方式)
-
但这是一个很好的数字问题。我给了 +1 票
-
但如果你真的想要一个非常强大且速度慢的积分器,请尝试新 GSL 1.15/1.16 版本中的 CQUAD 双自适应