Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Anónimo
Física Computacional
3º Grado en Física
• También hay otros fenómenos que aunque en principio no son completamente aleatorios,
dada nuestra incapacidad para determinar sus condiciones iniciales, lo sean al menos de
forma práctica. Es el caso del movimiento browniano, el movimiento aparentemente alaorio
de una particula en un fluido producido por su interacción con todas las moléculas de su
alrededor.
• En este último capítulo vamos a estudiar métodos computacionales para lidiar con los pro-
cesos aleatorios, a la vez que los vamos a usar para resolver diferentes tipos de problemas.
• De forma precisa, nunca vamos a ser capaces de generar números completamente aleatorios
en un ordenador, sino pseudo-aleatorios: tienen una apariencia aleatoria aunque se generan
mediante uan fórmula determinista. Son los llamados generadores de números aleatorios .
f ( x ) = ( ax + c) mod m,
siendo a, c y m constantes enteras, y x una variable entera.
• Vamos a estudiar que números generamos con esa función cuando. partiendo de un valor
inicial x=1, la iteramos de forma sucesiva.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
[1]: from matplotlib.pyplot import plot,show
N=100
a=1664525
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
c=1013904223
m=4294967296
x=1
xp=[]
for i in range(N):
x=(a*x+c)%m
xp.append(x)
show(plot(xp,"o"))
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Física Computacional
Banco de apuntes de la
2. Todos los números generados se encuentras en el intervalo [0,m 1]. Si queremos un
número r, tal que 0 ≤ r < 1, sólo es necesario dividir los números de la congruencia
por m.
3. La elección de a, c, m y x es importante. Para nuestros valores, los números escogidos
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
funcionan razonablemente bien.
4. Para los mismos valores de a, c y m se puede obtener una secuencia completamente
distinta variando el valor de x inicial. Es la llamada semilla.
• Por suerte hay muchos otros generadores de números aleatorios que permiten obtener series
con pocas o nulas correlaciones.
• El generador que se usa de forma habitual en física hoy en día es el llamado generador
Mersenne Twister, desarrollado en 1997, y basado en una ley de recurrencia lineal para ma-
trices definidas sobre un cuerpo binario en dos dimensiones y cuyo periodo es un numéro
primo de Mersenne (números de la forma 2w − 1 para un w primo dado).
• Es importante notar que estos programas van a generar números diferentes cada vez que los
llamemos.
print(randrange(100))
print(randrange(100))
print(randrange(100))
6
94
58
• Por tanto, si queremos generar un número aleatorio y usarlo más de una vez, será necesario
guardarlo como una variable.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
1. Escribir un programa que imprima dos números aleatorios entre 1 y 6 para simular el lanza-
miento de dos dados.
2. Ejecutar el programa un milón de veces y calcular la probabilidad con las que se obtiene un
doble seis.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
[3]: from random import randrange
N=1000000
it=0
for i in range(N):
d1=randrange(1,7)
d2=randrange(1,7)
if d1 == 6 and d2 == 6:
it+=1
• Esto es precisamente lo que ocurre pare el generador Mersenne twister; la semilla sólo se usa
indirectamente para obtener el primer número de la secuencia.
• De esa forma, fijando la semilla, podemos fijar exactamente la secuencia entera de números
aleatorios que vamos a obtener.
• En python, la semilla se fija usando la función seed(n), donde n es el valor de la semilla que
queremos fijar.
seed(17)
for i in range(5):
print(randrange(10))
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
8
6
4
5
4
[5]: seed(17)
for i in range(5):
print(randrange(10))
8
6
4
5
4
2
8
4
1
0
• La cuestión es preguntarse por qué podría ser útil fijar la semilla y garantizar que vamos a
obtener la misma serie de números pseudoaleatorios.
• La respuesta es que es útil para escribir el código de un programa por primera vez.
• En ocasiones encontraremos que nuestro programa falla (da un error) para una determinada
secuencia inicial, pero que al volverlo a ejecutar parecezca funcionar bien.
• Esto puede pasar porque el programa no hace exactamente lo mismo para secuencias de
números diferentes, lo que hace aún más complicado encontrar los problemas y solucionar-
los.
• Al fijar la semilla evitamos este problema, y garantizamos que las secuencias serán la misma
al ejecutar el código.
• Una vez el código funcione correctamente se puede eliminar la semilla para garantizar una
aleatoriedad mayor del programa.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
1.1.3 9.1.3 Probabilidad y números aleatorios.
• Como ya hemos comentado hay muchos fenómenos en física que suceden de forma aleatoria
con una probabilida p determinada.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Este tipo de comportamiento puede ser descrito fácilmente usando números aleatorios.
• Por ejemplo, la forma de describir el resultado de tirar una moneda al aire podría venir dada
por el código:
for i in range(10):
if random()<0.5:
print("C")
else:
print("X")
C
X
C
X
X
X
X
X
C
X
2. Supongamos que partimos de una muestra con 1000 átomos de talio. Describir como evolu-
ciona el número de átomos de 208 Tl y 208 Pb en un periodo de 103 segundos.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
N (t)
= 2−t/τ ,
N (0)
por tanto la fracción de átomos que se han desintegrado, es decir, la probabilidad de que un
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
átomo se desintegre después de un tiempo t será
p(t) = 1 − 2−t/τ .
[8]: # 2. Vamos a describir la evolución de átomos en la muestra.
# Constantes
tp=arange(0,tmax,h)
Tlp=[]
Pbp=[]
# bucle principal
for t in tp:
Tlp.append(NTl)
Pbp.append(NPb)
decay = 0
for i in range(NTl):
if random()<p:
decay+=1
NTl-=decay
NPb+=decay
# Hacemos el gráfico
plot(tp,Tlp,label="Átomos de Talio")
plot(tp,Pbp,label="Átomos de Plomo")
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
xlabel("Tiempo")
ylabel("Número de átomos")
legend()
show()
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Las pequeñas oscilaciones de las curvas de desintegración son consecuencia de la naturaleza
puramente aleatoria del proceso.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
9
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Empezando con una muestra de 10000 átomos de 213 Bi simular su desintegración discretizando
el tiempo en intervalos de un segundo, en los cuales, se deberá hacer lo siguiente:
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
1. Para cada átomo de 209 Pb en la muestra establecer de forma aleatoria si se desintergra o no
en 209 Bi, y actualizar el número de átomos de cada tipo de forma correspondiente.
2. Aplicar el paso equivalente para los átomos de 209 Tl.
3. Finalmente estudiar la evolución de los átomos de 213 Bi teniendo en cuenta que si un átomo
se desintegra tiene una cierta probabilidad de desintegrase en 209 Pb y en 209 Tl.
Nota, es importante aplicar el proceso de abajo arriba y no de arriba abajo para evitar que en
un mismo paso un átomo de 213 Bi pueda desintegrase directamente más de una vez.
[6]: from random import random
from numpy import arange,log
from matplotlib.pyplot import plot,show,legend
# Constantes
tauBi=46*60
tauTl=2.2*60
tauPb=3.3*60
pBi=1-2**(-h/tauBi)
pTl=1-2**(-h/tauTl)
pPb=1-2**(-h/tauPb)
rTl=0.0209
rPb=0.9791
tp=arange(0,20000,h)
Bip=[]
Tlp=[]
Pbp=[]
stp=[]
10
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
# loop principal
for t in tp:
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
# estudiamos el Pb
for i in range(nPb):
if random()<pPb:
nPb-=1
nst+=1
for i in range(nTl):
if random()<pTl:
nTl-=1
nPb+=1
for i in range(nBi):
if random()<pBi:
nBi-=1
if random()<rTl:
nTl+=1
else:
nPb+=1
Bip.append(nBi)
Tlp.append(nTl)
Pbp.append(nPb)
stp.append(nst)
[7]: plot(tp,Bip,label="Átomos de Bi")
plot(tp,Tlp,label="Átomos de Tl")
plot(tp,Pbp,label="Átomos de Pb")
plot(tp,stp,label="Átomos estables")
xlabel("Tiemp en (s)")
ylabel("Número de átomos")
legend()
show()
11
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Ejercicio 9.4: el movimiento Browniano.
El movimiento Browiniano se refiere al movimiento de una partícula, por ejemplo de humo o
polvo, en un gas o líquido debido a las interacciones aleatorias con las móleculas del fluido.
En este ejercicio vamos a simular el movimiento de una de esas partículas en dos dimensiones.
Para ello discretizamos su posición en un retículo de L × L cuadrados, que nos permiten describir
la posición de la partícula por medio de dos índices, i, j = 0, · · · , L − 1.
Inicializamos la posición de nuestra partícula de forma que se encuentre en el centro del
retículo, y en cada paso, le asignamos una probabilidad aleatoria para que se desplace hacía cada
uno de los posiciones adjacentes en la cuadrícula. La partícula esta confinada dentro de la caja, por
lo que no puede moverse dentro de esta. Este proceso es lo que llamamos random walk (camino
aleatorio).
Escribir un programa que describa el movimiento de la partícula durante 1 millón de pasos
usando un retículo de tamaño L=101 y representar su posición por medio de una animación.
[ ]: from vpython import sphere,box,color,rate,canvas,vector
L=1001
N=10000
framerate=100
12
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
# Dibujamos nuestra caja
box(pos=vector(-L/2,0,0),length=1,height=L,width=2,color=color.green)
box(pos=vector(L/2,0,0),length=1,height=L,width=2,color=color.green)
box(pos=vector(0,-L/2,0),length=L,height=1,width=2,color=color.green)
box(pos=vector(0,L/2,0),length=L,height=1,width=2,color=color.green)
i,j=0,0
s=sphere(pos=vector(i,j,0),radius=1,color=color.white)
# Loop principal
for k in range(N):
dir=randrange(4) # la dirección viene marcada por un entero aleatorio␣
֒→[0,3]
if dir==0:
if i<L/2:
i+=1
elif dir==1:
if i>-L/2:
i-=1
elif dir==2:
if j<L/2:
j+=1
elif dir==3:
if j>-L/2:
j-=1
rate(framerate)
s.pos=vector(i,j,0)
Ejercicio 9.5: agregación limitada por difusión.
En este ejercicio vamos a programar una de los modelos más famosos en física computacional,
la agregación limitada por difusión o DMA.
El modelo funciona como sigue. Se toma un retículo con una sólo partícula en el medio. Esta
partícula realiza un camino aleatorio similar al del movimiento browniano hasta que llega a uno
de los bordes del retículo, punto en el que la partícula queda anclada de forma inamovible.
13
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
[44]: from IPython.display import Image,display
display(Image("DMA.png",width=400))
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Repetimos el proceso con una segunda partícula, hasta que llega a un nuevo punto del borde o
queda anclada junto a la primera partícula. Ejecutamos el mismo proceso hasta que una partícula
anclada llega al centro del retículo.
Programar el modélo DLA en un retículo de tamaño 101 × 101 y mostrar la evolución del
sistema en una animación.
[3]: # creamos el lienzo de la animación
scene = canvas(width=500,height=500,center=vector(L/2,L/2,0))
14
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
<IPython.core.display.HTML object>
<IPython.core.display.Javascript object>
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
[4]: from numpy import zeros,sin
from random import random
# Constantes
L=200
# array donde se colocan las partículas ancladas
anclaje=zeros([L+1,L+1],int)
box(pos=vector(0,L/2,0),length=1,height=L,width=2,color=color.white)
box(pos=vector(L,L/2,0),length=1,height=L,width=2,color=color.white)
box(pos=vector(L/2,0,0),length=L,height=1,width=2,color=color.white)
box(pos=vector(L/2,L,0),length=L,height=1,width=2,color=color.white)
# loop principal
t=0
colscale=0.001 # vamos a dibujar cada partícula de un color
while anclaje[L//2,L//2]==0:
x=y=L//2
col=sin(colscale*t)
t+=1
rate(1000000)
# hacemos el camino aleatorio
15
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
# comprobamos que no ha tocado a ninguna partícula
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
֒→
anclaje[x,y]=1
sphere(pos=vector(x,y,0),radius=1,color=vector(col,0,1-col))
break
if random()<0.5:
if random()<0.5:
x+=1
else:
x-=1
else:
if random()<0.5:
y+=1
else:
y-=1
−dt/τ dt log 2
p(dt) = 1 − 2 = 1 − exp − log 2 ≃ dt,
τ τ
donde hemos despreciado términos O dt2 .
• Ahora podemos por tanto preguntarnos cual es la probabilidad de que un isótopo radiactivo
se desintegre en el intervalo t + dt.
• Para que un átomo se desintegre en el intervalo t + dt tiene en primer lugar que haber so-
brevivido hasta el tiempo t lo cual ocurre con la probabilidad 2−t/τ y luego desintegrase en
el intervalo dt por tanto, la probabilidad de que se desintegre entre los intevalor t y t + dt es
log 2
p(t)dt = 2−t/τ dt,
τ
16
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
que es el ejemplo de una distribución no uniforme pues los tiempos de desintegración t se
distribuyen con una proporción 2−t/τ , es decir, es más
probable que se desintegre en tiempo anteriores que en tiempos posteriores.
• Por tanto, una forma mucho más eficiente de calcular la desintegración de N isótopos ra-
diactivos habría sido generar N números aleatorios generados con la distribución derivada
arriba para representar el tiempo en el que cada uno de los átomos se desintegrarán.
• Con ello, la curva que describe la evolución del número de átomos del isótopo se podría
obtener contando simplemente el número de átomos que han decaído en un tiempo dado.
El método de la transformación.
• Supongamos a cotinuación que tenemos una función x = x (z). Por tanto, para un número
aleatorio z generado con la densidad de probabilidad q(z), x (z) será otro número aleatorio
que en general estará asociado a otra distribución de probabilidad p( x ).
• Nuestro objetivo no es otro que encontrar la función x (z) que noes permite generar un
número x con la probabilidad que queremos p( x ).
• Por definición, la probabilidad de generar un número x entre x + dx será igual que la prob-
abilidad de generar un número z en el intervalo z + dz
p( x )dx = q(z)dz,
donde ya hemos especificado que x = x (z).
Z x (z) Z z
p( x ′ ) dx ′ = dz = z.
−∞ 0
• No esta claro que siempre podamos resolver la integral, y que si lo hacemos, entonces po-
damos resolver la ecuación resultante; sin embargo, si lo hacemos, habremos obtenido exac-
tamente la función que queremos.
17
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• A modo de ejemplo, supongamos que tenemos la distribución exponencial
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
donde el factor mu es necesario para cumplir que
Z ∞
∞
p( x )dx = µe−µx = −e−µx 0
= 1.
0
Z x (z)
′
µe−µx dx ′ = 1 − e−µx(z) = z,
0
que implica que
1
x (z) = − log(1 − z).
µ
• Por tanto para obtener nuestros números aleatorios con distribución exponencial todo lo que
tenemos que hacer es generar números aleatorios con distribución uniforme en el intervalo
[0, 1) e introducirlos en la ecuación anterior.
N=1000
tau=3.052*60
mu=log(2)/tau
ti=empty(N,float)
for i in range(N):
ti[i]=-log(1-random())/mu
ts=sort(ti)
plot(ts,arange(N,0,-1))
plot(ts,arange(N))
show()
18
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Ejercicio 9.7: Eligiendo un punto aleatorio en la superficie de la Tierra
En este ejercicio vamos a calcular un punto aleatorio en la superficie terrestre, es decir, vamos a
escoger aleatoriamente la latitud y longitud de cualquier punto de la Tierra. Para ello, recordar que
cualquier punto de la superfice viene determinado por sus coordenadas esféricas r, θ, ϕ, donde en
nuestro caso r = R, siendo R el radio de la tierra, θ es el ángulo polar, medido desde el polo norte,
y ϕ el ángulo azimutal o longitudinal.
2. Obtener las fórmulas que permiten generar los ángulos θ y ϕ a partir de sus correspondientes
distribuciones de probabilidad.
3. Usar esas fórumulas para generar 500 puntos en la superficie terrestre de forma aleatoria.
Representarlos por medio de una animación en una esfera de radio unidad.
19
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
2. Obtener un número aleatorio con distribución p(ϕ)estrivial puesesunadistribucinuni f ormeentre0y2π.
En el caso de θ, aplicando el método de la transformación tenemos
Z θ
1 1
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
sin θ ′ dθ ′ = (1 − cos θ ) = z,
2 0 2
3. Una vez podemos generar aleatoriamente los ángulos θ y ϕ los puntos de nuestra superficie
de radio unidad vendrán dados por las coordenadas cartesianas
<IPython.core.display.HTML object>
<IPython.core.display.Javascript object>
for i in range(500):
phi=2*pi*random()
theta=acos(1-2*random())
␣
֒→sphere(pos=vector(sin(theta)*cos(phi),sin(theta)*sin(phi),cos(theta)),radius=0.
֒→02)
• El teorema del límite central implica por tanto que la distribución normal puede usarse como
aproximación de muchas otras distribuciones.
20
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
1 x −µ 2
e− 2 ( ),
1
p( x ) = √ con x ∈ (−∞, ∞),
σ
2π σ
donde µ es la media y σ la desviación típica o anchura de la destribución.
Z x (z) ′ 2
1 − 21 x σ−µ
√ e dx ′ = z.
2π σ −∞
• Sin embargo la integral no se conoce de forma analítica, por lo que el método de la transfor-
mación falla en este caso.
• Por suerte, hay un truco que podemos emplear para generar números aleatorios distribuidos
normalmente a partir de números aleatorios con distribución uniforme.
!
1 ( x − µ )2 + ( y − µ )2
p( x )dx × p(y)dy = 2
exp − ,
2π σ 2σ2
que también se puede expresar en coordenadas polares. Haciendo
x ′ = x − µ, y′ = y − µ, x ′2 + y ′2 = r 2 y dxdy = r dr dθ,
podemos expresar nuestra probabilidad como
r2 r2
1 r dθ
p( x )dx × p(y)dy = p(r, θ )dr dθ = exp − r dr dθ = exp − dr = p(r )dr × p(θ )dθ,
2π σ2 2σ2 σ2 2σ2 2π
donde las densidades de probabilidad p(r ) y p(θ ) estás normalizadas correctamente.
• Generar un número con distribución p(θ ) es trivial, no es más que una distribución uniforme
en el intervalo [0, 2π ).
r ′2 r ( z )2
Z r (z)
1
p(r )dr = exp − 2 r ′ dr ′ = 1 − exp − = z,
σ2 0 2σ 2σ2
que implica que
q
r (z) = −2σ2 log(1 − z).
21
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Una vez obtenidos dos variables aleatorias r y θ podemos convertirlas en cartesianas usando
que
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
x = µ + r cos θ, y = µ + r sin θ.
Ejercicio 9.8: dispersión de Coulomb o Rutherford.
A principio del S. XX, Ernest Rutherford y sus colaboradores mostraron que cuando una
partícula α, un núcleo de helio formado por dos protones y dos neutrones, es lanzada cerca de
un átomo, es dispersada principamente debido a la respulsión eléctrica asociada a dos cargas con
el mismo signo.
Esto permitio descartar el módelo atómico de Thomson, los átomos deben tener una extructura
con carga positiva diferenciada, que a partir de ese momento se llamaron núcleos atómicos.
A través del experimento se comprobo que el ángulo dispersado por la partícula alpha venía
dado por la expresión
1 Ze2
tan θ =
2 2πϵ0 E b
[13]: from IPython.display import Image,display
display(Image("rutherford.png",width=500))
siendo E la energía cinética de la partícula α, Z en número atómico del material sobre el que la
partícula α es lanzada, e la carga eléctrica, y b el parámetro de impacto, la distancia perpendicular
entre la trajectoria de la partícula α y el átomo.
Consideremos un haz de un milón partículas α con energía cinética 7.7 eV, que tienen un perfil
Gaussiano en el plano perpendicular a la dirección de incidencia, tanto en el eje x como el eje y con
22
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
una desviación estandar σ = a0 /100 donde a0 es el radio de Bohr, que se lanza sobre un átomo de
oro.
Calcular la fracción de partículas que rebotán hacia atras, es decir cuyo ángulo de dispersión
sea mayor de 90◦ .
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• En primer lugar si θ > π/2 las partículas rebotarán hacia atrás. Como la tangente incre-
menta con el ángulo en el intervalo [π/2, π ] tenemos que la partículas rebotaran si
π Ze2
tan θ > tan =1= ,
4 2πϵ0 Eb
o lo que es lo mismo, si el parámetro de impacto cumple
Ze2
b< .
2πϵ0 E
# Constantes
# Función para generar dos números aleatorios con una distribución Gaussiana
def gaussian():
r=sqrt(-2*sigma**2*log(1-random()))
theta=2*pi*random()
x=r*cos(theta)
y=r*sin(theta)
return x,y
# Programa principal
it = 0
for i in range(N):
23
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
x,y=gaussian()
b=sqrt(x*x + y*y)
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
if b<Z*e*e/(2*pi*epsilon0*E):
it+=1
r2 b2 Ze2
Z bmax
Nrefl 1
= 2 exp − 2 r dr = 1 − exp − max = 1 − exp − .
Ntot σ 0 2σ 2σ2 4πϵ0 σ2 E
• Introduciendo números
[15]: from numpy import exp
100*(1-exp(-Z**2*e**4/(8*pi**2*epsilon0**2*sigma**2*E**2)))
[15]: 0.15572235058136652
Z 2
1
I= sin2 dx,
0 x (2 − x )
cuyo cálculo no implica más que calcular el área bajo la curva
24
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
[16]: from numpy import sin,linspace
from matplotlib.pyplot import plot,show,fill_between
x=linspace(0.0001,1.9999,1000000)
y=sin(1/x/(2-x))**2
plot(x,y)
fill_between(x,y,step="pre",alpha=0.4)
plot(x,y,"0.")
show()
• Sin embargo, la integral esta perfectamente definida y acotada, pues está contenida en un
rectángulo de área 2.
• Por tanto una forma de replantear el problema es asociar la integral con la probabilidad de
que un punto generado aleatoriamente dentro del rectangulo de area A que contiene a la
gráfica, caiga en la zona en azul, es decir
I
, p=
A
donde A es el área del rectángulo total e I es nuestra integral.
25
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Por tanto, para estimar la integral sólo tenemos que calcular dicha probabilidad lo cual pode-
mos hacer de la siguiente forma
1. Generamos un número N de puntos dentro del área A que contiene nuestra curva.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
2. Contamos el número de puntos que caen en la región azul, digamos que son por ejem-
plo k.
3. Estimamos la probabilidad a la fracción de puntos que cae debajo de la curva, es decir
con k/N.
4. Estimamos la integral a partir de la expresión
k
I= A.
N
• Este es el llamado de hit or miss (acertar o fallar).
def f(x):
return sin(1/x/(2-x))**2
N=1000000
it=0
A=2
for i in range(N):
x=2*random() #nž entre 0 y 2
y=random() #nž entre 0 y 1
if y<f(x):
it+=1
I=A*it/N
print(I)
1.451686
1.2.2 9.2.3 Error de las integrales obtenidas por el método de Monte Carlo.
• El problema de los métodos de Monte Carlo es que no son muy precisos.
• Su error, por supuesto, esta asociado a nuestra limitación para estimar una probabilidad
usando números aleatorios.
26
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
• Vamos a calcular cual es la precision que podemos esperar para dicha estimación.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
I
p= .
A
por lo que 1-p será la probabilidad de que se encuentre sobre la curva.
3. Para calcular el error de nuestra probabilidad sólo tebemos que calcular la variancia de
la distribución binomial.
– En primer lugar, el valor esperado después de haber lanzado N números aleatorios
será:
N N N
N−1 k
N k N −k
⟨k⟩ = ∑ kP(k) = ∑ k p (1 − p ) =∑N p (1 − p ) N − k (1)
k =0 k =1
k k =1
k − 1
N N −1
N − 1 k −1 N−1 k
=N p ∑ p (1 − p ) N − k = N p ∑ p (1 − p) N −1−k = N p. (2)
k =1
k − 1 k =0
k
N N
N − 1 k −1 N−1 k
N −k
2
⟨k ⟩ = N p ∑ k p (1 − p ) = N p ∑ ( k + 1) p (1 − p) N −1−k (3)
k =1
k−1 k =0
k
N
N−1 k
=N p + ∑ k p ( 1 − p ) N −1− k = N p + N ( N − 1 ) p 2 . (4)
k =0
k
27
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
p
A I(A − I)
q
σ= var(k ) = √ ,
N N
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
es decir, nuestro error escala como N −1/2 .
• Por tanto el error de nuestra integral estimada usando el método de Monte Carlo varia como
N −1/2 .
• Si calculamos una intergral por el método de Monte Carlo con 100 puntos, es de esperar una
precisión del 10%; por supuesto el valor exacto dependerá de I y A.
• Este es un resultado mucho más modesto de lo que hemos obtenido con el método del
trapecio, que escala con N −2 , con el de Simpson, N −4 , o con el de la cuadratura gaussiana,
N−N .
• Sin embargo los métodos de Monte Carlo funcionan incluso para la integrales de funciones
patológicas con grandes variaciones, o, como veremos, para integrales multidimensionales.
• El método más común para hacerlo se llama el método del valor medio.
Z b
1 I
⟨f⟩ = f ( x ) dx = ,
b−a a b−a
por lo que conciendo la media podemos obtener la integral
I = (b − a)⟨ f ⟩.
(b − a) N
N i∑
I = (b − a)⟨ f ⟩ ≃ f ( x i ),
=1
que es el llamado método del valor medio.
28
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
var( f ) = ⟨ f 2 ⟩ − ⟨ f ⟩,
y que la varianza de una suma es la suma de las varianzs.
• Por tanto nuestro error será
v
uN p
(b − A) u var( f )
σ( I ) =
N
t
∑ var( f ) = (b − a) √ N ,
i =1
Demostración de que el método del valor medio es más preciso que el método hit or miss.
• Para demostrar que este es el caso asumamos que nuestra función f ( x ) > 0 en todo el
dominio de integración y que área total de probabilidad, el área que engloba la función en
su intervalo, es
A = (b − a) H,
siendo a y b el punto inicial y final del intervalo en el que esta integrando la función y H la
altura.
• Definamos ahora la variable s, definda tal que para cada una de los i “lanzamientos” de
Monte Carlo, si = 1 si es un hit y 0 si es un miss.
• De esta forma, la estimación de la integral usando el método hit or miss, vendrá dada por
I = ( b − a ) A ⟨ s ⟩,
siendo ⟨s⟩ = k = ∑iN=1 si .
• De esta forma, el error de nuestra estimación usando el método hit or miss será
A (b − a) H (b − a) H
q q q
σ( I ) = var(k ) = Nvar(s) = var(s) √ ,
N N N
donde uno vez más, hemos tenido en cuenta que la varianza de una suma es la suma de las
varianzas.
• Comparando este resultado con el error correspondiente al método del valor medio ten-
dremos que el segundo es más o igual de preciso si
p
var( f ) (b − a) H
q
(b − a) √ ≤ var(s) √ ,
N N
o equivalentemente si
var( f ) ≤ var(s) H 2 .
29
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Por otro lado, la varianza de la variable s, viene dada por var(s) = ⟨s2 ⟩ − ⟨s⟩2 , siendo ⟨s⟩ =
p, la probabilidad media de un acierto, y ⟨s2 ⟩ = p × 12 + (1 − p) × 02 = p, la media al
cuadrado. Por tanto
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
var(s) = ⟨s2 ⟩ − ⟨s⟩2 = p(1 − p).
I ⟨f⟩ I
⟨f⟩ = ⇒ = = p,
(b − a) H A
por lo que sustituyendo en var(s) tenemos
H 2 var(s) = p(1 − p) = ⟨ f ⟩ ( H − ⟨ f ⟩) .
• Por tanto, el método del valor medio será más preciso que el método hit or miss si
var( f ) = ⟨ f 2 ⟩ − ⟨ f ⟩2 ≤ ⟨ f ⟩ ( H − ⟨ f ⟩) ,
o lo que es lo mismo si
⟨ f 2 ⟩ ≤ H ⟨ f ⟩,
Ejercicio 9.10: cálculo de una integral usando el método del valor medio.
Volver a evaluar la integral
Z 2
2 1
I= sin dx,
0 x (2 − x )
y su error usando un millón de puntos alatorios para
def f(x):
return(sin(1/(x*(2-x))))**2
a=0
b=2
N=1000000
# hit or miss:
30
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
A=2
it=0
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
for i in range(N):
x=2*random()
y=random()
if y<f(x):
it+=1
I=A*it/N
sigma=sqrt(I*(A-I)/N)
print(I,sigma)
1.45322 0.0008913986939635934
sum=sumsq=0
for i in range(N):
fx=f(2*random())
sum+=fx
sumsq+=fx**2
media=sum/N
var=sumsq/N-media**2
I=(b-a)*media
sigma=(b-a)*sqrt(var/N)
print(I,sigma)
1.4505819358467136 0.0005282018437229834
• Tal y como vimos en el Tema 3, la cuadratura gaussiana en más de una dimensión tiene el
problema de que no hay una forma clara de elegir los puntos y los pesos.
• Por otro lado, métodos más simples, como el del trapecio, exigen muestrar el integrando en
cada una de las variables, lo que hace que se vuelvan lentos cuando el número de dimen-
siones aumentan.
31
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
• Por ejemplo, usar el método del trapecio o de Simpson en tres dimensions con 100 puntos
en cada una de ellas implica evaluar el integrando en 1003 = 106 , lo que para funciones
complicadas puede ser lento.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Para cuatro dimensiones ya tendríamos 108 evaluaciones, lo que puede no ser una opción
desde el punto de vista del tiempo computacional.
• La generalización del método del valor medio para integrales multidimensionales con
volumen V viene dada por
N
V
I≃
N ∑ f (r i ),
i =1
32
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
El área del cículo viene por tanto dado por la integral
ZZ 1
I= f ( x, y) dx dy,
−1
donde la función viene definda como
1 if x2 + y2 ≤ 1,
f ( x, y) =
0 de otra forma,
por lo que la estimación de la integral usando el método del valor medio será
N
4
I≃
N ∑ f ( x i , y i ).
i =1
33
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
[1]: from numpy import empty,dot
from random import random
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
N=1000000 # número de puntos
# integrando
def f(r):
if dot(r,r)<=1:
return 1
else:
return 0
for i in range(N):
r=empty(d,float)
for k in range(d):
r[k]=2*random()-1 #nž entre -1 y 1
s+=f(r)
print(2**d*s/N)
2.589696
• Sin embargo hay un tipo de funciones para las que la integración por Monte Carlo no fun-
ciona. Consideremos por ejemplo la integral
Z 1 −1/2
x
I= dx,
0 ex + 1
que aparece en los gases de Fermi.
34
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
• Sin embargo, al aplicar el método del valor medio
(b − a) N
N i∑
I= f ( xi )
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
=1
• Esto obviamente implica que la incertidumbre de nuestra estimación va a ser mucho más
grande, pudiendo llegar incluso a infinito si estamos evaluando la función en x = 0.
• Una forma de solucionar este problema es escoger nuestros puntos de forma no uniforme
en el intervalo de integración, es decir, calcular un valor medio con un cierto peso para cada
valor de la variable aleatoria.
• Dada una función arbitraria g( x ) definimos su media ponderada con el peso ω sobre el
intervalo [ a, b] como
Rb
a
ω ( x ) g( x ) dx
⟨ g( x )⟩ω = Rb ,
a
ω ( x ) dx
o lo que es lo mismo
f (x) b
Z
I= ω ( x ) dx,
ω(x) ω a
que nos permite calcular el valor de nuestra integral a partir de cualquier media ponderada,
en vez de a partir de una media uniforme.
35
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Calculando la media ponderada.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
ω(x)
p( x ) = R b ,
a
ω ( x ) dx
• Usando este resultado, el promedio de evaluar una función g( x ) sobre los puntos xi genera-
dos con la distribución p( x ) en el intervalo [ a, b] será
N Z b Z b
1 1
N ∑ g ( xi ) ≃ N a
N p( x ) g( x ) dx =
a
p( x ) g( x ) dx,
i =1
donde estamos aproximando la suma por una integral ponderada, y por tanto, donde la
aproximación será mejor cuanto mayor sea el número de elementos de la suma.
N Z b
1 f ( xi )
I≃
N ∑ ω ( xi ) a
ω ( x ) dx ,
i =1
• El muestreo por importancia nos permite calcular una estimación de la integral I evaluando
no la suma ∑i f ( xi ) sino ∑i f ( xi )/ω ( xi ), donde ω ( x ) puede ser cualquier función a elegir.
• Esta flexibilidad a la hora de elegir ω ( x ) es muy útil ya que podemos escogerla de forma
que podamos evitar las posibles patologías de la función. Por ejemplo, dada una singu-
laridad, podemos escoger ω ( x ) para cancelarla, de forma que la suma ∑i f ( xi )/ω ( xi ) este
perfectamente definida.
36
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
• Finalmente el error de nuestra estimación se puede calcular de forma totalmente equivalente
a la dem método del valor medio, viniendo dado por
p Z b
varω ( f /ω )
σ( f ω ) = √ ω ( x ) dx,
N a
• Tal y como hemos visto, la función a integrar f ( x ) = x −1/2 /(exp( x ) + 1) tiene una diver-
gencia en x=0, consecuencia del término x −1/2 .
• Para cancelar su efecto en la suma ponderada, escogemos por tanto ω ( x ) = x −1/2 , de forma
que
f (x) 1
= x .
ω(x) e +1
• Por tanto, para evaluar nuestra integral tenemos que generar números aleatorios distribui-
dos con la densidad de probabilidad
ω(x) x −1/2 1
p( x ) = R 1 = R1 = √ ,
ω ( x ) x −1/2 dx 2 x
0 0
1
Z x √
( x ′ )−1/2 dx ′ = x = z, x = z2 .
2 0
N Z b N
1 f ( xi ) 2 1
I≃
N ∑ ω ( xi ) a
ω ( x ) dx =
N ∑ exp (z2 ) + 1 ,
i =1 i i
donde tal y como hemos visto los puntos zi son números aleatorios generados en el intervalo
[0, 1].
N=1000000
s=0.0
37
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
for i in range(N):
s+=1/(exp(random()**2) + 1)
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
print("La estimación de la integral es:",2*s/N)
• El muestreo por importancia también puede usarse para evaluar integrales definidas en do-
minios infinitos.
• Este caso no se puede resolver con el método del valor medio, pues tendríamos que obtener
números aleatorios distribuidos uniformemente en el intervalo [0, ∞], lo cual no es posible,
porque es una distribución obviamente no integrable.
• Sin embargo, es algo que podemos hacer usando el muestreo por importancia, pues nos
permite calcular la integral a partir de distribuciones no uniformes, que aún extendiendose
a infinito sean intergrables.
N Z ∞ N
1 1
I≃ ∑ e xi f ( x i ) e− x dx = ∑ e x f ( x i ).
i
N i =1 0 N i =1
• Es decir podemos usar una muestra de puntos generada con una distribución no uniforme,
sólo si lo compensamos pesando más en la suma aquellos puntos que se encuentran en la
region donde generamos menos.
• Aunque las simulaciones de Monte Carlo se usan en muchas ramas de la física, juegan un
papel central en la mecánica estadística, ya que la aleatoriedad es la parte esencial de este
campo.
• Por ello, en este sección nos vamos a centrar en estudiar las simulaciones de Monte Carlo en
física estadística.
38
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
1.3.1 9.3.1 El muestreo por importancia y la mecánica estadística.
• Uno de los problemas esenciales en física estadística es el de calcular el valor esperado o
medio de una cantidad de interés en un sistema físco en equilibrio térmico a temperatura T.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Aunque no sabemos el estado exacto del sistema, sí sabemos que, a una temperatura T dada,
el sistema pasa por una sucesión de estados tal que la probabilidad de que en un momento
dado el sistema se encuentre en el estado Ei viene dada por
P( Ei , β) = e− β Ei Z ( β), Z ( β) = ∑ e−βE ,
i
⟨ X ⟩ = ∑ Xi P( Ei ).
i
• Aunque en algunos casos podremos realizar la suma de forma analítica, la mayoria de las
veces sólo se podrá hacer de forma numérica.
• Por ejemplo, hay 1023 moléculas en un mol de un gas, por lo que, si incluso asumimos que
cada molécula sólo tiene dos estados posibles (de hecho tienen decenas de ellos), el número
23
total de estados sería 210 que no se puede evaluar con ningun ordenador.
• La idea por tanto es enfocar el problema de la misma forma que hemos planteado la inte-
gración por Monte Carlo.
• El método del valor medio nos permite evaluar una integral sólo con sumar un conjunto de
puntos escogidos aleatoriamente en el dominio de integración.
• La idea ahora es hacer lo mismo con la suma, escoger un número aleatorio de términos y
sumarlos para obtener el resultado final. Por ejemplo dados N estados escogidos aleatoria-
mente y denotados con k = 1, · · · , N tendremos
∑kN=1 Xk P( Ek )
⟨X⟩ = ,
∑kN=1 P( Ek )
donde el denominador es esencial para normalizar la media ponderada, pues no estamos
cogiendo todos los estados que garantizan que
∑ P(Ei ) = 1.
i
39
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
• Esto implica que la mayoría de los estados que escogeremos contribuiran muy poco a la
suma que queremos obtener, o lo que es lo mismo, hay muy pocos estados que contribuyen
de forma significativa a la suma.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• La forma de resolver este problema es clara: usar una distribución de números aleatorios no
uniforme; es decir, el muestreo por importancia.
• Hasta ahora hemos definido el muestreo por importancia como una forma de evitar pa-
tologías en funciones.
La consecuencia de ello es que uno debe escoger una muestra de números aleatorios con una
distribución no uniforme.
• En nuestro caso el objetivo es de hecho escoger una muestra no uniforme, de forma que po-
damos seleccionar correctamente los términos que debemos incluir en la suma para evaluar
el promedio de nuestro observable.
• Una vez más, dada cualquier función gi que depende del estado i, definimos la media pon-
derada como
∑ i ω i gi
⟨ g⟩ω = ,
∑ i ωi
siendo ωi cualquier conjunto de pesos que nosotros elijamos.
Xi P( Ei ) ∑i ωi Xi P( Ei )/ωi ∑ X P( Ei ) ⟨X⟩
= = i i = ,
ωi ω ∑ i ωi ∑ i ωi ∑ i ωi
Xi P( Ei )
⟨X⟩ =
ωi ∑ ωi .
ω i
• Una vez más, podemos evaluar la media ponderada escogiendo N estados aleatorios con
probabilidad
ωi
pi = ,
∑j ωj
N
1
⟨ g⟩ω ≃
N ∑ gk ,
k =1
40
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
• Aplicando este resultado para el valor esperado de X, obtenemos
N
1 Xi P( Ei )
⟨X⟩ ≃
N ∑ ωi ∑ ωi ,
k =1 i
donde es fundamental darse cuenta que mientras que la primera suma sólo se realiza sobre
los N estados de nuestra muestra aleatoria, la segunda suma es sobre todos los estados
posibles. Por tanto, si es posible, es mejor calcular esta segunda suma analiticamente.
• Debemos elegirlos de forma que la mayoría de los estados escogidos aleatoriamente caigan
en la zona donde P( Ei ) es grande, y a la vez, de forma que la suma ∑i ωi se puede hacer de
forma analítica.
N
1
⟨X⟩ ≃
N ∑ Xi .
k =1
• Es decir, si escogemos los N estados aleatoriamente según las distribución de Bolzmann, en-
tonces sólo tenemos que tomar la media de X sobre todos ellos y obtener nuestro promedio.
• En otras palabras dejamos que el sistema vaya pasando por los N estados con probabilidad
P( Ei ), de forma que el valor medio de X no sea más que el promedio de los valores que ha
tomado en cada uno de ellos.
• Para obtener la muestra aleatoria de estados necesitamos calcular P( Ei ) que venia dada por
P( Ei , β) = e− β Ei Z ( β), Z ( β) = ∑ e−βE ,
i
y para ello tenemos que calcular la función de partición Z, que es una suma sobre todos los
estados del sistema.
Es el problema que de hecho queríamos evitar en primer lugar.
• Por suerte hay una forma de calcular la probabilidad de Boltzmann sin conocer la función
de partición. Es gracias a las llamadas cadenas de Markov.
• La idea esencial es que podemos generar estados uno detrás de otro, obteniendo por tanto
una sucesión que se denomina cadena de Markov.
• Para describir el proceso, asumamos que partimos de un estado inicial i, y que, en vez de ele-
gir de forma totalmente aleatoria el siguiente estado, lo obtenemos perturbando ligeramente
el estado i.
41
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Por ejemplo, en un gas, sería equivalente a cambiar una sólo de sus moléculas a un nuevo
nivel de energía.
• Para determinar cuan probable es ese nuevo estado, definimos un conjunto de transiciones
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
de probabilidad Tij , que definen la probabilidad de pasar del estado i al estado j.
• Puesto que dado un estado i siempre tenemos que acabar en cualquier otro estado, se cumple
que
∑ Tij = 1.
j
• Junto a este requisito, el punto clave para obtener Tij es imponer que
Tij P( Ej ) e− βEj /Z
= = − βE /Z = e− β(Ej −Ei ) ,
Tji P( Ei ) e i
• Supongamos ahora que conocemos las probabilidades de transición Tij que satisface las dos
condiciones anteriores, y asumamos ahora que, en un paso dado de la cadena de Markov, la
probabilidad de encontrarse en un estado i viene dada por la probabilidad de Boltzmann.
• Con todo ello, teniendo en cuenta las condiciones que ha de satisfacer Tij , la probabilidad de
acabar en el estado j sera
42
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
2. Que podemos encontrar un conjunto de probabilidades de transición que satisfacen las
condiciones impuestas.
• Vamos a explicar cómo podemos garantizar cada uno de estos dos puntos.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Convergencia de una cadena de Markov hacía la distribución de Boltzmann.
• Supongamos que partimos de un estado inicial de nuestro sistema i, y de forma iterativa nos
movemos a cualquier otro estado con probabilidad Tij ,
donde, tal y como hemos especificado, la probabilidad de transición satisface
Tij P( Ej )
∑ Tij = 1, y
Tji
=
P( Ei )
,
j
p j ( t + 1) = ∑ Tij pi (t),
i
p(t + 1) = Tp(t)
• Como Tij es constante, el vector de probabilidad es multiplicado en cada paso por ella, por
lo que tras t pasos tenemos que
p ( t ) = T t p (0).
• Desconpongamos ahora el vector p(0) como una combinación lineal de los autovalores por
la derecha vk de Tt
p (0) = ∑ ck vk ,
k
43
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
• La cuestión ahora es estudiar que ocurre cuando dejamos evolucionar el tiempo, es decir
cuando t → ∞.
En ese caso,
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
p(t)
lim = c1 v1 ,
t→∞ λ1t
que implica que si dejamos evolucionar nuestro sistema el tiempo suficiente, acabará en el
estado correspondiente al autovalor principal.
• Sólo nos queda por tanto probar que la distribución de Boltzmann es un autovector de la
matriz de transición y que además corresponde al autovalor principal.
Tp = p,
• Sólo nos queda por probar que es el autovector con el autovalor principal.
• Para ello, en primer lugar es conveniente notar que todas las componentes del autovector de
Boltzmann son mayores de cero P( Ei ) > 0.
∑ Tij = 1,
j
• Eso implica que todos los autovectores por la derecha con autovalor ̸= 1 tienen que ser
ortogonales al vector 1, lo cual sólo es posible si algunas de sus componentes son negativas.
• Por tanto, si partimos de una punto inicial donde las componentes del vector de probabili-
dades p son no negativas, al ser Tij > 0, siempre tenderemos al autovector con el autovalor
principal cuyas componentes deben ser todas positivas.
• Sin embargo, el único autovector cuyas componentes son todas positivas es la distribución
de Boltzmann, que implica por tanto que empezando con cualquier probabilidad, nuestro
sistema siempre convergerá hacía la distribución de Boltzmann.
• Lo único que faltaría por probar es que sólo hay un autestado por la izquierda y derecha
asociado al autovalor 1. Lo cual se consigue si todos los estados del sistema son accesibles
(si el sistema es ergódico).
44
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Obteniendo la matriz de transición: el algoritmo de Metropolis.
• Para finalmente garantizar que podemos calcular el valor medio de nuestro estado X, sólo
nos queda encontrar encontrar el valor de Tij , las cuales deben satisfacer
Tij P( Ej )
∑ Tij = 1, y
Tji
=
P( Ei )
.
j
• Estas dos restriccione dejan muchas posibilidades para definir Tij , pero de forma mayoritaria
se usa el algoritmo de Metropolis.
• Para explicar como funciona, es importante hacer notar en primer lugar, que el sistema
puede pasar varias veces por el mismo estado, y que de hecho, puede hacerlo en dos pa-
sos consecutivos. Es decir, Tii puede ser no nulo.
• Teniendo esto en cuenta, el algorimto funciona de la siguiente forma.
• El punto de partida es un estado inicial cualquiera i, sobre el que aplicaremos una pequeña
modificación aleatoria, generando por tanto el estado j.
• Los posibles cambios posibles son lo que llamamos move set.
• Volviendo al ejemplo del gas, una posibilidad sería elegir aleatoriamente que molécula al-
terar y como variar su esta de energía, aumentandolo o disminuyendolo.
• Por último, aceptaremos o rechazaremos la transición a este estado definiendo la probabili-
dad
si Ej ≤ Ei ,
1
Pa =
e− β(Ej −Ei ) si Ej > Ei .
∑ Tij = 1,
j
se satisface trivialmente puesto que dado un estado i siempre pasaremos a cualquier otro
estado, que puede ser el mismo estado i.
• Siguiendo este esquema, la probabilidad de pasar de un estado i a un estado j, será en primer
lugar la probabilidad de escoger aleatoriamente el estado j, la cual es 1/M con M el número
total de cambios posibles, multiplicada por la probabilidad de aceptar la transición si Ej >
Ei .
45
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Por ejemplo, si Ej > Ei tendremos
1 1
Tij = × e− β(Ej −Ei) , Tji = × 1,
M M
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
que satisface que
1 1
Tij = × 1, Tji = × e− β(Ei −Ej) ,
M M
y su cociente
Tij 1/M
= − β(E −Ei) = e− β(Ej −Ei) .
Tji e j /M
• Una vez hemos dado muchos pasos de Markov, dividimos el valor de la suma por el número
de pasos de la cadena y obtenemos ⟨ X ⟩.
– Los pasos en los que rechazamos la transición deben contar como estados, incluso
cuando no hemos hecho ningún cambio.
– Para que la transición este bien definida, es esencial que el número M de transiciones
posibles para ir de i → j sea igual al de j → i.
46
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
– Es esencial asegurar que cualquier estado posible es accesible. Es lo mismo que de-
cir que el estado debe ser ergódico. Es una condición necesaria para asegurar que el
sistema converge a la distribución de Boltzmann.
– Aunque hemos probado que el sistema converge a la distribución de Boltzmann, no
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
hemos calculado cuanto tarda en converger a ella, o lo que es lo mismo a equilibrarse.
Aunque no hay una regla universal para calcular este tiempo, en general es bastante
fácil determinarlo.
• Los estados cuánticos de una partícula de masa m en una caja cúbica de longitud L viene
caracterizado por los enteros n x , ny , nz = 1, · · · , ∞, siendo su energía
π 2 h̄2 2 2 2
E(n x , ny , nz ) = n x + n y + n z .
2m2 L2
• Sea un gas ideal formado por N partículas definidas por sus energías cuánticas que no in-
teraccionan. La energía del sistema será por tanto la suma de las energías de cada una de las
partículas
(i ) (i ) (i )
E= ∑ E(n x , n y , n z ),
i
(i )
siendo n x,y,z el número cuántico correspondiente de la partícula i.
• Estimar la energía promedio de un gas ideal con N = 1000 partículas para k B T = 10 usando
las unidades m = h̄ = 1.
• En primer lugar el conjunto de estados posibles seran los que se obtienen de cambiar los
números cuánticos n x , ny o nz de un único átomo en ±1.
π 2 h̄2
∆E = (2n x + 1),
2m2 L2
y si pasamos de n x a n x − 1
π 2 h̄2
∆E = (−2n x + 1),
2m2 L2
y analogamente para los otros números cuánticos.
(i ) (i ) (i )
• Partamos del estado inicial de menor energía, es decir n x = n x = n x = 1, ∀ i ∈ [0, N ] y
realicemos 250 000 pasos de Monte Carlo.
47
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
[25]: from random import random,randrange
from numpy import exp,pi
from numpy import ones
from matplotlib.pyplot import plot,xlabel,ylabel,show
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
# Constantes
T=10.0 # tempeatura
N=1000 # número de partículas
pasos=250000 # número de pasos
# Bucle principal
eplot = []
E=3*N*pi*pi/2 # Energía total del estado inicial del gas
for k in range(pasos):
if random()<0.5:
dn = 1 # Incremento del número cuantico
dE = (2*n[i,j]+1)*pi*pi/2 # Incremento de energía
else:
if random()<exp(-dE/T):
n[i,j]+=dn
E+=dE
48
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
eplot.append(E)
[26]: # Hacemos la gráfica
plot(eplot)
ylabel("Energía")
xlabel("pasos")
show()
• El sistema parece alcanzar el equilibrio/estabilizarse tras 50000 pasos para al canzar un valor
de la energía total E = 25000.
49
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
[27]: from IPython.display import Image,display
display(Image("spins.png",width=400))
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Matemáticamente los espines pueden representarse con la variable si = ±1 para cada punto
del retículo, donde +1 representa que el espín apunta hacía arriba y -1 cuando apunta hacía abajo.
El otro aspecto fundamental es que los dipolos interaccionan entre ellos de forma que puede
ser energéticamente favorable que se alineen en la misma dirección. La energía potencial mag-
nética debida a la interacción de dos dipolos i y j en el modelo de Ising viene dada por el producto
si s j , siendo la energía de la interacción − Jsi s j , siendo J una constante positiva.
El signo negativo asegura que la energía del sistema disminuye cuando los dipolos están
alineados, y es lo que define a los materiales ferromagnéticos. Los materiales ferromagnéticos
adquieren por tanto una magnetización si tienen la oportunidad para ello. Aquellos materiales
donde el signo de la interacción es positivo se llaman antiferromagnéticos, porque son sistemas
que tenderán a tener una magnetización total nula.
50
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
En el modelo de Ising se asume que los espines sólo interaccionan con sus vecinos más próxi-
mos, es decir con aquellos que se encuentran en elementos adyacentes del retículo. De esta forma,
la energía total del sistema es
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
E = − J ∑ si s j ,
⟨ij⟩
donde ⟨ij⟩ denota a suma sobre pares i, j que son adyacentes en el retículo. En un retículo
bidimensional, eso sígnifica que cada espín sólo interacciona con sus vecinos arriba, abajo, a la
izquierda y derecha, excepto que se encuentre en una de las paredes.
Escribir un programa para escribir una simulación de Monte Carlo usando una cadena de
Markov para el modelo de Ising en dos dimensiones usando un retículo de 20 × 20 espines. Para
ello:
def energia(s):
return -J*(sum(s[0:L-1,:]*s[1:L,:])+sum(s[:,0:L-1]*s[:,1:L]))
[29]: # 2. Realizamos la simulación de Monte Carlo usando el algoritmo de Metropolis
51
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
s=empty([L,L],int)
for i in range(L):
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
for j in range(L):
if random()<0.5:
s[i,j]=+1
else:
s[i,j]=-1
# Loop principal
for k in range(N):
mp.append(M)
i=randrange(L)
j=randrange(L)
s[i,j]=-s[i,j]
E=energia(s)
deltaE=E-Ep
if deltaE>0.0:
if random()>exp(-deltaE/T):
# la transición no es aceptada. Revertimos el espín.
s[i,j]=-s[i,j]
E=Ep
continue
# si no la trasición es aceptada
M=sum(s)
[30]: # 3. Representamos la magnetización.
plot(mp)
ylabel("Magnetización")
52
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
xlabel("Paso")
show()
s=empty([L,L],int)
for i in range(L):
for j in range(L):
if random()<0.5:
s[i,j]=+1
else:
s[i,j]=-1
# Loop principal
53
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
mp=[] # lista con el valor de manetización paso a paso
for k in range(N):
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
mp.append(M)
i=randrange(L)
j=randrange(L)
s[i,j]=-s[i,j]
E=energia(s)
deltaE=E-Ep
if deltaE>0.0:
if random()>exp(-deltaE/T):
# la transición no es aceptada. Revertimos el espín.
s[i,j]=-s[i,j]
E=Ep
continue
# si no la trasición es aceptada
M=sum(s)
plot(mp)
ylabel("Magnetización")
xlabel("Paso")
show()
54
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Esta vez la magnetización es negativa.
• El sistema es simétrico en energía para espines positivos y negativos. Alguna vez se magne-
tizará espontáneamente postivamente y otras negativamente.
• Que el sistema se magnetice de una forma o otra es lo que llamamos ruptura espontánea de
la simetría.
• Es el mismo fenómeno que permite generar masas a las partículas del modelo estándar de
partículas.
T=2.
s=empty([L,L],int)
for i in range(L):
for j in range(L):
if random()<0.5:
s[i,j]=+1
else:
s[i,j]=-1
55
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
# Loop principal
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
for k in range(N):
mp.append(M)
i=randrange(L)
j=randrange(L)
s[i,j]=-s[i,j]
E=energia(s)
deltaE=E-Ep
if deltaE>0.0:
if random()>exp(-deltaE/T):
# la transición no es aceptada. Revertimos el espín.
s[i,j]=-s[i,j]
E=Ep
continue
# si no la trasición es aceptada
M=sum(s)
plot(mp)
ylabel("Magnetización")
xlabel("Paso")
show()
56
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
[33]: # 5. Aumentamos la Temperatura aún más
T=3.
s=empty([L,L],int)
for i in range(L):
for j in range(L):
if random()<0.5:
s[i,j]=+1
else:
s[i,j]=-1
# Loop principal
for k in range(N):
mp.append(M)
57
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
# guardamos la energía inicial
Ep=E
# elegimos aleatoriamente un espín que modificar
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
i=randrange(L)
j=randrange(L)
s[i,j]=-s[i,j]
E=energia(s)
deltaE=E-Ep
if deltaE>0.0:
if random()>exp(-deltaE/T):
# la transición no es aceptada. Revertimos el espín.
s[i,j]=-s[i,j]
E=Ep
continue
# si no la trasición es aceptada
M=sum(s)
plot(mp)
ylabel("Magnetización")
xlabel("Paso")
show()
58
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
• Al aumentar la temperatura aumenta la probabilidad de que cada átomo cambie la direccio
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
del espín. El sistama va variando el valor de su magnetización paso a paso, generando una
magnetización media nula.
• En el tema 6 vimos diferentes métodos que nos permiten encontrar mínimos o máximos de
una función. Sin embargo, estos métodos no nos dicen si ese mínimo es global o local.
• Sin embargo, en muchos casos esto no es suficiente. Por ejemplo si buscamos el estado fun-
damental de un estado físico estamos buscando el mínimo global del sistema. Es el mismo
caso si buscamos diseñar los parámetros de un automóvil para minimizar su consumo.
• Cuando queremos encontrar el mínimo global de una función f (el máximo sería equivalente
a buscar el mínimo de − f ), los métodos del tema 6, al menos por sí solos, no funcionan.
• Uno de los métodos más prometedores para este problema es el llamado simulated anneal-
ing (templado simulado), que fue propuesto en 1985 por Scott Kirkpatrick.
e− βEi
P( Ei ) =
Z
, con Z= ∑ e−βE ,
i
• Asumamos ahora que el sistema tiene un sólo estado fundamental y elijamos el sistema de
referencia de forma que Ei = 0 para el estado fundamental y Ei > 0 para el resto.
59
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
• En otras palabras, implica que el sistema tiene que estar en el estado fundamental.
• Por consiguiente, si conseguimos enfriar el sistema hasta el cero absoluto sólo tenemos que
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
observar el estado en el que ha terminado.
• El aspecto interesante del templado simulado es que el mismo método se puede aplicar a
cualquier otra función, no sólo a un sistema cuyo estado fudamental queremos encontrar.
• Para que el método funcione es necesario bajar la temperatura del sistema lentamente. Si
este es el caso, se puede probar que el sistema siempre encontrará el estado fundamental, o
lo que es lo mismo, el mínimo de la función.
• Por regla general, la temperatura inicial del sistema se debe tomar mayor que la variación
tipica en un paso de Monte Carlo, es decir β( Ei − Ej ) ≤ 1, de forma que Pa ≃ 1 para casi
todos los movimientos posibles, y el sistema se vuelva totalmente aleatorio sin importar cual
era su estado inicial.
• Tras ello uno empieza a enfriar el sistema, lo cual se suele hacer eligiendo la función de
enfriamiento
T = T0 e−t/τ ,
siendo T0 la temperatura inicial del sistema y τ una constante, que en general se suele coger
para optimizar el cociente precisión (τ grande) vs rapidez (τ pequeña).
60
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Es un problema importante porque pertenece a la clase de problemas NP, problemas cuyo
tiempo de resolución escala como un polinomio.
El problema se formula de la siguiente manera. Un vendedor tiene que recorrer N ciudades,
pudiendo viajar siempre en la linea recta que uno cualquier par de ciudades. Dada la localización
de las ciudades, el problema reside en encontrar el camino más corto (en términos de la distancia
recorrida), que le permite recorrer todas las ciudades empezando y acabando en la misma ciudad.
Para simplicar el problema asumamos que el vendedor se mueve en un espacio bidimensional,
y escojamos la posición de N = 25 ciudades de forma aleatoria en un espacio de longitud 1 por
cada lado. Numeremos las ciudades en el orden en las que el viajero las va a visitar, y denotemos
la posición de la ciudad i con el vector ri = ( xi , yi ), siendo r0 = r N , pues el viaje tiene que acabar
en el punto de partida.
De esta forma, la distancia recorrida por el viajante es
N −1
D= ∑ | r i +1 − r i | .
i =0
61
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Queremos minimizar esta cantidad sobre todo el posible orden de las ciudades usando el tem-
plado simulado. Para hacerlo, tenemos que definir en primer lugar los movimientos posibles
dentro de la cadena de Markov, que definimos como el intercambio del orden de dos ciudades.
Si el cambio disminuye la distancia total, entonces siempre lo aceptamos. Si no, lo aceptamos
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
con la probabilidad del algoritmo de Metropolis. En cada paso hay que actualizar la temperatura
siguiendo la función de enfriamineto exponencial.
Vamos a generar una animación que describa el proceso de la animación.
[1]: from numpy import sqrt,exp,empty
from random import random,randrange
def mag(x):
return sqrt(x[0]**2+x[1]**2)
def distancia():
s=0
for i in range(N):
s+=mag(r[i+1]-r[i])
return s
r=empty([N+1,2],float)
for i in range(N):
r[i,0]=random()
r[i,1]=random()
r[N]=r[0]
# distancia inicial
D=distancia()
[2]: # preparamos la animación
62
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
from vpython import curve,rate,canvas,vector,sphere
scene = canvas(width=500, height=500,
center=vector(0.5,0.5,0))
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
<IPython.core.display.HTML object>
<IPython.core.display.Javascript object>
<IPython.core.display.HTML object>
<IPython.core.display.Javascript object>
[3]: R=0.02 # describimos cada ciudad por medio de una efera de radio R
listp=[]
for i in range(N):
sphere(pos=vector(r[i,0],r[i,1],0),radius=R)
listp.append(vector(r[i,0],r[i,1],0))
listp.append(vector(r[N,0],r[N,1],0))
l=curve(pos=listp,radius=R/4)
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
63
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
T=Tmax # temperatura inicial
while T>Tmin:
t+=1
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
T=Tmax*exp(-t/tau) # enfriamos
i,j=randrange(1,N),randrange(1,N)
while i==j:
i,j=randrange(1,N),randrange(1,N)
D=distancia()
deltaD=D-Dp
if random()>exp(-deltaD/T):
r[i,0],r[j,0]=r[j,0],r[i,0]
r[i,1],r[j,1]=r[j,1],r[i,1]
D=Dp
Ejercicio 9.16: Mínimo global de una función.
Considerar la función f ( x ) = x2 − cos 4πx, cuya representación es
[35]: from numpy import linspace,cos,pi
from matplotlib.pyplot import plot,show
x=linspace(-2,2,1000)
show(plot(x,x**2-cos(4*pi*x)))
64
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
El mínimo global es obviamente x=0.
1. Escribir un programa que usando el templado simulado lo confirme. Para ello, empezar en
x=2, y realizar pasos de Monte Carlo x → x + δ siendo δ un número aleatorio con generado
de una distribución gaussiana de media cero y desviación típica 1. Usar la función de enfri-
amineto exponencial y escoger tanto el valor de la temperatura inicial como del parámetro
τ que te permiten llegar al mínimo en un tiempo razonable.
2. Adaptar el código para encontrar el mínimo de la función
√ √
f ( x ) = cos x + cos 2x + cos 3x, con 0 < x < 50.
[36]: from numpy import cos,sin,sqrt,exp,log,pi
from random import random
from matplotlib.pyplot import plot,show
# definimos la función
def f(x):
return x*x-cos(4*pi*x)
def gaussian():
r=sqrt(-2*log(1-random()))
theta=2*pi*random()
x=r*cos(theta)
65
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
y=r*sin(theta)
return x,y
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Tmax=10
Tmin=1e-3
tau=1e4
T=Tmax
x=2
t=0
xpoints=[]
while T>Tmin:
xpoints.append(x)
dx,dy=gaussian()
xp=x+dx
df=f(xp)-f(x)
if df<=0:
x=xp
elif random()<exp(-df/T):
x=xp
t+=1
T=Tmax*exp(-t/tau)
[37]: plot(xpoints,"-")
show()
66
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
[38]: # Representamos la segunda función
def f(x):
return cos(x)+cos(sqrt(2)*x)+cos(sqrt(3)*x)
x=linspace(0,50,1000)
show(plot(x,f(x)))
67
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
El mínimo esta entorno a x=16.
[42]: # Volvemos a inicializar nuetros valores
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
T=Tmax
t=0
x=2
xpoints=[]
while T>Tmin:
xpoints.append(x)
dx,dy=gaussian()
xp=x+dx
if df<=0:
x=xp
elif random()<exp(-df/T):
x=xp
t+=1
T=Tmax*exp(-t/tau)
[43]: show(plot(xpoints,"-"))
68
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Ejercicio 9.17: El problema de la cobertura mediante dímeros.
Los dímeros son polímeros formados por sólo dos monómeros. En su versión más sencilla
el problema de la cobertura de dímeros consiste en calcular cuantós dímeros, que ocupan dos
unidades espaciales, puden caber en una retícula bidimenisonal de tamaño L × L.
Es algo que se puede entender perfectamente mirando la siguiente figura:
[41]: from IPython.display import Image,display
display(Image("dimer.png",width=400))
En este caso la solución es trivial, el número máximo es obviamente L × L/2, pero en este
problema vamos a confirmar que este es el caso.
69
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
1. Escribir un programa que use el templado simulado en una retícula de 50 × 50 unidades. La
energía del sistema es en este caso menos el número de dimeros que caben en la retícula, que
se minimiza cuando el número de dímeros son máximos. Los movimientos de la cadena de
Markov son los siguientes:
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
i)- Elegir dos lugares adyacentes de la retícula de forma aleatoria.
ii)- Si ambos lugares están vacios, colocar un dímero.
iii)-Si ambos lugares están ocupados, eliminar el dímero que se encuentra en ellos con la
probabilidad inferida del algoritmo de Metropolis.
iv)- De otro forma, no hacer nada.
Representar el resultado mediante una animación.
2. Probar diferentes valores del pármetro τ para la función de enfriamiento exponencial. Como valor
inicial una opción razonable es τ = 10000 pasos.
Comprobar que cuando se disminuye τlassolucionesempiezanaserpeores.
[5]: from numpy import zeros,empty,exp
from random import random,randrange
<IPython.core.display.HTML object>
<IPython.core.display.Javascript object>
70
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
site=empty([L,L],sphere) # creamos un array de esferas, donde vamos a colocar␣
֒→nuestros dímeros
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
for i in range(L):
for j in range(L):
site[i,j]=sphere(pos=vector(i,j,0),radius=2*R) # colocamos una␣
֒→esfera en cada punto del retículo
while T>Tmin:
# Enfriamos el sistema
t+=1
T=Tmax*exp(-t/tau)
rate(25)
# realizamos el movimiento
# colocamos el dimero
71
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
n+=1
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
␣
֒→ dimer[d]=cylinder(pos=vector(i1,j1,0),axis=vector(i2-i1,j2-j1,0),radius=R)
site[i2,j2].visible=True
del dimer[ind]
site[i1,j1].visible=False
site[i2,j2].visible=False
Final del Tema 9.
Final de la asignatura de Física Computacional.
72
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131391
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.