[英]Levy Walk simulation in 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:
以下直方图确认生成的数字(即 f)实际上属于幂律:
我的问题如下:生成的步长(即 f)非常大。 我可以修改代码以使步长仅落在某个范围内 [fmin, fmax] 吗?
PS 我故意没有对代码进行矢量化。
尝试使用这个:
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)))
为了精确起见,您在这里模拟的是 Lévy 飞行。 因为这是一个列维散步,你应该允许从一开始粒子“走”每次飞行结束(用for
,例如)。 如果您使用plot(x, y, type = "o")
绘制结果模拟,您将看到使用您的代码的航班(无步行)内没有位置。
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.