使用R中的蒙特卡罗积分0到pi / 2

时间:2013-10-13 22:00:15

标签: r montecarlo integral calculus

尝试使用montecarlo方法找到x ^ 2 cosx的积分(o到pi / 2)。这是我第一次需要一些方向。要生成随机数,我应该将积分限制转换为(0,1)还是可以生成具有给定限制(0到pi / 2)的随机数?

这样的事情?

将积分从(o到pi / 2)转换为(0到1),将函数转换为1 / x ^ 2 sinx生成随机数rnorm(10000,0,1)

或者有没有办法生成像这个rnorm(10000,0,1)* pi / 2这样的随机数而不必改变积分的极限

2 个答案:

答案 0 :(得分:3)

您可以在任何所需的时间间隔内均匀生成随机数,例如,runif(1000,0,pi/2)将生成大小为1000的样本,均匀分布在[0,π/ 2]上。你绝对不想在这里使用rnorm - rnorm生成正态分布的数据,而不是统一分布的数据。

你可以像这样进行蒙特卡罗模拟:

> f<-function(x) x^2 * cos(x)
> mean(f(runif(100000,0,pi/2)))*(pi/2)
[1] 0.4672985

或者,您可以让R使用integrate进行集成:

> integrate(f,0,pi/2)
0.4674011 with absolute error < 5.2e-15

答案 1 :(得分:0)

我的第一次拍摄:

mc.integral = function(FUN, n.iter = 1000, interval){

  # take a sample using 'runif'
  x = runif(n.iter, interval[1], interval[2])

  # apply the user-defined function
  y = FUN(x)

  # calculate
  mean(y)*(interval[2] - interval[1])
}

例如

FUN = function(x){x^2 * cos(x)}
integ = mc.integral(FUN, interval = c(0, pi/2))
print(integ)

[1] 0.4693398