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