Imagine um bêbado andando sempre para frente em uma enorme planície, mas que tem um abismo em um dos lados. A cada passo para frente, ele cambaleia um certo número de passos para a direção do abismo ou da planície, com igual probabilidade.
Este é um dos processos Markovianos mais simples, chamado caminhada aleatória (random walk) em uma dimensão 1). Se o bêbado cai no abismo a caminhada acaba (e o bêbado também), uma condição que chamamos de fronteira de absorção (absorbing boundary).
O que podemos prever deste processo? Vamos soltar alguns bêbados neste mundo virtual. Para isto usaremos uma função em R, cujo código segue abaixo. Copie e cole este código na linha de comando do R.
bebado <- function(n=1,step=1,ciclo=1e5,cont=1e3,x1=NULL){ if(is.null(x1)){ x1 <- sample(1:200,n,replace=TRUE) } results <- matrix(NA,nrow=1+ciclo/cont,ncol=n) results[1,] <- x1 X <- x1 for(i in 2:(1+ciclo/cont)){ for(j in 1:cont){ X[X<=0] <- NA X <- X +sample(c(step,-1*step),n,replace=T) } results[i,] <- X } results[is.na(results)] <- 0 time <- seq(0,ciclo,by=cont) matplot(time,results,type="l", col=rainbow(n),lwd=2, xlab="Passos", ylab="Distância do Abismo") abline(h=0,lwd=4) }
Esta função tem quatro argumentos:
n
: Número de bêbadosstep
: número de passos para o lado que cada bêbado dá a cada instante de tempociclo
: tempo total da simulação (no caso é o mesmo que o número de passos para frente).cont
: intervalo de registro dos dados. Este argumento serve para poupar memória, já que guardar todos os passos em simulações longas pode deixar a simulação muito lenta. Mantendo o valor default a posição de cada bêbado é registrada a cada 1000 intervalos de tempo.A função sorteia a posição inicial dos bêbados entre 1 e 200 passos de distância do abismo. Vamos soltar dez bêbados, que cambaleiam 10 passos a cada intervalo, por dez mil intervalos de tempo:
bebado(n=10,step=10,ciclo=1e4,cont=1e3)
Como em todo processo estocástico, os resultados variam a cada realização. Por isso repita a simulação para se assegurar que entendeu os resultados. Você pode fazer isso repetindo muitas vezes com dez bêbados, ou simplesmente aumentando o número de bêbados, já que que são independentes.
O que acontece se deixamos os bêbados um pouco menos cambaleantes? Experimente reduzir para dois os passos laterais:
set.seed(42) # semente de números aleatórios bebado(n=10,step=2,ciclo=1e4,cont=1e3)
Estes bêbados que balançam menos estão menos sujeitos a terminar no abismo? Certifique-se disto aumentando o número de intervalos de tempo:
set.seed(42) bebado(n=10,step=2,ciclo=5e4,cont=1e3)