求解与多元正态相关的双积分

时间:2016-11-08 00:02:23

标签: r numerical-integration

我试图用已知均值向量和协方差矩阵求解与多元正态密度相关的双积分:

  it('should work with synchronous actions', function() {
    var increment = $('#increment');
    increment.$('.action').click();

    expect(increment.$('.val').getText()).toEqual('1');
  });

然而,它一直给我错误:

library(cubature)

mu1 <- matrix(c(3,3), nrow=2)
sigma1 <- rbind(c(4,-1), c(-1,6))

quadratic <- function(a,b) {
  X <- matrix(c(a,b),nrow=2)
  Q <- (-1/2)*t(X-mu1)%*%solve(sigma1)%*%(X-mu1)
}

NormalPDF <- function(x1,x2) {
  f <- (1/(2*pi))*(1/sqrt(det(sigma1)))*exp(quadratic(x1,x2))
}

# Solving for P(1 < X1 < 3, 1 < X2 < 3)
P <- adaptIntegrate(NormalPDF(x1,x2), c(1,3), c(1,3))

我的代码有任何明显的错误吗?

1 个答案:

答案 0 :(得分:2)

HubertL指出第一个参数应该是一个函数,而不是带参数的函数调用。假设函数将接受“x”参数,单个长度为2的向量,因此需要在其参数和对辅助函数的调用中修改NormalPDF函数。另一个错误是如何设置限制。

考虑一下:

library(cubature)

mu1 <- matrix(c(3,3), nrow=2)
sigma1 <- rbind(c(4,-1), c(-1,6))

quadratic <- function(a,b) {
  X <- matrix(c(a,b),nrow=2)
  Q <- (-1/2)*t(X-mu1)%*%solve(sigma1)%*%(X-mu1)
}

NormalPDF <- function(x) {
  f <- (1/(2*pi))*(1/sqrt(det(sigma1)))*exp(quadratic(x[1],x[2]))
}
# Solving for P(1 < X1 < 3, 1 < X2 < 3)
P <- adaptIntegrate( NormalPDF, lowerLimit= c(1,1),  upperLimit=c(3,3))
P
#==============
$integral
[1] 0.09737084

$error
[1] 1.131395e-08

$functionEvaluations
[1] 17

$returnCode
[1] 0

这将正方形上的密度与(1,1)处的“左下角”和(3,3)处的“右上角”相结合。问题中的调用始终返回0,因为域是单点。如果您要使用“数字”做任何事情,则需要使用P$integral从列表中提取。似乎合理的是结果小于0.25,因为我们只是在最小值(3,3)的四分之一平面中进行评估。