【问题标题】:Integration with cuhre与文化融合
【发布时间】:2016-05-03 11:23:04
【问题描述】:

我正在使用 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 之间。预计积分为正。然而,当 vecRho 的长度超过 5 时,使用 cuhre 结果变为负数。

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 长度的增加而增加。

我可以做些什么来解决这个问题吗?谢谢!

【问题讨论】:

  • 不清楚prod(dnorm(x))是什么意思。你真的需要所有高斯核的 PRODUCT 吗?
  • 是的,prod(dnorm(x)) 是密度函数。由于所有变量都是独立的,因此 n-dim 变量正态分布的密度实际上是 dnorm(x) 的乘积。

标签: r numerical-integration


【解决方案1】:

好的,知道了,你有 6D 积分,里面有 6 个高斯核。我知道一维与高斯内核集成的好答案。它被称为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))

【讨论】:

  • 谢谢,Severin。我认为使用柯里化函数方法会起作用。事实上,它只是在 r 中使用“集成”功能。问题是运行时。即使 D=3,也非常耗时。我想知道当 D>=3 时“gaussquad”的表现如何。
  • @Loy 好吧,每个集成都是对f 的 128 次调用(如上所示)的加权总和。所以 6D 积分将是 128^6 次调用。我更喜欢 G-H(或者在指数核的情况下是 Gauss-Legendre),因为它比其他任何东西都更好地处理高斯钟下的值
  • 感谢您的 cmets,Severin。会试一试的。
猜你喜欢
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 2013-05-16
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多