尝试使用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这样的随机数而不必改变积分的极限
答案 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