R重积分

R重积分,r,R,我有四个像这样的积分: 要计算此函数,我的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)

我有四个像这样的积分:

要计算此函数,我的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)

tol这个积分域可以通过对单纯形应用
cumsum
来获得。因此,您可以使用
simplicalcubature

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)
我已经和Mathematica核对过了,它给出了
0.0596353

通过减少
absError
,我们更接近这个结果,但这需要增加
maxEvals

> adaptIntegrateSimplex(integrand, S, maxEvals = 1000000L, absError = 1e-5)
$integral
[1] 0.05963446

$estAbsError
[1] 9.993167e-06

我更担心的是,您没有计算最终值的误差估计。如果你用数值方法估计四个嵌套积分,很容易出错。数值积分可能会产生一些误差。你对积分有什么建议吗@罗兰
> adaptIntegrateSimplex(integrand, S, maxEvals = 1000000L, absError = 1e-5)
$integral
[1] 0.05963446

$estAbsError
[1] 9.993167e-06