2013-10-06 12 views
6

Próbuję wygenerować serię liczb symulować Levy Spacer w R. Obecnie używam następujący kod:Levy Spacer symulacja w R

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) 
} 

kod działa zgodnie z oczekiwaniami i jestem w stanie generować liczby zgodnie z moimi wymaganiami. Poniższy rysunek pokazuje na takim Levy Spacer: enter image description here

Poniższy histogram potwierdza, że ​​liczby generowane (czyli f) rzeczywiście należą do prawa energetycznego:

enter image description here

Moje pytanie jest następujące: Wygenerowane długości kroków (tj. F) są dość duże. Czy mogę zmodyfikować kod tak, aby długość kroku mieściła się tylko w granicach [fmin, fmax]?

P.S. Celowo nie wektoryzowałem kodu.

Odpowiedz

2

Spróbuj użyć tego:

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

Uwaga że trzeba 0 < fmin < fmax.

BTW, można wektoryzacji kodu tak:

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))) 
+0

Dzięki Ferdinand. Nadal muszę dowiedzieć się, dlaczego działa. – DotPi

1

Tylko dla precyzji, co masz simmulating o to lot Lévy. Aby był to spacer Lévy'ego, należy pozwolić cząstce "chodzić" od początku do końca każdego lotu (na przykład for). Jeśli wykreślisz wynikową symulację za pomocą plot(x, y, type = "o") zobaczysz, że nie ma żadnych pozycji w obrębie lotów (bez chodzenia) za pomocą Twojego kodu.