python 错误,积分可能发散

ndh0cuux  于 2022-12-28  发布在  Python
关注(0)|答案(2)|浏览(171)

大家好,我在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中求解这个积分

fcg9iug3

fcg9iug31#

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

9rbhqvlz

9rbhqvlz2#

    • 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)符号积分**我们可以用符号计算积分
library(Ryacas0)
x <- Sym("x")
b <- Sym("b")
Integrate(exp(-x/b), x)
## yacas_expression(-(exp(-x/b) * b))

利用这个符号化的结果

b <- 1/1.230219e-07  
retensi <- 1136074
(-exp(-Inf/b) * b) - (-exp(-retensi/b) * b)
## [1] 7068377
    • 3)变量变换**另一种方法是用变量变换替换x,当函数的输入变为某个有限值时,该函数变为无穷大,尝试x = tan(y),我们得到dx = dy/cos(y)^2:
D(quote(tan(y)), "y")
## 1/cos(y)^2

下面的答案与上述两个答案一致。

b <- 1/1.230219e-07  
retensi <- 1136074
sy <- function(y) exp(-tan(y)/b) / cos(y)^2
integrate(sy, atan(retensi), pi/2)
## 7068377 with absolute error < 15

相关问题