我想通过使用R中的积分函数将exp(-x)从0到100000集成。但是我发现答案是2.061453e-45,几乎为0(零)。真正的答案是1-exp(-100000),几乎是1.我如何使用R中的集成函数来实现这种集成以接近正确的解决方案?
以下是使用的R代码
ab<-function(x) { return(exp(-x)) }
integrate(ab,0,100000)$value
输出是
2.061453e-45
这是R在大间隔中使用的数值积分方法的限制。 documentation of the integrate
function说:
当无限区间的积分明确地这样做时,而不是仅使用大数作为端点。这增加了正确答案的机会 - 任何在无限区间内积分有限的函数必须在该区间的大部分时间内接近零。
因为函数exp(-x)
在x=100000
非常接近零(实际值大约是3.56 × 10^-43430
),并且因为函数正在减小,越来越接近零,你可以安全地将函数集成到无穷大,
integrate( ab , 0 , Inf)
你会得到正确的结果,
1
这是@Aziz的好答案的补充。
integrate
的一个参数是
细分:细分过程中产生的子间隔数。
默认值为100. I.e。该函数在0到100000之间展开100个点。这将从根本上对欠似的点进行采样 - x = 0附近的点。如果您遇到积分到无穷大的问题,您可以将积分分解为更小的段 - 从0到10,10到20和20到100000 - 在x = 0附近强制采样更重。
> integrate(ab,0,10)$value
[1] 0.9999546
> integrate(ab,10,20)$value
[1] 4.539787e-05
> integrate(ab,20,100000)$value
[1] 4.341375e-54
>
> integrate(ab,0,10)$value + integrate(ab,10,20)$value + integrate(ab,20,100000)$value
[1] 1