ERRORR,积分可能在R studio中发散

4sup72z8  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(252)

大家好,我在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我不明白,我犯的错误在哪里可以有人帮助我吗?请告诉我正确的代码的家伙详细信息
重点是如何在RStudio中求解这个积分

hk8txs48

hk8txs481#

我认为问题在于,表达式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

我们可以通过简单地求出表达式的不定积分来确认这是正确的,即:-b e^(-x/b) + c,并且注意当x无限大时这是0,因此手动计算是:

0 - (-b * exp(-retensi/b))
#> [1] 7068377

如果我们仍然不确定,可以在Wolfram Alpha中确认

klsxnrf1

klsxnrf12#

**1)**将retensia的积分与a到Inf的积分相加,得到a。我们可以通过尝试10^i(i = 7,8,...)来找到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,尝试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

相关问题