2013-10-06 8 views
6

Sto cercando di generare una serie di numeri per simulare una camminata Levy in R. Attualmente sto usando il seguente codice:simulazione Levy Passeggiata nel 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) 
} 

Il codice funziona come previsto e sono in grado generare i numeri in base alle mie esigenze. La figura seguente mostra su tale Levy passeggiata: enter image description here

il seguente istogramma conferma che i numeri generati (esempio f) in realtà appartenere ad una legge di potenza:

enter image description here

mia domanda è la seguente: Le lunghezze dei passi generate (es. F) sono piuttosto grandi. Haw posso modificare il codice in modo che le lunghezze dei passi rientrino solo in alcuni limiti [fmin, fmax]?

P.S. Non ho intenzionalmente vettorializzato il codice.

risposta

2

Provare a utilizzare questo:

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

Nota che è necessario 0 < fmin < fmax.

BTW, è possibile vettorizzare il codice in questo modo:

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

Grazie Ferdinando. Devo ancora capire perché funzioni. – DotPi

1

Solo per la precisione, quello che stai simmulating ecco un volo Lévy. Affinché si tratti di una passeggiata di Lévy, dovresti consentire alla particella di "camminare" dall'inizio alla fine di ogni volo (con un for, ad esempio). Se tracci il tuo simmulation risultante con plot(x, y, type = "o") vedrai che non ci sono posizioni all'interno dei voli (senza camminare) usando il tuo codice.