Simulación Numérica Taller de Informática I DC - FCEyN - UBA 9 de septiembre de 2015 Taller de Informática I 9 sept 2015 Simulación La simulación sirve como herramienta para analizar el diseño y operaciones de sistemas de procesos complejos. Si bien la solución nunca es exacta, las aproximaciones que se obtienen son bastante buenas. La construcción de modelos tiene su origen en la época del renacimiento, aunque la palabra Simulación aparece cerca de 1940, cuando los cientı́ficos Von Neumann y Stanislau Ulam, que trabajaban en el proyecto Montecarlo, durante la Segunda Guerra Mundial. El proyecto consistı́a en desarrollar la primera bomba atómica antes que Alemania. Trabajaron en conjunto muchos cientı́ficos de EEUU, Reino Unido y Canadá, entre ellos Albert Einstein. En el proyecto se hizo referencia a la simulación Montecarlo o método Montecarlo. Se trata de un método 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, por ser la capital de los juegos de azar y por ser la ruleta el método más simple de generación de números aleatorios. Con la utilización de las computadoras en los experimentos de simulación, surgieron muchı́simas aplicaciones y además una mayor cantidad de problemas teóricos y prácticos. Taller de Informática I 9 sept 2015 Qué es la Simulación?. Definición La simulación es el proceso de diseñar un modelo de un sistema real, que servirá para dirigir experimentos con el propósito de entender el comportamiento del sistema. Existen varias definiciones formales de simulación. Alguna de ellas: Simulación es una técnica numérica para conducir experimentos en una computadora digital. Estos experimentos comprenden ciertos tipos de relaciones matemáticas y lógicas, las cuales son necesarias para describir el comportamiento y la estructura de sistemas complejos del mundo real a través de largos perı́odos. - Thomas T. Goldsmith Jr. y Estle Ray Mann La simulación es el proceso de diseñar un modelo de un sistema real y llevar a término experiencias con él, con la finalidad de comprender el comportamiento del sistema o evaluar nuevas estrategias dentro de los lı́mites impuestos por un cierto criterio o un conjunto de ellos para el funcionamiento del sistema. R.E. Shannon. Taller de Informática I 9 sept 2015 En geologı́a... Una de las herramientas más útiles para comprender los procesos geológicos y evaluar su importancia relativa en los sistemas naturales es su simulación mediante modelos matemáticos. Con estos modelos se intenta, primero, identificar y luego, cuantificar los principales factores que determinan cómo funcionan los sistemas geológicos (una falla, un acuı́fero, un arroyo contaminado) de manera que se pueda predecir su evolución y tomar decisiones que permitan evitar los posibles riesgos asociados Taller de Informática I 9 sept 2015 Experimentación real y simulación La experimentación directa sobre la realidad puede traer algunos problemas: Costo muy alto Gran lentitud En ocasiones las pruebas son destructivas A veces puede no ser ética (sobre todo si están involucrados seres humanos) Puede resultar imposible (por ejemplo para predecir sucesos futuros) Taller de Informática I 9 sept 2015 Supongamos un ejemplo geológico complicadito... Una compañı́a petrolera debe decidir en cuál de los dos puntos (A ó B) debe realizar una perforación para extraer petróleo. La profundidad estimada en A es de 57 mts y en B es de 40 mts. Desde este momento y hasta el instante en que se comience a perforar, puede que llegue una nueva máquina (con probabilidad 0.71). Durante la excavación se podrı́a producir una averı́a con probabilidad de 0.14 si se perfora en A o 0.16 si se perfora en B. En caso de usar la maquina vieja, las probabilidades de averı́a si se perfora en A es de 0.28 y en B de 0.19. Independientemente del tipo de máquina y del lugar donde se perfore cuando se produce la averı́a, ésta puede ser grande con probabilidad 0.35. En el punto A, la perforación avanza a una velocidad de 3 mts por dı́a y en B a 2 mts por dı́a. En qué punto es más rentable perforar? Claramente la respuesta a este problema puede darse mediante un algoritmo de simulación, dado que no vamos a perforar ambos puntos y averiar maquinas para responder a esto... Taller de Informática I 9 sept 2015 Introducción a la generación de números pseudoaleatorios Casi todos los métodos de simulación se basan en la posibilidad de crear números aleatorios con distribución U(0, 1). Hasta la aparición de las computadoras, los números aleatorios se obtenı́an de procedimientos experimentales como loterı́a o ruleta y se almacenaban en tablas. Los números generados por computadora se llaman números pseudoaleatorios, dado que son predecibles a partir del primer número denominado semilla. Para poder utilizar un generador automático de números pseudoaleatorios, éste debe cumplir con ciertas propiedades: Producir muestras según la distribución U(0, 1) Pasar los contrastes de aleatoriedad e independencia más habituales Que la sucesión generada sea reproducible a partir de la semilla Tener una longitud de ciclo tan grande como se desee Generar valores a alta velocidad Ocupar poca memoria Taller de Informática I 9 sept 2015 Método del cuadrado medio Este método es uno de los más simples, creado por Von Neumann en 1940 y se llama método del Cuadrado Medio. La técnica parte desde una semilla inicial, un número enteros de 2n cifras propuesto por el usuario y los pasos a seguir son: 1 Se toma un X0 como semilla, tal que X0 es entero y de 2n cifras (por ej: X0 =3234) 2 Se calcula y como X02 (Ejemplo y=10458756) 3 Se toman los 2n dı́gitos centrales. Este número servirá para formar el primer número y para continuar calculando números pseudoaleatorios (Ejemplo: 4587) de tamaño 2n. El primer número pseudoaleatorio es y /102n (Ejemplo: 0.4587) La nueva semilla es 4587, o sea, se comienza el procedimiento nuevamente para crear otro número pero con la nueva semilla. Taller de Informática I 9 sept 2015 También podemos simular en Matlab el método del cuadrado medio. Usamos la misma semilla que en nuestro ejemplo anterior: >> x0 =3234; >>y=x0 ˆ 2 ; Ahora tenemos que tomar los 4 dı́gitos centrales. Para eso, tenemos que transformar al número y en la cadena de caracteres ystr. Una vez que tenemos la cadena de caracteres, podemos manipularla como si fuera un vector: >> y s t r=n u m 2 s t r ( y ) ; % Paso e l numero a c a d e n a >>x1=y s t r ( 4 : 7 ) ; % Obtengo l o s 4 d i g i t o s c e n t r a l e s >>u1=s t r 2 n u m ( x1 ) ; % C o n v i e r t o l a c a d e n a a numero >>u1=u1 / 1 0 0 0 0 ; % D i v i d o p a r a o b t e n e r e l numero a l e a t o r i o e n t r e 0 y 1 Taller de Informática I 9 sept 2015 En Matlab/Octave En Matlab u Octave, hay funciones que generan números pseudoaleatorios, en especial, una de ellas genera números con distribución uniforme, tal como precisamos: rand () Podemos empezar por establecer una semilla, dado que de otro modo, se generará siempre la misma secuencia de números aleatorios. Para establecer la semilla se puede usar el reloj de la máquina: >> r a n d ( ’ s t a t e ’ , sum ( 1 0 0 ∗ c l o c k ) ) Ahora podemos generar un vector de valores pseudoaleatorios con distribución uniforme: >>u=r a n d ( 1 0 0 0 0 , 1 ) ; Podemos ver el histograma para chequear que la distribución es uniforme >> h i s t ( u ) ; Taller de Informática I 9 sept 2015 Simular experimentos Con la generación de números pseudoaleatorios podemos simular experimentos aleatorios como la tirada de un dado o de una moneda. Tomemos el ejemplo de la moneda. Precisamos asociar los sucesos elementales (cara/cruz) a intervalos disjuntos de (0,1). Por ejemplo cara será asociado al intervalo (0, 0.5) y cruz al intervalo (0.5, 1). Cada número aleatorio se transforma en un suceso elemental, preservando la probabilidad de que ocurra cada suceso. En este caso estamos diciendo que cara y cruz tienen la misma probabilidad. Podrı́a no ser ası́ si consideramos intervalos diferentes. Taller de Informática I 9 sept 2015 Programa sencillo para simular 100 tiradas de una moneda r a n d ( ’ s t a t e ’ , sum ( 1 0 0 ∗ c l o c k ) ) ; % genero l a s e m i l l a u=r a n d ( 1 0 0 , 1 ) ; % r e a l i z o l a s 100 t i r a d a s v ( 1 )=sum ( u <=0.5) % v ( 1 )= c a r a s v ( 2 )=sum ( u >0.5) % v ( 2 )= c e c a s b a r ( v ) % vemos que l a d i s t e s u n i f o r m e Taller de Informática I 9 sept 2015 Simulación d la tirada de un dado function n = r o l l d () n = c e i l ( r a n d ∗6 + e p s ) ; end eps es una constante muy pequeña y ceil una función de redondeo al mayor entero más cercano al número que se quiere redondear. Taller de Informática I 9 sept 2015 Desde lı́nea de comandos simplemente se invoca roll d y se obtiene el valor de un dado. Simulemos varias tiradas de un dado. Comencemos con 100 tiradas si la función es: r a n d ( ’ s t a t e ’ , sum ( 1 0 0 ∗ c l o c k ) ) f o r i =1:100 dado1 ( i )= r o l l d ; end ; %Contamos c u a n t a s v e c e s a p a r e c e cada n m e r o en un v e c t o r de 6 e l e m e n t o s v ( 1 )= sum ( dado1==1) ; v ( 2 )= sum ( dado1==2) ; v ( 3 )= sum ( dado1==3) ; v ( 4 )= sum ( dado1==4) ; v ( 5 )= sum ( dado1==5) ; v ( 6 )= sum ( dado1==6) ; % m u e s t r o en p a n t a l l a e l v e c t o r v % im pr i mo l a s v e c e s que s a l i \ ’ o cada n \ ’ umero . bar ( v ) Mostrar que a medida que se aumenta la cantidad de veces que se tira el dado, se logra un resultado más uniforme. Taller de Informática I 9 sept 2015 Ejercicio: Probar con 1000 y 100000 tiradas Ejercicio: Usando la función anterior, realizar un programa que arroje los valores de las tiradas de 2 dados simultáneamente una cantidad de veces. Realizar el histograma y ver como quedaron distribuidas las sumas Ayuda: Podemos usar un vector de 12 elementos (aunque sabemos que nunca la suma de ambos dados dará 1): r a n d ( ’ s t a t e ’ , sum ( 1 0 0 ∗ c l o c k ) ) v e c t o r=z e r o s ( 1 2 , 1 ) ; f o r i =1:100 dado1= r o l l d ; dado2= r o l l d ; v e c t o r ( dado1+dado2 )=v e c t o r ( dado1+dado2 ) +1; end ........(seguir...) Taller de Informática I 9 sept 2015 Ejercicio: Probar con 1000 y 100000 tiradas Recomendaciones para usar un generador de números aleatorios:1.2.3.4.5. Asegurarse de que el programa llama a la rutina de inicialización del generador antes de que ejecute el mismo. Usar semillas que son de alguna manera aleatoria. Por ejemplo, 2731774 y 10293082 son más seguros que 1 o 4096 (o de alguna otra potencia de 2). También dos semillas similares como 23612 y 23613 pueden producir secuencias correlacionadas. Nunca confiar en el generador de números aleatorios que viene con la computadora. Si es posible hacer comparaciones para la aplicación usando dos distintos generadores para verificar si ellos dan los mismos resultados desde el punto de vista estadı́stico. Al publicar los resultados especificar que generador de números aleatorios se usó(uniforme o normal). Taller de Informática I 9 sept 2015 Movimiento Browniano El movimiento browniano es el movimiento aleatorio que se observa en algunas partı́culas microscópicas que se hallan en un medio fluido (por ejemplo, polen en una gota de agua). Recibe su nombre en honor al escocés Robert Brown, biólogo y botánico que descubrió este fenómeno en 1827 y observó que pequeñas partı́culas de polen se desplazaban en movimientos aleatorios sin razón aparente. Por un momento pensó que se trataba de la vida que existı́a dentro del polen, sin embargo, repitió el experimento con diferentes partı́culas de polvo obteniendo resultados similares De sus observaciones y las de otros cientı́ficos se pudieron obtener un par de conclusiones: que las partı́culas presentaban mayor movimiento entre más pequeas fueran y que éste aumentaba también al incrementar la temperatura del lı́quido. A este tipo de movimiento azaroso se le dio el nombre de movimiento browniano en su honor. Taller de Informática I 9 sept 2015 Ejercicio: Simulación de la trayectoria de una parı́cula con movimiento browniano Definición: El movimiento browniano se define como un proceso estocástico B(t) : t > 0 satisfaciendo: B(0) = 0 B(t) es continuo o sea, las trayectorias del proceso son funciones continuas Si se fijan n instantes 0 ≤ t1 ≤ .. ≤ tn los incrementos B(tn ) − B(tn−1 ) − .. − B(t1 ) son variables aleatorias independientes y cada incremento B(t) − B(s) posee una distribución ∼ N (0, 1), para cualquier s≥0yt>0 Taller de Informática I 9 sept 2015 Realizar una función que simule el movimiento browniano de una partı́cula en un cierto fluido y graficar el resultado Realizar una función que simule el movimiento browniano de una partı́cula en un cierto fluido en una grilla delimitida por (−50 : 50, −50 : 50) y graficar el resultado. Para generar números aleatorios con distribución ∼ N (0, 1) usamos la función randn Para que esos números estén en el rango −N : N, N/3 ∗ r a n d n % donde N r e p r e s e n t a l a v a r i a c i o n ( v a r i a n z a ) de l o s N d a t o s Taller de Informática I 9 sept 2015 Parte 1: generar N valores, con distribución ∼ N (0, 1), y graficar en una grila entre (−50 : 50, −50 : 50) f u n c t i o n [ X , Y]= b r o w n i a n o (N) X( 1 ) =0; Y( 1 ) =0; k =1; w h i l e k<N X( k+1)=1+ f l o o r ( ( 5 0 / 3 ) ∗ r a n d n ) ; Y( k+1)=1+ f l o o r ( ( 5 0 / 3 ) ∗ r a n d n ) ; k=k +1; end end Desde lı́nea de comandos: N=20000; >> [ A , B]= b r o w n i a n o (N) ; >> a x i s ( [ − 5 0 , 5 0 , − 5 0 , 5 0 ] ) ; >> p l o t (A , B) >>g r i d on >> x l a b e l ( x ’ ) ; >> y l a b e l ( y ’ ) ; Taller de Informática I 9 sept 2015 Parte 2: entre partı́cula y partı́cula haya distancia hasta 1/N, a resolver en próxima clase Traer ideas!! Taller de Informática I 9 sept 2015 Modificar la función anterior para haya pensado en la parte 2 y que simule el movimiento browniano de n partı́culas en un cierto fluido y graficar el resultado 3 iteraciones Taller de Informática I 100 iteraciones 9 sept 2015 El código tiene estas entradas y salidas, sugerencias? f u n c t i o n [ X , Y]= Pbrowniano (N, P) end Taller de Informática I 9 sept 2015