繁体   English   中英

错误,积分可能在 R 工作室发散

[英]ERRORR, The integral is probably divergent in R studio

Haii 伙计们,我在 R 中遇到代码问题,我想运行积分代码,但代码不起作用。 有没有人可以帮助我?

retensi = 1136074
b = 1/1.230219e-07  
sx = function(x)
{exp(-x/b)}
integrate(sx, retensi, Inf) 

当我运行这段代码时,ruslt 是错误Error in integrate(sx, retensi, Inf): the integral is probably divergent我不明白,我犯的错误在哪里有人可以帮助我吗? 请告诉我正确代码的详细信息

pov 是如何解决 R 工作室中的这个积分

在此处输入图像描述

我认为问题在于表达式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)对从retensia的积分加上从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 的值下,从aInf的积分基本上为零,所以我们可以只计算从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM