Para entregarse el jueves, 19 de febrero de 2015, antes de las 14 horas.
LA TAREA SE HACE Y SE ENTREGA EN PAREJAS
Considérese un caminante aleatorio que vive en los enteros. Es simétrico, es decir, en cada paso, brinca a la izquierda o al derecha, los dos con probabilidad $\frac{1}{2}$. Empieza en $1$.
Estudiaremos el tiempo de primer paso a $0$, es decir, ¿cuándo llegará por primera vez el caminante a $0$? A esta variable aleatoria la llamaremos $\tau$.
[1] Escribe una función que simule al caminante aleatorio, empezando en $1$ hasta que llegue a $0$. El caminante vive en una caja de tamaño $L+1$, es decir en $\{0, 1, \ldots, L-1, L\}$, y la función debe tomar $L$ como parámetro.
Hay una frontera reflejante en $L+\frac{1}{2}$: si el caminante está en $L$ e intenta brincar a la derecha, se refleja y se queda en donde estaba.
La función regresa el tiempo que tardó en llegar a $0$.
[2] Escribe una función que calcule el tiempo promedio $\langle \tau_L \rangle$ en llegar a $0$ para un sistema de tamaño $L$, sobre un número de corridas $N$.
[3] Dibuja el tiempo promedio $\langle \tau_L \rangle$ en función del tamaño $L$. ¿Cómo escala el tiempo promedio con $L$? ¿Qué pasa cuando $L \to \infty$?
[4] Escribe una función que calcule la distribución de probabilidad de $\tau_L$.
[5] Dibuja la distribución de probabilidad $f_{\tau_L}(t)$ de $\tau_L$ para distintas $L$ en una sola gráfica. ¿Cómo escala la cola de la distribución?
[6] ¿Cómo se ve la distribución de $\tau_\infty$? ¿Cómo es su cola? ¿Qué implica para el tiempo promedio de $\tau_\infty$?
In [1]:
function paso(x::Int, L::Int, p)
if rand() < p
x += 1
else
x -= 1
end
if x == L+1 #Si la caja se acaba..
x = L #se refleja
end
x
end
function caminata(L::Int, p=0.5)
x = 1
τ = 0
while x != 0
x = paso(x, L, p)
τ +=1
end
τ
end
Out[1]:
In [2]:
caminata(10)
Out[2]:
In [2]:
function taupromedio(L::Int, N::Int)
corridas = Array(Int,N)
for i in 1:N
corridas[i] = caminata(L)
end
L, N, mean(corridas)
end
Out[2]:
In [4]:
L = 10; N = 10_000
taupromedio(L, N)
Out[4]:
In [5]:
L = 10; N = 100_000
taupromedio(L, N)
Out[5]:
No hay tanta diferencia entre $10^4$ y $10^5$ corridas, vamos a usar el primer valor para que tome menos tiempo.
In [3]:
using PyPlot
In [7]:
function tauVsL(Ls)
N = length(Ls)
ts = Array(Float64,N)
figure(figsize=(5,3))
xlabel("L")
ylabel("<τ>")
for i in 1:N
ts[i] = taupromedio(Ls[i], 10_000)[3] #Usamos 10_000 corridas para sacar el promedio
end
# gca()[:set_xscale]("log")
# gca()[:set_yscale]("log")
plot(Ls,ts,"o-")
end
Out[7]:
In [8]:
Ls = [10:50:1000]
tauVsL(Ls);
In [17]:
Ls = [10^i for i in 0:5]
tauVsL(Ls);
De las dos gráficas anteriores, concluimos que $<\tau>$ escala linealmente con $L$ y si $L \to \infty$, $<\tau>$ diverge.
In [17]:
function distribucion(L::Int, N::Int) #N el número de corridas
corridas = Array(Int,N)
for i in 1:N
corridas[i] = caminata(L)
end
m = maximum(corridas)
dist = zeros(Int, m)
for c in corridas
dist[c] += 1
end
dist/N
end
Out[17]:
In [18]:
L = 20; N = 10_000
distribucion(L, N)
Out[18]:
Dibujemos la distribución para distintas $L$
In [10]:
Ls = [20, 100, 500]
N = 10_000
figure(figsize=(5,3))
xlabel("t")
ylabel(r"\f_{\tau_L}(t)") #No jala el rendering
for L in Ls
plot(distribucion(L,N)[1:40], "x") #Estamos cortando las colas
end
Para $t$ pequeña, el comportamiento de las diferentes distribuciones de $\tau_L$ es similar. ¿Cómo se comportan las colas que tuvimos que cortar?
Podemos tomar, como medida de la cola, la longitud de la distribución:
In [23]:
function colas(Ls, N::Int)
out= Int[]
for L in Ls
push!(out, length(distribucion(int(L),N)) )
end
out
end
Out[23]:
In [24]:
Ls = [20, 100, 500]
N = 1000
c = colas(Ls,N)
Out[24]:
In [27]:
Ls = [10^i for i in 1:0.5:5]
N = 10_000
@time c = colas(Ls, N);
In [28]:
figure(figsize=(5,3))
xlabel("L")
ylabel("max{τ}")
gca()[:set_xscale]("log")
gca()[:set_yscale]("log")
plot(Ls, c, "o-");
La cola crece aproximadamente linealmente con $L$.
In [ ]: