Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
• Para obtener la información adecuada para este problema, lo mejor es
plantearlo estadísticamente: no nos interesan las trayectorias detalladas
de cada molécula de leche, nos interesa su promedio.
• Puesto que el número de partículas es muy grande, las desviaciones
respecto a este promedio serán pequeñas y además se pueden estimar
con métodos estadísticos.
• Un concepto muy importante para describir este problema en términos
estadísticos es el de la aleatoriedad: la trayectoria de una molécula de
leche se puede describir como un camino aleatorio.
• En un camino aleatorio, el caminante se mueve en trayectorias rectas
durante ciertos intervalos de tiempo, tras los cuales cambia de dirección
aleatoriamente. Esto se cumple para las moléculas de leche.
• Esto no quiere decir que la trayectoria de una molécula determinada sea
aleatoria. Al contrario, está perfectamente definida por sus condiciones
iniciales y la fuerza de interación durante la colisión.
• Pero podemos hacer un tratamiento estadístico de estas colisiones, ya
que al ser muy elevado el número de moléculas y de colisiones, dicho
tratamiento es una buena aproximación.
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.1 Generación de números aleatorios
• Un ordenador es un dispositivo completamente determinista: sólo hace
aquello que le ordenamos. ¿Cómo es posible que un ordenador genere
un número aleatorio?
• Normalmente, los lenguajes de programación incluyen una función para
generar números aleatorios en una secuencia. En realidad, estos
números deberían llamarse pseudo-aleatorios.
• En C++ existen funciones que generan este tipo de números.
Dependiendo del compilador suelen llamarse “rand”. Generalmente
proporcionan una secuencia de números pseudo-aleatorios entre 0 y el
mayor entero posible, como 231-1. Otros lenguajes de programación
proporcionan números entre 0 y 1.
• Consideremos una función random que proporcione valores entre 0 y 1.
Cada vez que llamamos a esta función nos da un número distinto, pero
todos los números deben estar uniformemente distribuidos entre el
mínimo y el máximo valor: todos los posibles valores son igualmente
probables.
• La pregunta que nos surge es: ¿cómo puede generar un ordenador a
través de un lenguaje de programación un número aleatorio?
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.1 Generación de números aleatorios
• Existen varios métodos para generar métodos aleatorios desde un
ordenador. Uno de los más extendidos y de los más probados utiliza una
ecuación de la forma:
xn+1 = (axn + b)mod(m)
• El operador “mod” es el operador módulo o resto, que devuelve el resto
de la división entre el primer y el segundo operando. Los valores más
tipicos de m son 216 y 232.
• En esta expresión se determina xn+1 a partir del n-ésimo término de la
serie aleatoria. Las constantes a y b deben ser cuidadosamente elegidas
para que el método funcione.
• Este generador de números aleatorios se llama “generador congruencial
lineal”. Necesita un valor inicial o semilla y, a partir del mismo, va
generando todos los demás.
• Los compiladores tienen un valor predeterminado para la semilla. Si se
usa este valor, se obtiene la misma secuencia de números cada vez que
se ejecute el programa
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.1 Generación de números aleatorios
• Por tanto, si se usa el valor predeterminado de la semilla, la secuencia
generada no es muy “aleatoria”: se repite en cada ejecución del problema
y, por tanto, se puede predecir.
• No obstante, esta semilla por defecto puede ser útil para depurar un
programa que no funcione bien: los errores en el programa se
encuentran más fácilmente cuando los resultados del programa son
reproducibles.
• Una vez que se está convencido de que el programa funciona
perfectamente, se puede cambiar de semilla y elegir una distinta cada
vez que se ejecute el programa.
• Los lenguajes de programación tienen una segunda función aleatoria
para generar semillas. En C++ suele llamarse srand y suele ir
acompañada de una variable temporal, de manera que generan un
número en función del reloj del sistema (por ejemplo:
srand(time(NULL)) ).
• Una vez elegida la semilla, se genera la secuencia con la ecuación
recursiva anterior. La elección de las constantes a y b determina la
eficiencia del método.
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.1 Generación de números aleatorios
• Si los valores de a y b están bien elegidos, la secuencia será realmente
aleatoria, es decir, recorrerá todo el rango posible llenándolo de manera
uniforme, ya que la probabilidad debe ser la misma en todo el intervalo y
no debe haber correlación entre dos términos de la secuencia:
independencia y uniformidad.
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.1 Generación de números aleatorios
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.1 Generación de números aleatorios
• No siempre se busca tener una distribución uniforme de números
aleatorios, a veces se necesita una distribución no-uniforme.
• Por ejemplo, ciertos fenómenos radiactivos están gobernados por la
distribución de Poisson, o la distribución de velocidades de un gas ideal
sigue una distribución de Maxwell.
• Veremos a continuación cómo se pueden generar números aleatorios que
sigan una cierta distribución no uniforme mediante dos métodos distintos.
• El primer método se denomina “Método de la transformación”. Este
método utiliza una de las propiedades fundamentales de la Probabilidad.
Sea una colección de variables, {x1,x2,...}, que están distribuidas según
una función, Px(x).
• Esto quiere decir que la probabilidad de encontrar un valor entre x y x+dx
es Px(x)dx.
• Ahora supongamos una segunda variable, y, que es función de x: y=f(x).
• Los valores de la variable y estarán dispuestos según una función Py(y),
de forma que la probabilidad de encontrar un valor entre y e y+dy es
Py(y)dy
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.1 Generación de números aleatorios
• Entonces se cumple que:
Px (x)dx = Py (y)dy
• Podemos tomar la colección de valores de x como el resultado de utilizar
la función rand del compilador, de manera que Px(x)=constante=C. Por
tanto, tenemos que:
dx dx
Py (y) = Px (x) =C
dy dy
(las barras de valor absoluto se ponen para asegurar que la probabilidad
es siempre positiva).
• Por tanto, para generar una secuencia de números según la distribución
Py(y) debemos encontrar la función y=f(x), de forma que la inversa de su
derivada sea Py: −1
dy
∝ Py
dx
−1
• En general: dy
C =1 → = Py
dx
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.1 Generación de números aleatorios
• Veamos este método con un ejemplo: vamos a generar números aleatorios
que sigan la distribución de Poisson:
Py (y) = exp(−y)
dx
• Tenemos que encontrar la función y=f(x) que hace que = e− y
dy
• Expresando x en función de y e integrando:
∫
−y −y
x= e dy = −e ⇒ x = e− y
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.1 Generación de números aleatorios
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.1 Generación de números aleatorios
• Para ello vamos recorriendo los valores de
la secuencia y los aceptamos o rechazamos
con una probabilidad Py
• Imaginemos que la probabilidad máxima es 1
y que vamos a decidir si aceptamos o
rechazamos un valor yi cuya probabilidad es,
digamos, 0,2. Py(yi)=0.2
• De cada 5 veces que encontremos este valor, 4 deberíamos rechazarlo y
1 aceptarlo. ¿Cómo podemos implementar esto en un algoritmo?
• En primer lugar, generamos un nuevo número aleatorio, Ptest. Este
número va a estar distribuido uniformemente entre 0 y 1.
• La condición de rechazo la establecemos al comparar este Ptest con Py(yi).
Si Py(yi)<Ptest, entonces rechazamos esta ocurrencia de yi, y si Py(yi)>Ptest,
entonces la aceptamos. En promedio habrá 4 rechazos de cada 5
intentos.
• Este proceso se repite para todos los valores de la secuencia original,
{y1,y2,...}. Los números aceptados estarán distribuidos de acuerdo a Py.
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.1 Generación de números aleatorios
• En general, la probabilidad de que un cierto número yn no sea rechazado
será proporcional a la altura de la función Py(yn).
• Este método tiene la ventaja importante de que sólo se necesita el valor
de Py en cada punto. De hecho, Py no tiene por qué ser analítica, podría
ser una función de distribución numérica. Y tampoco tiene por qué ser
una función suave, puede ser todo lo irregular que se quiera.
• Para demostrar el método del rechazo vamos a generar números
aleatorios distribuidos según una función gaussiana centrada en y=1 y
con anchura, σ=1:
Py = exp ⎡⎣( y − 1) ⎤⎦
2
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.1 Generación de números aleatorios
• Se necesitará:
#include <iostream> /* Voy a leer y escribir datos */
#include <fstream> /* Voy a leer o escribir en ficheros */
#include <math.h> /* Uso el valor absoluto, fabs */
#include <stdlib.h> /* para poder usar srand y rand */
#include <time.h> /* para poder usar la función time*/
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.2 Integración de Monte Carlo
• Los métodos numéricos para calcular la integral de una función se basan
en dividir el intervalo de interés en varios subintervalos y sumar sus
áreas. Los métodos de Monte Carlo ofrecen un enfoque diferente.
• Para plantear el problema consideremos una diana para dardos
cuadrada, que contiene una región circular en su interior:
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.2 Integración de Monte Carlo
• Ahora supongamos que podemos lanzar dardos
sobre el tablero con precisión suficiente para que
todos los dardos caigan en su interior, pero en
posiciones distribuidas aleatoriamente (pero
uniformemente) sobre su superficie.
• En estas condiciones, la probabilidad de que
un dardo caiga en una determinada región del
tablero debe ser proporcional al área de dicha
región.
• Por tanto, la fracción de dardos que acaba dentro
de la región circular será proporcional al cociente entre
el área del círculo y el área total del tablero. Este sencillo planteamiento es
la base de la integración mediante el método de Monte Carlo.
• En el ejemplo de los dardos, la integral de interés es el área del círculo.
Para simular el lanzamiento de dardos, se pueden generar números
aleatorios que corresponderán a los puntos donde caen los dardos.
• Consideremos en primer lugar sólo un cuadrante, el superior derecho.
Dada la simetría del problema, podremos escalar después a todo el tablero
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.2 Integración de Monte Carlo
• Supongamos que el cuadrante se extiende en el
rango 0≤x≤1, y 0≤y≤1.
• Para lanzar un dardo, obtenemos una pareja de
números aleatorios, x e y. A continuación
comprobamos si este punto, (x,y), está dentro
o fuera del círculo, es decir, si cumple la
condición:
y ≤ 1− x 2
• Se repite este proceso un número grande de
veces, Ntotal. Después contamos el número de veces
que los dardos caen dentro del círculo, Ndentro. El área bajo la curva será
Ndentro/Ntotal multiplicado por el área del cuadrado (que, en este caso, es la
unidad.
• La implantación de este método se ilustra en la siguiente subrutina, escrita
en basic
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.2 Integración de Monte Carlo
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.2 Integración de Monte Carlo
• Se ha multiplicado por 4 para obtener el área
del círculo
• En la figura se muestran los resultados de dos
simulaciones, con un total de 107 puntos
aleatorios cada una como máxmo,
anotándose los resultados parciales en
varios momentos.
• El resultado numérico tiene algunas fluctuaciones
aunque, a medida que Ntotal crece, se van haciendo
más pequeñas
• Las dos series diferentes no producen exactamente los mismos
resultados, anque ambas convergen al resultado exacto para valores de
Ntotal grandes.
• En estadística es muy frecuente que los datos se distribuyan según una
distribución gaussiana. Este tipo de distribuciones se caracterizan por
tener un valor medio y una anchura, y ambas cantidades pueden variar al
aumentar el número total de sucesos, Ntotal.
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.2 Integración de Monte Carlo
• En el caso del área del círculo, todas las
fluctuaciones ocurren alrededor de un valor
central, 𝜋.
• Este valor central lo podemos tomar como el
valor medio de la distribución asociada. Es
decir, si hiciéramos la integración muchas
veces usando siempre el mismo número de
dardos (el mismo Ntotal), obtendríamos una
serie de resultados cuyo valor medio sería 𝜋.
• Estos resultados estarían distribuidos alrededor del valor medio con una
dispersión: 1/2
⎡ 1 N intentos
2⎤
σ =⎢ ∑ (i )⎥
I − I
⎣ N intentos i=1 ⎦
donde Nintentos es el número de veces que evaluamos la integral, Ii es el
valor obtenido en el i-ésimo intento, e I es el valor promedio.
• Por tanto, combinando un número grande de evaluaciones de la integral
obtendremos un valor más preciso que con sólo una evaluación.
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.2 Integración de Monte Carlo
1/2
⎡ 1 N intentos
⎤
∑ (I −I)
2
σ =⎢ i ⎥
⎣ N intentos i=1 ⎦
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.2 Integración de Monte Carlo
• En el método de Simpson, en d dimensiones, tenemos que hacer una malla
que contenga N puntos, lo que hace que en cada dimensión habrá N1/d
intervalos.
• Por tanto, el espaciado en cada dimensión es Δx∼N-1/d. El error numérico
asociado a la regla de Simpson varía como N(Δx)d+2.
N ( Δx ) = N (N )
−1/d d+2
= N ⋅ N −1−2/d = N −2/d
d+2
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM
2. Métodos de Monte Carlo
2.2 Integración de Monte Carlo
Simulación y métodos numéricos en materiales y nanoestructuras Máster en Materiales Avanzados y Nanotecnologías, UAM