Download Introduccion a la Simulacion y a la Generacion de Datos

Document related concepts

Generador de números pseudoaleatorios wikipedia , lookup

Integración de Montecarlo wikipedia , lookup

Ecualización del histograma wikipedia , lookup

Histograma wikipedia , lookup

Distribución uniforme continua wikipedia , lookup

Transcript
Introduccion a la Simulacion y a la
Generacion de Datos Pseudoaleatorios
Departamento de Computación
Facultad de Ciencias Exactas y Naturales
Universidad de Buenos Aires
Taller de Informática I - 1er Cuatrimestre 2014
Andrea Manna
Definició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
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)
Simulación en Ciencias Geológicas:
Para que?
Existen múltiples aéreas de la investigación en Ciencias de la Tierra, así
como de su aplicación, que recurren intensivamente a la simulación por
computadora y, en algunos casos, no serían posibles en absoluto sin ella.
 Tectónica de placas.
 Movimiento de fallas
 Predicciones:
 Erupción de un volcán
 Desbordamiento de ríos
 Terremotos
 Geología de combustibles fósiles:
 Petróleo: prospección y perforación
 Gas
 Exploración minera
 Recursos naturales (preservación)
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)
Origen
 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.
Introducción a la generación de
números pseudoaleatorios
 Se denomina variable aleatoria discreta aquella que sólo
puede tomar un número finito de valores dentro de un intervalo.
Ejemplo: el resultado de lanzar un dado o una moneda
 Una variable aleatoria discreta X se dice que es uniforme en
el intervalo [1,n] si la probabilidad de ocurrencia es la misma para
cada posible valor de la variable. Es decir,
P[X=j] = 1/n para j=1,…n.
 Casi todos los métodos de simulación se basan en la posibilidad de
crear números aleatorios con distribución U(0,1).
 Dato: Hasta la aparición de las computadoras, los números
aleatorios se obtenías de procedimientos experimentales como
lotería o ruleta y se almacenaban en tablas.
Método del Cuadrado Medio
 Es uno de los métodos más clásicos y más simples de generación
de números pseudoaleatorios.
 Fue creado por Von Neumann en 1940. 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.
2.
3.
4.
5.
Se toma un X0 como semilla, tal que X0 es entero y de 2n cifras
(por ej: x0=3234)
Se calcula y como x02 (Ejemplo y=10458756)
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)
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
Métodos por computadora
 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:
1.
2.
3.
4.
5.
6.

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
Ejemplo propuesto por Anderson en 1990, basado en el reloj de la
computadora:
X0=iyear+100*(imonth-1 +12*(iday-11+31*(ihour+24*(imin-60*isec))))
Métodos por computadora
 En Matlab, se utiliza la función rand() para generar números
pseudoaleatorios. La sintaxis es la siguiente:
R=rand(n)
% Genera una matriz de NxN de numeros pseudoaleatorios
entre 0 y1
R=rand(m,n) % Genera una matriz de mxn
R=rand
% Genera un solo número pseudoaleatorio entre 0 y 1
 Así, podemos entonces simular la tirada de una moneda utilizando esta
función de Matlab. Sabemos que hay dos posibles resultados para esto:
Cara ó Ceca, o sea, la probabilidad para cada valor es 0.5
 Dividimos el intervalo [0,1] del siguiente modo: Si al utilizar rand nos da
una valor menor a 0.5, decimos que salió Cara. De otro modo, salió Ceca
Ejemplo
function s = moneda(n)
% función que simula n tiradas de una moneda.
% el vector s retorna 1 si sale Cara y 0 si sale Ceca
s = [];
for i =1:n
m =rand(); %también puede ser m=rand;
if m < 0.5
s = [s 1];
else
s = [s 0];
end
end
end
Histograma
 Un histograma es una representación gráfica de una variable
en forma de barras.
 La superficie de cada barra es proporcional a la frecuencia de
los valores representados.
 En el eje vertical se representan las frecuencias, y en el eje
horizontal los valores de las variables, normalmente
señalando las marcas de clase, es decir, la mitad del intervalo
en el que están agrupados los datos.
 Se utiliza cuando se estudia una variable continua, como
franjas de edades o altura de la muestra, y, por comodidad,
sus valores se agrupan en clases, es decir, valores continuos.
Histograma
 Ejemplo:
Histograma
 En Matlab:
>> v=[12 19 25 26 32 18 33 27 34 28 35 21 36 29 23 37 30
33 14 36 26 34 13 37 28 34 30 32 31 33 15 44 29 48 16
31 13 27 28 25 ]
9
8
>> hist(v)
7
6
5
4
3
2
1
0
10
15
20
25
30
35
40
45
50
Histograma
>>centers= [14 21 28 35 42 49]
>>hist(v,centers)
15
10
5
0
14
21
28
35
42
49
Ejemplo
 Desde la línea de comandos de Matlab:
>> m= moneda(100); % Simulamos la tirada de 100
monedas
 ¿Cómo podemos visualizar la distribución de las tiradas? Para
eso utilizamos la función hist(m)
>> N = hist(Y)
% Toma cada elemento del vector Y y lo
ubica en alguna columna de las 10
disponibles
En nuestro caso, realizamos 100 tiradas de una moneda y
tenemos dos resultados posibles dentro del vector: 0 ó 1
Ejemplo
Realizamos hist(m) y vemos lo que sucede…
60
El intervalo [0,1] se divide en 10
partes y se ubican en la primera
barra todos los valores 0 del vector y
en la segunda todos los valores 1
50
40
30
20
10
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Como vemos, no parece tan
uniforme….
Esto es porque sólo realizamos 100
tiradas. A medida que el número de
muestras sea mayor, el resultado se
acerca más a la uniformidad.
En este caso, marcamos los centros:
>>centers= [0.25 0.75]
>>hist(m,centers)
Ejemplo
Repetimos el experimento para 10000 tiradas
6000
En este ejemplo se puede
observar como de 10000 tiradas
tenemos un resultado uniforme
donde la mitad de las tiradas
corresponde al valor 1 (cara) y
la otra mitad al valor 0 (ceca)
En
este
caso
usamos
directamente el comando
hist(m) sin determinar los
centros, con lo cual el intervalo
(0,1) se dividió en 10 partes
iguales
5000
4000
3000
2000
1000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Ejemplo 2
 ¿Como hacemos para simular la tirada de un dado? En este
caso, tenemos 6 valores posibles que deben tener la misma
probabilidad de salir, o sea 1/6
 En general, para generar un número pseudoaleatorio entre a
y b la fórmula a aplicar es la siguiente:
r = a + (b-a).*rand;
En el caso del dado, el intervalo es [1,6], por lo que la
fórmula se reduce a:
r = 1 + 5.*rand
Con esta fórmula, generamos un numero al azar entre 1 y
6 pero en decimal!!!
Ejemplo 2
 En Matlab hay varias funciones para transformar un decimal a
un entero:
 ceil(x)
% Redondea x al entero siguiente. Ejemplo:
>>ceil(3.5)
ans
4
>>ceil(3.1)
ans
4
Ejemplo 2
 floor(x)
>>floor(3.5)
ans
3
>>floor(3.1)
ans
3
>>floor(3.75)
ans
3
% Redondea x al entero anterior. Ejemplo:
Ejemplo 2
 Con estos datos, volvamos a la función para generar un número
entero entre 1 y 6 para lanzar dados. Teníamos:
r = 1 + 5.*rand
Que generaba un número entre 1 y 6 pero decimal. Ahora, vamos
a usar funciones de truncamiento. Usamos floor:
r = 1 + floor(5.*rand)
Si lo dejamos así, dado que floor redondea siempre “hacia abajo”,
se generarán números entre 1 y 5. Hacemos un pequeño cambio:
r = 1 + floor(6.*rand)
Si queremos generar 100 números al azar entre 1 y 6 hacemos:
r = 1 + floor(6.*rand(100,1))
Ejemplo 2
 Vamos a probar que con esa función obtenemos una lista de
números con distribución uniforme. Para eso “tiramos” el
dado unas 100000 veces:
>> r = 1 + floor(6.*rand(100000,1));
>>hist(r)
18000
16000
14000
12000
10000
8000
6000
4000
2000
0
1
1.5
2
2.5
3
3.5
4
4.5
5
5.5
6
Nota al margen
 El comando rand genera números entre 0 y 1. Pero no están incluidos ni el cero ni el 1.
 Por lo tanto con la fórmula anterior para simular la tirada de un dado, no corremos
riesgo de generar el valor 7.
 De todas maneras, si tuviéramos que excluir valores de un vector, podemos usar el
comando find:
>>I = find(X)
%Si X es un vector, retorna en I un vector con los índices de los elementos
de X. Ejemplo:
>>X=[13 5 7 89 1]
>>I=find(X)
I=[1 2 3 4 5]

El parámetro de find puede ser una expresion lógica:
>>I=find(X<10)
%Queremos buscar todos los índices del vector X que correspondan a los
elementos menores a 10
I=[2 3 5]
>> Y=X(I)
Y=[5 7 1]
%Estamos construyendo un nuevo vector Y con los valores de menores a 10
Números pseudoaleatorios
 Ventajas:
 La sucesión generada es reproducible, usando la misma semilla.
 Longitud arbitraria de la secuencia.
 En general son algoritmos rápidos.
 Consume poca memoria.
 Desventajas:
 La distribución no es estrictamente uniforme.
 Claramente, a partir de cierto valor, los números comenzaran a
repetirse.
Números pseudoaleatorios
Probamos diferentes distribuciones:
function [u1, u2] = pruebaDist(N)
u1 = rand(N,1); %probar con N=10000 o más
subplot(1,2,1)
hist(u1)
title('Histograma Distribución Uniforme');
end
u2=randn(N,1);
subplot(1,2,2)
hist(u2)
title('Histograma Distribución Normal');
Números pseudoaleatorios
12
4
x 10Histograma Distribución Uniforme
4
5
x 10 Histograma Distribución Normal
3.5
10
3
8
2.5
6
2
1.5
4
1
2
0.5
0
0
0.2
0.4
0.6
0.8
1
0
-10
-5
0
5
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 pequeñas 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.
Ejercicio: Trayectoria de una partícula
con movimiento browniano
 Definicion: 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
 Fijados n instantes 0<= t1<=….<=tn los incrementos Btn – Btn-1
- ….- Bt1 son variables aleatorias independientes y cada
incremento Bt – Bs posee una distribución ~N(0, 1), para
cualquier s>=0 y t>0.
Ejercicio: Trayectoria de una partícula
con movimiento browniano
 Realizar una función que simule el movimiento browniano
de una partícula en un cierto fluido y graficar el resultado
1
0.5
xn
0
-0.5
-1
-1.5
-2
-0.2
0
0.2
0.4
0.6
0.8
n
1
1.2
1.4
1.6
1.8
Codigo Matlab
function [X,Y]= browniano(N)
deltax=1/N;
X(1)=0;
Y(1)=0;
for i=2:N
dW =sqrt(deltax)*randn;
X(i)=X(i-1)+ dW;
dW =sqrt(deltax)*randn;
Y(i)=Y(i-1)+ dW;
end
Desde línea de comandos:
>> [x, y]=browniano(1000);
>>plot(x,y)
>>grid on
>>xlabel(‘x');
>>ylabel(‘y');
Ejercicio: Trayectoria de una partícula
con movimiento browniano
 Modificar la función anterior para que simule el
movimiento browniano de n partículas en un cierto
fluido y graficar el resultado
1.5
4
3
1
2
0.5
xn
xn
1
0
0
-0.5
-1
-1
-1.5
-0.5
-2
0
0.5
1
n
3 partículas
1.5
2
2.5
-3
-2.5
-2
-1.5
-1
-0.5
0
n
0.5
100 partículas
1
1.5
2
2.5
Codigo Matlab
function [X,Y]= Pbrowniano(N,P)
deltax=1/N;
for part=1:P
X(1,part)=0;
Y(1,part)=0;
for i=2:N
dW =sqrt(deltax)*randn;
X(i,part)=X(i-1,part)+ dW;
dW =sqrt(deltax)*randn;
Y(i,part)=Y(i-1,part)+ dW;
end
end
Desde línea de comandos:
>> [x, y]= Pbrowniano(1000,3);
>>plot(x,y)
>>grid on
>>xlabel(‘x');
>>ylabel(‘y');
Ejercicios de repaso
 Generar N números al azar entre 0 y 1 y hacer un histograma con los resultados






(rand)
¿Que representa la altura del histograma?
En el primer ejercicio, ¿Por que si la distribución es uniforme el diagrama se ve
irregular? ¿Qué pasa si aumentan el N?
¿Qué intervalo representa el ancho de cada barra? Si tiene dudas, busque en la ayuda
de Matlab la función hist.
Realice el mismo ejercicio con randn¿ Qué diferencias observa entre ambos tipos de
distribución?
¿Cómo haría para generar números al azar entre 0 y 15? ¿y entre -3 y 2? Hacerlo y
construir nuevos histogramas. Ayuda: Utilice la misma función rand y expanda el
resultado apropiadamente. Si es necesario, vea uno de los ejemplos de la Ayuda de
Matlab para la función rand
Modificar la función browniano(n) para que dibuje la simulacion en 3D