R中的Levy Walk模拟

时间:2013-10-06 11:44:28

标签: r

我正在尝试生成一系列数字来模拟R中的Levy Walk。目前我正在使用以下代码:

alpha=2
n=1000
x=rep(0,n)
y=rep(0,n)

for (i in 2:n){
   theta=runif(1)*2*pi
   f=runif(1)^(-1/alpha)
   x[i]=x[i-1]+f*cos(theta)
   y[i]=y[i-1]+f*sin(theta)
}

代码按预期工作,我可以根据我的要求生成数字。下图显示了这样的Levy Walk: enter image description here

以下直方图确认生成的数字(即f)实际上属于幂律:

enter image description here

我的问题如下: 产生的步长(即f)非常大。我可以修改代码,以便步长只在某个界限内[fmin,fmax]?

P.S。我故意没有对代码进行矢量化。

3 个答案:

答案 0 :(得分:2)

尝试使用:

f=runif(1, fmax^(-alpha), fmin^(-alpha))^(-1/alpha)

请注意,您需要0 < fmin < fmax

顺便说一句,您可以像这样对代码进行矢量化:

theta <- runif(n-1)*2*pi
f <- runif(n-1, fmax^(-alpha), fmin^(-alpha))^(-1/alpha)
x <- c(0, cumsum(f*cos(theta)))
y <- c(0, cumsum(f*sin(theta)))

答案 1 :(得分:1)

为了精确,你在这里模拟的是Lévy飞行。要使它成为Lévy步行,您应该允许粒子从每个航班的开始到结束“行走”(例如,使用for)。如果您使用plot(x, y, type = "o")绘制结果模拟,您将看到使用您的代码在航班(没有行走)内没有位置。

答案 2 :(得分:0)

library(ggplot2)
library(gridExtra)

alpha= 5
n= 1000
x= rep(0,n)
y= rep(0,n)

fmin= 1
fmax= n

for (i in 2:n){
   theta= runif(n-1)*2*pi
   f= runif(n-1, fmax^(-alpha), fmin^(-alpha))^(-1/alpha)
   x= c(0, cumsum(f*cos(theta)))
   y= c(0, cumsum(f*sin(theta)))
}
ggplot(data.frame(x=x, y=y), aes(x, y))+geom_point()+geom_path()