蒙特卡罗积分-如何查找错误



我需要应用蒙特卡罗积分来估计[0,1]中的以下函数:

f(x) = exp(-ax) cos(bx) 

其中CCD_ 1和CCD_。但是,我需要使用四种不同的蒙特卡罗变化:命中或未命中、粗略、重要性采样和方差控制。所有这些都在本书第392页:https://edisciplinas.usp.br/pluginfile.php/5168099/mod_resource/content/1/Julio%20Stern.pdf.然而,在估计了f(x(在每个变化中的积分后,我需要计算相对误差( | g* - g | / g ) < 1%其中g是积分(未知(的实数,g*是估计值。如何计算误差?我想过使用每个变体的方差,但我不确定如何做到这一点并使其<1%。我已经有了计算每个估计和方差的代码。OBS:我应该使用Python或R.

以下是集成的蒙特卡罗模拟示例(使用R(

a <- 0.3060734
b <- 0.11221230
f <- function(x) exp(-a*x)*cos(b*x)
MCsim <- function(n) {
gs <- sapply(n,function(k) mean(runif(k) <= f(runif(k))))
g <- integrate(f,0,1)$value
rel_err <- abs(gs-g)/g
data.frame(n,gs,g,rel_err)
}
n <- 10**(1:7)
res <- MCsim(n)

使得

> res
n        gs         g      rel_err
1 1e+01 0.8000000 0.8597815 6.953106e-02
2 1e+02 0.8700000 0.8597815 1.188497e-02
3 1e+03 0.8590000 0.8597815 9.089768e-04
4 1e+04 0.8570000 0.8597815 3.235149e-03
5 1e+05 0.8606900 0.8597815 1.056639e-03
6 1e+06 0.8596650 0.8597815 1.355245e-04
7 1e+07 0.8597802 0.8597815 1.536980e-06

最新更新