[英]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.