Introducción a la simulación y a la generación de números

Anuncio
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
2010
Introducción a la simulación y a la generación de
números pseudoaleatorios
Introducción a la 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.
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
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
1
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
2010
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)
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…
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ías 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
2
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
2010
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:
a) Se toma un X0 como semilla, tal que X0 es entero y de 2n cifras (por ej: x0=3234)
b) Se calcula y como x02 (Ejemplo y=10458756)
c) 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)
d) El primer número pseudoaleatorio es y/ 102n (Ejemplo: 0.4587)
e) La nueva semilla es 4587, o sea, se comienza el procedimiento nuevamente para crear otro número pero
con la nueva semilla
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:
> ystr=num2str(y);
%Paso el número a cadena
>x1=ystr(4:7);
%Obtengo los 4 dígitos centrales
>u1=str2num(x1);
%Convierto la cadena a número
>u1=u1/10000;
%Divido para obtener el número
%aleatorio entre 0 y 1
Ejercicio(Optativo): Crear una función de Matlab que implemente el algoritmo “Mid Square” (Cuadrados Medios)
de Von Neumann. v=randomMidSquare(x0, n), donde x0 es la semilla inicial (3234), n es la cantidad de números
que se quieren generar (100) y v es el vector de números resultante. Para elegir la parte central de un número,
éste se puede transformar a string con num2str y luego de string a número con str2num.
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:
3
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
2010
> rand('state',sum(100*clock))
Ahora podemos generar un vector de valores pseusoaleatorios con distribución uniforme:
>u=rand(10000,1);
Podemos ver el histograma para chequear que la distribución es uniforme
>hist(u);
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). Así, 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
Con un simple programa podemos simular 100 tiradas de una moneda:
>rand('state',sum(100*clock));
>u=rand(100,1);
>v(1)=sum(u<=0.5)
>v(2)=sum(u>0.5)
>bar(v)
%genero la semilla
%realizo las 100 tiradas
%v(1)= caras
%v(2)= cecas
%vemos que la dist es uniforme
Con la siguiente función se puede simular la tirada de un dado:
function n = roll_d()
n = ceil(rand*6 + eps);
%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
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. El programita sería:
rand('state',sum(100*clock))
for i=1:100
dado1(i)=roll_d;
end;
%Contamos cuantas veces aparece cada número en un vector de 6 elementos
v(1)= sum(dado1==1);
v(2)= sum(dado1==2);
4
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
2010
v(3)= sum(dado1==3);
v(4)= sum( dado1==4);
v(5)= sum(dado1==5);
v(6)= sum(dado1==6);
%muestro en pantalla el vector
v
%imprimo las veces que salió cada número.
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.
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):
rand('state',sum(100*clock))
vector=zeros(12,1);
for i=1:100
dado1=roll_d;
dado2=roll_d;
vector(dado1+dado2)=vector(dado1+dado2)+1;
end
……..(seguir…)
Ejercicio: Probar con 1000 y 100000 tiradas
Recomendaciones para usar un generador de números aleatorios:
1. Asegurarse de que el programa llama a la rutina de inicialización del generador antes de que ejecute el
mismo.
2. 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.
3. Nunca confiar en el generador de números aleatorios que viene con la computadora.
4. 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.
5. Al publicar los resultados especificar que generador de números aleatorios se usó.
5
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
2010
Introducción a la Probabilidad
Historia
El objetivo de la Estadística es utilizar los datos para inferir sobre las características de una población a la que no
podemos acceder de manera completa. Es decir, a partir de la muestra se infiere sobre la población.
La Probabilidad es la disciplina científica que proporciona y estudia modelos para fenómenos aleatorios en los que
interviene el azar y sirve de soporte teórico para la Estadística.
La Teoría de la Probabilidad surgió de los estudios realizados sobre los juegos de azar, y estos se remontan miles
de años atrás. Como primeros trabajos con cierto formalismo cabe destacar los realizados por Cardano y Galilei
(siglo XVI), aunque las bases de esta teoría fueron desarrolladas por Pascal y Fermat en el siglo XVII.
De ahí en adelante grandes científicos han contribuido al desarrollo de la Probabilidad, como Bernouilli, Bayes,
Euler, Gauss,... en los siglos XVIII y XIX. Será a finales del siglo XIX y principios del XX cuando la Probabilidad
adquiera una mayor formalización matemática, debido en gran medida a la llamada Escuela de San Petesburgo en
la que cabe destacar los estudios de Tchebychev, Markov y Liapunov.
Experimento Aleatorio
Antes hablamos de experimentos aleatorios. Vamos a formalizar un poco más…
Definimos experimento aleatorio como aquel que verifique ciertas condiciones que nos permitan un estudio
riguroso del mismo.
Llamamos experimento aleatorio al que satisface los siguientes requisitos:
• Todos sus posibles resultados son conocidos de antemano.
• El resultado particular de cada realización del experimento es imprevisible.
• El experimento se puede repetir indefinidamente en condiciones idénticas.
El principal objetivo de un experimento aleatorio suele ser determinar con qué probabilidad ocurre cada uno de
los sucesos elementales. A continuación daremos una de las definiciones más manejadas para asignar
probabilidades a los sucesos.
Definición de Laplace o Regla de Laplace:
El caso más fácil es aquél en el que no tenemos razones para suponer que unos sucesos sean más probables que
otros. Cuando, siendo el espacio muestral finito, todos los sucesos elementales tienen la misma probabilidad,
diremos que son equiprobables y podremos utilizar la conocida Regla de Laplace:
P(A) = casos favorables/casos posibles
6
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
2010
Empecemos con algo simple:
Tiramos una moneda, ¿cuál es la probabilidad de obtener cara?
Realizando la fórmula anterior:
P(A)= P(X=’cara’)= ½ = 0.5
Ejemplo 5: Lanzamos dos dados y sumamos sus puntuaciones. ¿Cuál es la probabilidad de obtener un 2?, ¿y de
obtener un 6?
Entonces:
P(A)=P(X+Y=2) = 1/36 = 0.027
P(A)=P(X+Y=6) = 5/36 = 0.138
Ejercicio: Lanzamos dos dados y anotamos sus puntuaciones. Calcula la probabilidad de que:
a) Salga un número igual y par en cada dado.
b) Salgan números menores que 5 en cada dado.
Ejercicio: Lanzamos tres monedas y anotamos los resultados. Calcula la probabilidad de que:
a) Salgan dos caras y una cruz.
b) Salgan tres caras.
Simulemos en Matlab la extracción al azar 1000 veces una bola de una caja donde hay 10 bolas numeradas del 1
al 10, y guardamos los resultados en un vector (hacer algo parecido a lo realizado para los dados):
a) ¿Cuál es la frecuencia absoluta de 8?
b) Calcula las frecuencias relativas de cada suceso.
c) Estima la probabilidad de extraer un 7.
7
Taller de Informática I
Dpto. Computación – F.C.E. y N. - UBA
2010
La frecuencia absoluta es el número de veces que aparece la variable (en este caso el número 8) y eso lo tenemos
en el vector, en el lugar 8, o sea balls(8)=113
La frecuencia relativa se obtiene realizando el cociente entre la frecuencia absoluta y el tamaño de la muestra. En
nuestro caso haríamos balls/1000 y obtendríamos:
La frecuencia relativa es más o menos el mismo valor que la probabilidad, entonces la probabilidad de extraer un
7 es de 0.105
Ejercicio completo:
Supóngase que se tiene un terreno de 100 m2 y se lo divide en cuadrados de 1m2
Se sabe que debajo de ese terreno hay agua pero no se sabe a qué profundidad. A su vez, el suelo es rocoso, de
modo que puede pasar que donde haya agua a menos profundidad sea más difícil de cavar que donde sea más
profundo. Todo este tema, se tiene estimado en dos vectores. Si bien hay métodos para estimar la profundidad
del suelo, nosotros lo simularemos generando números pseudoaleatorios de entre 25 y 55 que corresponden al
rango de profundidades que podemos hallar en metros. Con respecto a la dificultad para cavar lo que hacemos es
tirar un dado y su valor será el grado de dificultad al cavar que se guardará en un segundo vector. O sea en un
vector prof tendremos la profundidad para cada metro cuadrado y en un vector dif se tendrá por cada m2 la
dificultad de 1 a 6 para cavar. Generar estos vectores aleatoriamente.
a) Mostrar el histograma de profundidades y el histograma de dificultades
b) ¿Qué probabilidades hay de cavar en un sitio poco profundo y con poco grado de dificultad? Se entiende
por sitio poco profundo si tiene menos de 32 metros y poco dificultoso si el grado de dificultad es menor
a 3.
8
Descargar