积分:积分可能发散

问题描述 投票:0回答:2

我正在使用

integrate
进行一些集成到循环中,并且出现了一个我无法理解的错误,也无法摆脱。这是我可以提取的 MWE:

u_min = 0.06911363
u_max = 1.011011 
m = 0.06990648
s = 0.001092265
integrate(f = function(v){pnorm(v, mean = m, sd = s, lower.tail =  FALSE)}, u_min, u_max)

这会返回一个错误“积分可能发散”,这显然是错误的。我尝试稍微修改一下参数并使其正常工作:

u_min <- 0.07
u_max <- 1.1
m <- 0.0699
s <- 0.00109
integrate(f = function(v){pnorm(v, mean = m, sd = s, lower.tail =  FALSE)}, u_min, u_max)

我尝试使用

integrate
查看
debug
函数,但它是
C
代码的包装。而且我不是正交技术的专家。我看到了这篇SO帖子,但无法从中得到任何东西。

谢谢

r numerical-integration
2个回答
6
投票

需要降低

.Machine$double.eps^0.25
(= 0.0001220703) 的默认容差。例如,尝试这样做:

f <- function(v) pnorm(v, mean = m, sd = s, lower.tail =  FALSE)
integrate(f, u_min, u_max, rel.tol = 1e-15)

## 0.0009421867 with absolute error < 1.1e-17

2
投票

我会使用这个解决方法:

integrate(f = function(v){pnorm(v, mean = m, sd = s, lower.tail =  FALSE)}, 
      max(u_min,m-10*s),min(u_max,m+10*s))$value  + (u_min-m+10*s)*(u_min<m+10*s)

我做了什么:

    当离平均值很远时,
  • pnorm
    lower.tail=FALSE
    基本上为零。因此“拉伸”积分的右极限是没有意义的。所以,当
    u_max > m+10*s
    时,你只需整合到
    m + 10*s
    。您当然可以更改
    10
    因子来提高精度;
  • 另一方面,左边
    pnorm
    基本上总是 1;所以你可以增强左极限,缺少的部分就是
    u_min - m+10*s
    。与上面的逻辑相同。
© www.soinside.com 2019 - 2024. All rights reserved.