在R中使用montecarlo将0积分为pi/2

在R中使用montecarlo将0积分为pi/2,r,montecarlo,integral,calculus,R,Montecarlo,Integral,Calculus,试图用蒙特卡罗方法求x^2 cosx的积分o到pi/2。这是我第一次,所以我需要一些指导。要生成随机数,我应该将积分的极限转换为0,1,还是可以将给定极限为0的随机数生成为pi/2 像这样的 将积分从o转换为pi/2,再转换为0到1,从而将函数转换为1/x^2 sinx生成随机数rnorm10000,0,1 或者有没有一种方法可以生成这样的随机数rnorm10000,0,1*pi/2,而不必变换积分的极限我的第一次拍摄: mc.integral = function(FUN, n.iter =

试图用蒙特卡罗方法求x^2 cosx的积分o到pi/2。这是我第一次,所以我需要一些指导。要生成随机数,我应该将积分的极限转换为0,1,还是可以将给定极限为0的随机数生成为pi/2

像这样的

将积分从o转换为pi/2,再转换为0到1,从而将函数转换为1/x^2 sinx生成随机数rnorm10000,0,1

或者有没有一种方法可以生成这样的随机数rnorm10000,0,1*pi/2,而不必变换积分的极限

我的第一次拍摄:

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])
}
实例
您可以在任意时间间隔内统一生成随机数,例如,runif1000,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

人们喜欢在这里投反对票我投反对票…但是先显示一些代码。反对票的选民可以评论一下为什么我可以在将来使用反馈吗?@greenH0rn关于反对票。你的问题基本上是在问:我能在R中给定的区间内生成均匀分布的随机数吗?答案是-是的,你可以,而且很容易找到。非常酷的费尔南多,我会检查这一点,因为你需要对整个空间进行均匀采样,在这种情况下,没有必要两次计算同一点。在这种情况下,正态分布数据会给区间的某些部分带来比其他部分更大的权重。均匀分布的数据会给出相等的权重,这是计算积分时需要的。这可能是一个愚蠢的问题,但为什么不建议使用正态分布的数据?为什么要统一分配?还有,为什么我们需要再次用pi/2乘以均值?当你做一个普通的积分时,根据定义,假设权重相等,即均匀分布。正态分布会给你一个不同的权重,因此会给你一个不同的错误答案。将平均值乘以π/2,因为这是积分间隔的长度。此外,这些关于集成的问题更适合于数学论坛。这个板块是关于编程问题的。
> f<-function(x) x^2 * cos(x)
> mean(f(runif(100000,0,pi/2)))*(pi/2)
[1] 0.4672985
> integrate(f,0,pi/2)
0.4674011 with absolute error < 5.2e-15