Simulación Numérica

Anuncio
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
Descargar