簡體   English   中英

R 中的 Levy Walk 模擬

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM