Sei sulla pagina 1di 33

Introduccion a la Simulacion y a la

Generacion de Datos Pseudoaleatorios


Departamento de Computacin
Facultad de Ciencias Exactas y Naturales
Universidad de Buenos Aires

Taller de Informtica I - 1er Cuatrimestre 2014

Andrea Manna
Definicin
Es el proceso de disear un modelo de un
sistema real, que servir para dirigir
experimentos con el propsito de
entender el comportamiento del sistema
o evaluar nuevas estrategias dentro de
los lmites impuestos por un cierto
criterio o un conjunto de ellos para el
funcionamiento del sistema (R.E.
Shannon)
Simulacin en Ciencias Geolgicas:
Para que?
Existen mltiples areas de la investigacin en Ciencias de la Tierra, as
como de su aplicacin, que recurren intensivamente a la simulacin por
computadora y, en algunos casos, no seran posibles en absoluto sin ella.
Tectnica de placas.
Movimiento de fallas
Predicciones:
Erupcin de un volcn
Desbordamiento de ros
Terremotos
Geologa de combustibles fsiles:
Petrleo: prospeccin y perforacin
Gas
Exploracin minera
Recursos naturales (preservacin)
Experimentacin Real y Simulacin
La experimentacin 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 estn involucrados
seres humanos)
Puede resultar imposible (por ejemplo para predecir sucesos
futuros)
Origen
La construccin de modelos tiene su origen en la poca del
renacimiento, aunque la palabra Simulacin aparece cerca de 1940,
cuando los cientficos Von Neumann y Stanislau Ulam, que trabajaban en
el proyecto Montecarlo, durante la Segunda Guerra Mundial. El
proyecto consista en desarrollar la primera bomba atmica antes que
Alemania. Trabajaron en conjunto muchos cientficos de EEUU, Reino
Unido y Canad, entre ellos Albert Einstein.
En el proyecto se hizo referencia a la simulacin Montecarlo o mtodo
Montecarlo. Se trata de un mtodo usado para aproximar expresiones
matemticas complejas y costosas de evaluar con exactitud. El mtodo se
llam as en referencia al Casino de Montecarlo, por ser la capital de los
juegos de azar y por ser la ruleta el mtodo ms simple de generacin de
nmeros aleatorios. Con la utilizacin de las computadoras en los
experimentos de simulacin, surgieron muchsimas aplicaciones y
adems una mayor cantidad de problemas tericos y prcticos.
Introduccin a la generacin de
nmeros pseudoaleatorios
Se denomina variable aleatoria discreta aquella que slo
puede tomar un nmero 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 mtodos de simulacin se basan en la posibilidad de
crear nmeros aleatorios con distribucin U(0,1).
Dato: Hasta la aparicin de las computadoras, los nmeros
aleatorios se obtenas de procedimientos experimentales como
lotera o ruleta y se almacenaban en tablas.
Mtodo del Cuadrado Medio
Es uno de los mtodos ms clsicos y ms simples de generacin
de nmeros pseudoaleatorios.
Fue creado por Von Neumann en 1940. La tcnica parte desde una
semilla inicial, un nmero 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 dgitos centrales. Este nmero servir para formar
el primer nmero y para continuar calculando nmeros
pseudoaleatorios (Ejemplo: 4587)
4. El primer nmero pseudoaleatorio es y/102n (Ejemplo: 0.4587)
5. La nueva semilla es 4587, o sea, se comienza el procedimiento
nuevamente para crear otro nmero pero con la nueva semilla
Mtodos por computadora
Los nmeros generados por computadora se llaman nmeros
pseudoaleatorios, dado que son predecibles a partir del primer nmero
denominado semilla
Para poder utilizar un generador automtico de nmeros
pseudoaleatorios, ste debe cumplir con ciertas propiedades:
1. Producir muestras segn la distribucin U(0,1)
2. Pasar los contrastes de aleatoriedad e independencia ms habituales
3. Que la sucesin generada sea reproducible a partir de la semilla
4. Tener una longitud de ciclo tan grande como se desee
5. Generar valores a alta velocidad
6. 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))))
Mtodos por computadora
En Matlab, se utiliza la funcin rand() para generar nmeros
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 nmero pseudoaleatorio entre 0 y 1

As, podemos entonces simular la tirada de una moneda utilizando esta


funcin 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)
% funcin 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(); %tambin puede ser m=rand;
if m < 0.5
s = [s 1];
else
s = [s 0];
end
end
end
Histograma
Un histograma es una representacin grfica 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
sealando las marcas de clase, es decir, la mitad del intervalo
en el que estn 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

>> hist(v) 7

0
10 15 20 25 30 35 40 45 50
Histograma
>>centers= [14 21 28 35 42 49]
>>hist(v,centers)
15

10

0
14 21 28 35 42 49
Ejemplo
Desde la lnea de comandos de Matlab:
>> m= moneda(100); % Simulamos la tirada de 100
monedas
Cmo podemos visualizar la distribucin de las tiradas? Para
eso utilizamos la funcin 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
50 partes y se ubican en la primera
barra todos los valores 0 del vector y
40 en la segunda todos los valores 1

30 Como vemos, no parece tan


uniforme.
20 Esto es porque slo realizamos 100
tiradas. A medida que el nmero de
10 muestras sea mayor, el resultado se
acerca ms a la uniformidad.
0
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
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
5000
observar como de 10000 tiradas
tenemos un resultado uniforme
4000
donde la mitad de las tiradas
corresponde al valor 1 (cara) y
3000
la otra mitad al valor 0 (ceca)
En este caso usamos
2000
directamente el comando
hist(m) sin determinar los
1000
centros, con lo cual el intervalo
(0,1) se dividi en 10 partes
0
iguales
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 nmero pseudoaleatorio entre a
y b la frmula a aplicar es la siguiente:
r = a + (b-a).*rand;
En el caso del dado, el intervalo es [1,6], por lo que la
frmula se reduce a:
r = 1 + 5.*rand
Con esta frmula, 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) % Redondea x al entero anterior. Ejemplo:
>>floor(3.5)
ans
3
>>floor(3.1)
ans
3
>>floor(3.75)
ans
3
Ejemplo 2
Con estos datos, volvamos a la funcin para generar un nmero
entero entre 1 y 6 para lanzar dados. Tenamos:
r = 1 + 5.*rand
Que generaba un nmero 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 generarn nmeros entre 1 y 5. Hacemos un pequeo cambio:
r = 1 + floor(6.*rand)
Si queremos generar 100 nmeros al azar entre 1 y 6 hacemos:
r = 1 + floor(6.*rand(100,1))
Ejemplo 2
Vamos a probar que con esa funcin obtenemos una lista de
nmeros con distribucin 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 nmeros entre 0 y 1. Pero no estn incluidos ni el cero ni el 1.
Por lo tanto con la frmula anterior para simular la tirada de un dado, no corremos
riesgo de generar el valor 7.
De todas maneras, si tuviramos 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 parmetro de find puede ser una expresion lgica:
>>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) %Estamos construyendo un nuevo vector Y con los valores de menores a 10
Y=[5 7 1]
Nmeros pseudoaleatorios
Ventajas:
La sucesin generada es reproducible, usando la misma semilla.
Longitud arbitraria de la secuencia.
En general son algoritmos rpidos.
Consume poca memoria.
Desventajas:
La distribucin no es estrictamente uniforme.
Claramente, a partir de cierto valor, los nmeros comenzaran a
repetirse.
Nmeros pseudoaleatorios
Probamos diferentes distribuciones:

function [u1, u2] = pruebaDist(N)


u1 = rand(N,1); %probar con N=10000 o ms
subplot(1,2,1)
hist(u1)
title('Histograma Distribucin Uniforme');

u2=randn(N,1);
subplot(1,2,2)
hist(u2)
title('Histograma Distribucin Normal');
end
Nmeros pseudoaleatorios
4 5
x 10Histograma Distribucin Uniforme x 10 Histograma Distribucin Normal
12 4

3.5
10

8
2.5

6 2

1.5
4

2
0.5

0 0
0 0.2 0.4 0.6 0.8 1 -10 -5 0 5
Movimiento Browniano
El movimiento browniano es el movimiento aleatorio que se
observa en algunas partculas microscpicas que se hallan en un medio
fluido (por ejemplo, polen en una gota de agua).
Recibe su nombre en honor al escocs Robert Brown, bilogo y
botnico que descubri este fenmeno en 1827 y observ que
pequeas partculas de polen se desplazaban en movimientos aleatorios
sin razn aparente.
Por un momento pens que se trataba de la vida que exista dentro del
polen, sin embargo, repiti el experimento con diferentes partculas de
polvo obteniendo resultados similares
De sus observaciones y las de otros cientficos se pudieron obtener un
par de conclusiones: que las partculas presentaban mayor movimiento
entre ms pequeas fueran y que ste aumentaba tambin al
incrementar la temperatura del lquido. A este tipo de movimiento
azaroso se le dio el nombre de movimiento browniano en su honor.
Ejercicio: Trayectoria de una partcula
con movimiento browniano
Definicion: El movimiento browniano se define como un
proceso estocstico 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 distribucin ~N(0, 1), para
cualquier s>=0 y t>0.
Ejercicio: Trayectoria de una partcula
con movimiento browniano
Realizar una funcin que simule el movimiento browniano
de una partcula en un cierto fluido y graficar el resultado
1

0.5

0
xn

-0.5

-1

-1.5

-2
-0.2 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8
n
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 lnea de comandos:


>> [x, y]=browniano(1000);
>>plot(x,y)
>>grid on
>>xlabel(x');
>>ylabel(y');
Ejercicio: Trayectoria de una partcula
con movimiento browniano
Modificar la funcin anterior para que simule el
movimiento browniano de n partculas en un cierto
fluido y graficar el resultado
1.5 4

3
1

2
0.5

1
xn

xn
0
0

-0.5
-1

-1
-2

-1.5 -3
-0.5 0 0.5 1 1.5 2 2.5 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5
n n
3 partculas 100 partculas
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 lnea de comandos:
>> [x, y]= Pbrowniano(1000,3);
>>plot(x,y)
>>grid on
>>xlabel(x');
>>ylabel(y');
Ejercicios de repaso
Generar N nmeros 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 distribucin 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 funcin hist.
Realice el mismo ejercicio con randn Qu diferencias observa entre ambos tipos de
distribucin?
Cmo hara para generar nmeros al azar entre 0 y 15? y entre -3 y 2? Hacerlo y
construir nuevos histogramas. Ayuda: Utilice la misma funcin rand y expanda el
resultado apropiadamente. Si es necesario, vea uno de los ejemplos de la Ayuda de
Matlab para la funcin rand
Modificar la funcin browniano(n) para que dibuje la simulacion en 3D

Potrebbero piacerti anche