[英]ERRORR, The integral is probably divergent in R studio
我认为问题在于表达式exp(-x/b)
在 x 的较高值处具有如此小的值,以至于您遇到了浮点运算的限制。 例如:
retensi = 1136074
b = 1/1.230219e-07
sx <- function(x) exp(-x/b)
sx(1e9)
#> [1] 3.734803e-54
sx(1e10)
#> [1] 0
事实上,快速手动二分查找显示 6,056,915,224 以上的数字将返回 0
sx(6056915224)
#> [1] 4.940656e-324
sx(6056915225)
#> [1] 0
这意味着如果积分的上限设置为 6,056,915,224,您将获得积分的最佳近似值:
integrate(sx, retensi, 6056915224)
#> 7068377 with absolute error < 19
我们可以通过简单地找到表达式的不定积分来确认这是正确的,即: -be^(-x/b) + c
并注意当 x 是无限时这是 0,因此手动计算是:
0 - (-b * exp(-retensi/b))
#> [1] 7068377
如果我们仍然不确定,我们可以在Wolfram Alpha中确认这一点
1)对从retensi
到a
的积分加上从a
到 Inf 的积分求和,得出有效的a
。 我们可以通过尝试 10^i for i = 7, 8, ... 来找到诸如a
代码在第a
有效的 a 处停止。
retensi <- 1136074
b <- 1/1.230219e-07
sx <- function(x) exp(-x/b)
for(a in 10^(\7:12)) {
res <- integrate(sx, a, Inf, stop.on.error = FALSE)
if (res$message == "OK") break
}
a
## [1] 1e+09
res
## 5.21431e-51 with absolute error < 9.7e-51
所以在 a = 10^9 的值下,从a
到Inf
的积分基本上为零,所以我们可以只计算从retensi
到 a = 10^9 的积分
res <- integrate(sx, retensi, a); res
## 7068377 with absolute error < 0.0044
2)注意 -b * exp(-x/b) 的导数在取消 b 后是 sx
D(quote(-b * exp(-x/b)), "x")
## b * (exp(-x/b) * (1/b))
我们有以下检查 (1)
0 - (-b * exp(-retensi/b))
## [1] 7068377
3)另一种方法是使用变量的变化将 x 替换为 function,当 function 的输入变为某个有限值时,该变量变为无穷大。 尝试 x = tan(y) 我们有 dx = dy/cos(y)^2:
D(quote(tan(y)), "y")
## 1/cos(y)^2
下面的答案与以上两个核对。
sy <- function(y) exp(-tan(y)/b) / cos(y)^2
integrate(sy, atan(retensi), pi/2)
## 7068377 with absolute error < 15
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.