Método de Montecarlo

método de resolución de problemas

El método de Montecarlo[1]​ es un método no determinista o estadístico numérico, usado para aproximar expresiones matemáticas complejas y costosas de evaluar con exactitud. El método se llamó así en referencia al Casino de Montecarlo (Mónaco) por ser “la capital del juego de azar”, al ser la ruleta un generador simple de números aleatorios. El nombre y el desarrollo sistemático de los métodos de Montecarlo datan aproximadamente de 1944 y se mejoraron enormemente con el desarrollo de la computadora u ordenador.

El uso de los métodos de Montecarlo como herramienta de investigación proviene del trabajo realizado en el desarrollo de la bomba atómica durante la Segunda Guerra Mundial en el Laboratorio Nacional de Los Álamos en EE. UU. Este trabajo conllevaba la simulación de problemas probabilísticos de hidrodinámica concernientes a la difusión de neutrones en el material de fisión. Esta difusión posee un comportamiento eminentemente aleatorio. En la actualidad es parte fundamental de los algoritmos de raytracing para la generación de imágenes 3D.

Montecarlo.

En la primera etapa de estas investigaciones, John von Neumann y Stanislaw Ulam refinaron esta ruleta y los métodos "de división" de tareas. Sin embargo, el desarrollo sistemático de estas ideas tuvo que esperar al trabajo de Harris y Herman Kahn en 1948. Aproximadamente en el mismo año, Enrico Fermi, Nicholas Metropolis y Ulam obtuvieron estimadores para los valores característicos de la ecuación de Schrödinger para la captura de neutrones a nivel nuclear usando este método.

El método de Montecarlo proporciona soluciones aproximadas a una gran variedad de problemas matemáticos posibilitando la realización de experimentos con muestreos de números pseudoaleatorios en una computadora. El método es aplicable a cualquier tipo de problema, ya sea estocástico o determinista. A diferencia de los métodos numéricos que se basan en evaluaciones en N puntos en un espacio M-dimensional para producir una solución aproximada, el método de Montecarlo tiene un error absoluto de la estimación que decrece como en virtud del teorema del límite central.

Orígenes del método

editar
 
Ejemplo de aplicación de Montecarlo. En el juego de barcos, primero se realizan una serie de tiros a puntos aleatorios. Si el jugador genera un algoritmo puede deducir la posición del barco conocidos los datos anteriores.

La invención del método de Montecarlo se asigna a Stanislaw Ulam y a John von Neumann. Ulam ha explicado cómo se le ocurrió la idea mientras jugaba un solitario durante una enfermedad en 1946. Advirtió que resulta mucho más simple tener una idea del resultado general del solitario haciendo pruebas múltiples con las cartas y contando las proporciones de los resultados que computar todas las posibilidades de combinación formalmente. Se le ocurrió que esta misma observación debía aplicarse a su trabajo de Los Álamos sobre difusión de neutrones, para la cual resulta prácticamente imposible solucionar las ecuaciones íntegro-diferenciales que gobiernan la dispersión, la absorción y la fisión. “La idea consistía en probar con experimentos mentales las miles de posibilidades, y en cada etapa, determinar por casualidad, por un número aleatorio distribuido según las probabilidades, qué sucedería y totalizar todas las posibilidades y tener una idea de la conducta del proceso físico”.

Podían utilizarse máquinas de computación, que comenzaban a estar disponibles, para efectuar las pruebas numéricas y en efecto reemplazar el aparato experimental del físico. Durante una de las visitas de von Neumann a Los Álamos en 1946, Ulam le mencionó el método. Después de cierto escepticismo inicial, von Neumann se entusiasmó con la idea y pronto comenzó a desarrollar sus posibilidades en un procedimiento sistemático. Ulam expresó que Montecarlo “comenzó a tener forma concreta y empezó a desarrollarse con todas sus fallas de teoría rudimentaria después de que se lo propuse a Johnny”.

A principios de 1947 Von Neumann envió una carta a Richtmayer a Los Álamos en la que expuso de modo influyente tal vez el primer informe por escrito del método de Montecarlo. Su carta fue encuadernada junto con la respuesta de Richtmyer como un informe de Los Álamos y distribuida entre los miembros del laboratorio. Von Neumann sugería aplicar el método para rastrear la generación isótropa de neutrones desde una composición variable de material activo a lo largo del radio de una esfera. Sostenía que el problema era adecuado para el ENIAC y estimaba que llevaría 5 horas calcular la acción de 100 neutrones a través de un curso de 100 colisiones cada uno.

Ulam estaba particularmente interesado en el método Montecarlo para evaluar integrales múltiples. Una de las primeras aplicaciones de este método a un problema determinista fue llevada a cabo en 1948 por Enrico Fermi, Ulam y von Neumann cuando consideraron los valores singulares de la ecuación de Schrödinger.

Ejemplos

editar

Los programas de diseño asistido por ordenador (CAD) pueden determinar rápidamente el volumen de modelos muy complejos. Estos modelos, en general, no tienen una expresión analítica para determinar su volumen (por ejemplo, para un prisma, área de la base multiplicada por la altura), y la única solución es dividir el modelo en un conjunto de pequeños submodelos (teselación) cuyo volumen pueda determinarse (por ejemplo, dividir el modelo en miles de tetraedros). Sin embargo, esto consume muchos recursos, tanto para la teselación como para el cálculo del volumen de cada uno de los elementos. Por ello utilizan métodos de Montecarlo, más robustos y eficientes.

Como el software sí que conoce la expresión analítica de la geometría del modelo (posición de los nodos, aristas y superficies) puede determinar si un punto está dentro del modelo o está fuera con un coste mucho menor que el de determinar un volumen.

  • En primer lugar el software coloca el modelo dentro de un volumen conocido (por ejemplo, dentro de un cubo de 1 m³ de volumen).
  • A continuación, genera un punto aleatorio del interior del volumen conocido, y registra si el punto "ha caído" dentro o fuera del modelo. Esto se repite un gran número de veces (miles o millones), consiguiendo un registro muy grande de cuántos puntos han quedado dentro y cuántos fuera.
  • Como la probabilidad de que caiga dentro es proporcional al volumen del modelo, la proporción de puntos que han caído dentro con respecto al total de puntos generados es la misma proporción de volumen que ocupa el modelo dentro del cubo de 1 m³.

Si el 50% de los puntos han caído dentro, el modelo ocupa el 50% el volumen total, es decir, 0.5 m³. Evidentemente, cuantos más puntos genere el software, menor será el error de la estimación del volumen.

 
Estimación de   por el método de Montecarlo en Python con un número de puntos   de 10 a 1,000,000 de acuerdo al código provisto en.[2]

Cálculo de   por Montecarlo

editar

Este método está cerca del experimento de aguja de Buffon, planteada por el naturalista francés Georges-Louis Leclerc de Buffon.

Consideremos al círculo unitario inscrito en el cuadrado de lado 2 centrado en el origen. Dado que el cociente de sus áreas es  /4, el valor de   puede aproximarse usando Montecarlo de acuerdo al siguiente método:[3][2]

  1. Dibuja un círculo unitario, y al cuadrado de lado 2 que lo inscribe.
  2. Lanza un número   de puntos aleatorios uniformes dentro del cuadrado.
  3. Cuenta el número de puntos dentro del círculo, i.e. puntos cuya distancia al origen es menor que 1.
  4. El cociente de los puntos dentro del círculo dividido entre   es un estimado de,  /4. Multiplica el resultado por 4 para estimar  .

En este cálculo se tienen que hacer dos consideraciones importantes:

  1. Si los puntos no están uniformemente distribuidos, el método es inválido.
  2. La aproximación será pobre si solo se lanzan unos pocos puntos. En promedio, la aproximación mejora conforme se aumenta el número de puntos.

Ejemplo realizado en java:

   import java.awt.geom.Point2D;
   import java.util.Random;
   public class MyClass {
       public static void main(String args[]) {
         int n=10000000;
         int insideCircle = 0;
         for(int i = 1; i <= n; i++){
             Random rand = new Random();
             double x = rand.nextDouble(2) -1d;
             double y = rand.nextDouble(2) -1d;
             if(isInsideCircle(x,y)){
                 insideCircle++; 
             }
         }
         System.out.println("pi value: " + 4*(double)insideCircle/(double)n);
       }
       
       public static boolean isInsideCircle( 
           double x1, 
           double y1) {
           return Point2D.distance(x1, y1, 0, 0) <= 1;
       }
   }

Véase también

editar

Referencias

editar
  1. Peña Sánchez de Rivera, Daniel (2001). «Deducción de distribuciones: el método de Monte Carlo», en Fundamentos de Estadística. Madrid: Alianza Editorial. ISBN 84-206-8696-4.
  2. a b «Calculo de   mediante Monte Carlo». Consultado el 11 de julio de 2022. 
  3. Kalos y Whitlock, 2008.

Enlaces externos

editar