我正在尝试生成一系列数字来模拟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:
以下直方图确认生成的数字(即f)实际上属于幂律:
我的问题如下: 产生的步长(即f)非常大。我可以修改代码,以便步长只在某个界限内[fmin,fmax]?
P.S。我故意没有对代码进行矢量化。
答案 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()