尝试使用蒙特卡罗方法找到 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 而不必转换积分的极限
尝试使用蒙特卡罗方法找到 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 而不必转换积分的极限
您可以在您想要的任何区间内均匀地生成随机数,例如,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
我的第一次拍摄:
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