我有四个这样的积分:
要计算此功能,我的R代码如下:
tol <- 1e-05
t.cutoff = 1e-15
integrand <- function(kappa, sigma, eta, tau) sqrt((tau-eta)/(sigma-kappa))*exp(-(sigma-kappa))
integrate1 <- function(sigma, eta, tau) integrate(integrand, tol * sigma, (1 - tol) * sigma, sigma = sigma, eta = eta, tau = tau)$value
integrate1.vec <- function(sigma, eta, tau) mapply(integrate1, sigma, eta, tau)
integrate2 <- function(eta, tau) integrate(integrate1.vec, tol * eta, (1 - tol) * eta, eta = eta, tau = tau)$value
integrate2.vec <- function(eta, tau) mapply(integrate2, eta, tau)
integrate3 <- function(tau) integrate(integrate2.vec, tol * tau, (1 - tol) * tau, tau = tau)$value
integrate3.vec <- function(tau) mapply(integrate3, tau)
c_t <- function(t) ifelse(t > t.cutoff, integrate(integrate3.vec, tol * t, (1 - tol) * t)$value, 0)
c_t(1)
我认为上面的代码效率很低;我想知道这种积分是否有任何改进或可用的包装。提前谢谢!
答案 0 :(得分:1)
可以通过将cumsum
应用于单纯形来获得此集成域。因此,您可以使用SimplicialCubature
包。
library(SimplicialCubature)
integrand <- function(y){
x <- cumsum(y)
sqrt((x[4]-x[3])/(x[2]-x[1]))*exp(-(x[2]-x[1]))
}
t <- 1
S <- t*CanonicalSimplex(4)
adaptIntegrateSimplex(integrand, S, maxEvals = 100000L, absError = 1e-4)
结果:
> adaptIntegrateSimplex(integrand, S, maxEvals = 100000L, absError = 1e-4)
$integral
[1] 0.05961484
$estAbsError
[1] 9.991182e-05
我已经使用Mathematica进行了检查,它提供了0.0596353
。
我们通过减少absError
来接近此结果,但这需要增加maxEvals
:
> adaptIntegrateSimplex(integrand, S, maxEvals = 1000000L, absError = 1e-5)
$integral
[1] 0.05963446
$estAbsError
[1] 9.993167e-06