【问题标题】:Integrate: the integral is probably divergent积分:积分可能是发散的
【发布时间】:2015-12-09 11:13:37
【问题描述】:

我正在使用 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)

我试图用debug查看integrate函数,但它是Ccode的包装。我也不是正交技术的专家。我看到了这个SO post,但无法从中得到任何东西。

谢谢

【问题讨论】:

  • 来自?integrateLike all numerical integration routines, these evaluate the function on a finite set of points. If the function is approximately constant (in particular, zero) over nearly all its range it is possible that the result and error estimate may be seriously wrong。你的函数基本上总是0。
  • @nicola 那么怎么做才能不返回错误呢?我该如何解决这个问题?
  • @Plinth 您必须缩小函数不为零的值周围的区间,请参阅下面 nicola 的回答

标签: r integrate


【解决方案1】:

.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)
    

    我做了什么:

    • pnormlower.tail=FALSE 在离平均值很远的时候基本上为零。因此,“拉伸”积分的右极限是没有意义的。因此,当u_max &gt; m+10*s 时,您只需集成到m + 10*s。您当然可以更改 10 因子以增加精度;
    • 另一方面,左边的pnorm基本总是1;所以你可以增强左限制,缺少的部分只是u_min - m+10*s。与上述相同的逻辑。

    【讨论】:

    • 这确实是一个好技巧,我没有得到间隔长度可能会改变估计结果
    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    相关资源
    最近更新 更多