与cuhre

时间:2016-04-11 02:24:29

标签: r numerical-integration

我正在使用来自R2Cuba 1.1-0的cuhre来集成以下功能

fn <- function(x) { 
        pnorm((-2-sum(sqrt(vecRho)*x))/sqrt(1-sum(vecRho)))*prod(dnorm(x))
      } 

其中 vecRho 是一个介于0和0.1之间的6个数字的向量,即

vecRho<-runif(6,0,0.1)

根据定义,被积函数 fn 介于0和1之间。预期积分为正。但是,使用 cuhre 时,当 vecRho 的长度超过5时,结果将变为负数。

NDIM<-length(vecRho) 
cuhre(NDIM, 1, fn, 
      flags = list(verbose =0),
      lower = rep(-10,NDIM),
      upper = rep(10,NDIM))$value
[1] -0.4738284

此外,当 vecRho 的长度> = 6时,随着 vecRho 的长度增加,积分的绝对值增加。

我有什么办法可以解决这个问题吗?谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,明白了,你内置了6个高斯内核的6D积分。我知道1D与高斯内核集成的好答案。它被称为Gauss-Hermite quadrature,并且有一个 R 包。如果你走这条路,你必须这样做 制作咖喱功能,但它可能值得。

一些示例代码:

library(gaussquad)

n.quad <- 128 # integration order

# get the particular (weights,abscissas) as data frame
# with 2 observables and n.quad observations
rule <- ghermite.h.quadrature.rules(n.quad, mu = 0.0)[[n.quad]]

# test function - integrate 1 over exp(-x^2) from -Inf to Inf
# should get sqrt(pi) as an answer
f <- function(x) {
    1.0
}

q <- ghermite.h.quadrature(f, rule)
print(q - sqrt(pi))