-1

尝试使用蒙特卡罗方法找到 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 而不必转换积分的极限

4

2 回答 2

4

您可以在您想要的任何区间内均匀地生成随机数,例如,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
于 2013-10-13T22:20:27.580 回答
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
于 2013-10-13T22:19:43.860 回答