Reporte pr1

11
 1 Reporte primera práctica 8 de febrero del 2012 Autor: Del Castillo Hoffman Guillermo Miguel 2093307 71 ÍNDICE Parte 1 1 Introducción 1 Código fuente 2 Impresiones de pantalla 3 Observaciones y comentarios 5 Parte 2, Utilización de un generador congruencial lineal 6 Observaciones y conclusiones 7 Código fuente 8 Impresión de pantalla 9 Parte 1 Introducción Esta pa rte de la pr ác ti ca consis te en la impl ementa ci ón de un ge nerado r de meros pseudoaleatorios del tipo congruencial lineal, siendo éste desarrollado bajo VBA en Excel. Dicho algoritmo generador de números pseudoaleatorios (PRNG por sus siglas en inglés) es uno de los más antigüos y mejor conocidos. Es fácilmente implementable y rápido computacionalmente. Se utiliza ampliamente en varios compiladores y librerías runtime como generador dentro de las funciones rand(). Se define a este generador mediante la siguiente función recursiva: Xn=aXn-1+c mod m , Xn , a , c , m Z , Xn[0 , m-1] Dado que dicho generador será utilizado para simulaciones que involucran variables aleatorias probabilísticas, se procurará que el rango de los números aleatorios esté entre cero y uno mediante el siguiente cálculo:

Transcript of Reporte pr1

5/13/2018 Reporte pr1 - slidepdf.com

http://slidepdf.com/reader/full/reporte-pr1 1/11

 

Reporte primera práctica 8 de febrerodel 2012

Autor:

Del Castillo Hoffman GuillermoMiguel

209330771

ÍNDICE

Parte 1 1

Introducción 1

Código fuente 2

Impresiones de pantalla 3

Observaciones y comentarios 5

Parte 2, Utilización de un generador

congruencial lineal

6

Observaciones y conclusiones 7

Código fuente 8

Impresión de pantalla 9

Parte 1

Introducción

Esta parte de la práctica consiste en la implementación de un generador de núme

pseudoaleatorios del tipo congruencial lineal, siendo éste desarrollado bajo VBA en Excel.

Dicho algoritmo generador de números pseudoaleatorios (PRNG por sus siglas en inglés) es u

de los más antigüos y mejor conocidos. Es fácilmente implementable y rápcomputacionalmente. Se utiliza ampliamente en varios compiladores y librerías runtime com

generador dentro de las funciones rand().

Se define a este generador mediante la siguiente función recursiva:

Xn=aXn-1+c mod m , Xn , a , c , m ∈ Z , Xn∈[0 , m-1]

Dado que dicho generador será utilizado para simulaciones que involucran variables aleator

probabilísticas, se procurará que el rango de los números aleatorios esté entre cero y u

mediante el siguiente cálculo:

5/13/2018 Reporte pr1 - slidepdf.com

http://slidepdf.com/reader/full/reporte-pr1 2/11

 

Un= Xnm → 0 ≤ Un <1

Se probarán cuatro juegos de los parámetros a , c , m mencionados anteriormente, utilizan

como X0=389 en todos los casos:

• Caso 1: a = 25214903917, c = 11 y m = 248 (parámetros de Java)

Caso 2: a = 1103515245, c = 12345 y m = 2

32

(parámetros deGCC

)• Caso 3: a = 237, c = 0 y m = 18989

• Caso 4: a = 37, c = 3 y m = 1283

Se generarán en cada caso 10,000 números aleatorios y, de la misma manera, en cada caso

graficará Uj+1=f(Uj) con el propósito de indicar la calidad de la aleatoriedad simulada en

cuatro juegos de parámetros.

Código fuente

Option Explicit

Dim i As Long 'Índice utilizado en los ciclos, variable global.

Sub Main()

Dim N As Long 'Dimensión del vector resultante, cantidad de PRGN aleatorios.Dim PRGN() As Double 'Vector resultante donde se contendrán los PRGNs.

 'Input

 N = InputBox("Introduce la cantidad de PRGNs a generar")

 ReDim PRGN(N) As Double

 Call RutLCG(N, PRGN())

 'Output

 For i = 1 To N

Cells(i + 1, 4).Value = PRGN(i)Next i

 For i = 1 To 20

Cells(i + 1, 2).Value = PRGN(i)Cells(i + 1, 1).Value = i

Next i 

MsgBox ("La ejecución ha finalizado exitosamente. Ver hoja de cálculo con los resultados") End Sub

'Rutina de Generador Congruencial Lineal (LCG)Sub RutLCG(N As Long, Vector() As Double) 

Dim a As Double, c As Double, m As Double 'Parámetros del LCG.Dim Xo As Integer 'Semilla de la fórmula de un LCG.Dim Xold As Double, Xnew As Double 'Variables para las iteraciones de la generación de PRGNs.Dim Cociente As Double 'Variable utilizada en la función módulo si no se están usando enteros

 'Inputsa = InputBox("Introducir el valor de 'a'")c = InputBox("Introducir el valor de 'c'")m = InputBox("Introducir el valor de 'm'")Xo = InputBox("Introducir el valor de 'Xo'")

 

5/13/2018 Reporte pr1 - slidepdf.com

http://slidepdf.com/reader/full/reporte-pr1 3/11

 

Xold = Xo 

For i = 1 To N 

Cociente = Int((a * Xold + c) / m)Xnew = (a * Xold + c) - (Cociente * m)'Xnew = ((a * Xold) + c) Mod m '(Función de módulo directa, no utilizada).Vector(i) = (Xnew / m)Xold = Xnew

 Next i

 End Sub

Impresiones de pantalla

5/13/2018 Reporte pr1 - slidepdf.com

http://slidepdf.com/reader/full/reporte-pr1 4/11

 

5/13/2018 Reporte pr1 - slidepdf.com

http://slidepdf.com/reader/full/reporte-pr1 5/11

 

Observaciones y comentarios

Sobre los casos 1 y 2, se observa que no es inmediatamente discernible un patrón en

imágenes. Es difícil concluir qué conjunto de parámetros es más eficaz. Aparentemente en

caso 1 los puntos tienden a concentrarse más entre ellos, dejando espacios en blanco m

grandes –observación que puede ser indicativa de un patrón; tanto que en el caso 2

distribución aleatoria de puntos aparenta mayor uniformidad.

Es importante mencionar que en el caso 1 al declarar las variables correspondientes a

parámetros como enteras (LongLong en el caso de Visual Basic, el entero de mayor capacid

disponible) se produce un overflow al realizar el cálculo de la función recursiva, obligando

declarar los parámetros como Double  aunque los resultados de los cálculos sean núme

enteros. En el caso 2, sin embargo, se puede mantener la declaración de variables coLongLong sin que esto sucite un desbordamiento, evitando entonces desperdicio de memoria

los cálculos y con la conveniencia de que no se tiene que programar la función módulo y

permite utilizar la función mod de VB dado que sólo es válido utilizarla con valores enteros. Pa

propósitos prácticos, se deja el código fuente con los parámetros declarados como Double.

Sobre los casos 3 y 4, es evidente tanto la aparición de patrones geométricos formados por

puntos como la repetición de los números pseudoaleatorios, dado que a pesar de segui

generando diez mil números, sólo se ven unos cuántos en la gráfica. Se debe notar que

aparente una mayor aleatoriedad en el caso 3 aunque hay una menor cantidad de puntos.

5/13/2018 Reporte pr1 - slidepdf.com

http://slidepdf.com/reader/full/reporte-pr1 6/11

 

nota una alineación de los puntos en un sentido diagonal hacia ambos lados, sin embargo

otros ejes las líneas son menos notorias. Tal vez algunas líneas curvas se puedan inferir de

imagen pero es difícil determinar si son un patrón.

En el caso 4 es muy notoria la alineación de todos los puntos en sentidos horizontal, vertica

diagonal hacia ambos lados, siguiendo un patrón casi isométrico. No se nota ninguna suces

que aproxime una curva y es evidente que se puede inferir la posición de todos los puntgenerados con guías de líneas rectas. En el único apartado donde aparenta ser superior es

configuración de parámetros con respecto al caso 3 es en la menor cantidad de pun

repetidos.

Por su mayor calidad aparente de aleatoriedad y por la posibilidad de ser implementado c

menor uso de memoria y facilitando la programación, se utilizarán los parámetros de GCC (ca

2).

5/13/2018 Reporte pr1 - slidepdf.com

http://slidepdf.com/reader/full/reporte-pr1 7/11

 

Parte 2

Utilización del generador congruencial lineal

Esta parte consiste en resolver el ejercicio siguiente:

“El peso de los costales de cemento saliendo de una planta es una variable aleatoria

uniformemente distribuida entre los valores extremos 18.64 y 20.98 (kg). Realice un estudio

simulación para calcular la media y la desviación estándar del peso de los costales. Para e

utilice el generador de números pseudoaleatorios implementado en la parte anterior pa

generar 4,000 valores de  X . Deduzca de estos números los valores de la media y la desviac

estándar de la variable aleatoria X . ¿Estos resultados corresponden a los valores teóricos?”

Los valores teóricos antes mencionados corresponden a las definiciones de media y desviac

estándar de la distribución uniforme de probabilidad. Los valores experimentales se considerar

la media muestral como la suma de todas las muestras simuladas dividido entre el número ellas y a la desviación estándar como la raíz cuadrada de la varianza muestral. De mane

automática se obtuvieron ambos datos muestrales mediante funciones de Excel.

 También se pide realizar la simulación con diferentes cantidades de valores de  X , entre 50

10,000. En la tabla siguiente se muestran los valores obtenidos mediante el experimento

simulación.

Datos experimentales [kg] Datos teóricos [kg]

5/13/2018 Reporte pr1 - slidepdf.com

http://slidepdf.com/reader/full/reporte-pr1 8/11

 

Para N = 500

Desv. Estándar0.680993539107

Media19.825673028380

Para N =1500

Desv. Estándar0.681489941318

Media19.836486691734

Para N =4000

Desv. Estándar

0.674637987

492

Media19.808893390262

Para N =8000

Desv. Estándar0.674889395841

Media19.809794035350

Para N =10000

Desv. Estándar0.674591396376

Media19.810436679232

σ=(b-a)212= (20.98-18.64)212=0.6754998

μ= a+b2= 18.64+20.982=19.81

Adicionalmente, por mera curiosidad, se realizó la simulación con 100,000 números aleatori

obteniéndose como desviación estándar 0.674375814312 y como media 19.810988367842

Observaciones y conclusiones

Se puede observar que el requisito inicial de 4,000 números aleatorios aproxima a los valo

teóricos hasta la centésima en la desviación estándar y la décima en la media. La aproximac

es un tanto mejor con 8,000 números y al llegar a los 10,000 la aproximación es hasta

milésima en la media sin que en la desviación estándar se aprecie mejoría en el cálculo.

5/13/2018 Reporte pr1 - slidepdf.com

http://slidepdf.com/reader/full/reporte-pr1 9/11

 

Dado que las cantidades iniciales del estudio de simulación tienen una precisión de centésim

es notorio que el experimento resulta más preciso cerca de las 10,000 iteraciones de núme

aleatorios.

Desconcierta hasta cierto punto el que no se aprecie que converja a las cantidades teóric

mucho más alrededor de las 8,000 iteraciones. Incluso con 100,000 iteraciones, la precisión de

desviación estándar aún no corresponde en la milésima con el valor teórico, y el valor demedia incluso es un tanto más alejado en las diezmilésimas con respecto al obtenido en 10,0

iteraciones.

En general, la simulación es exitosa para acercarse a los valores teóricos, siempre y cuando u

evite generar alrededor de 1,500 números aleatorios o menos. Parece ser que cualquier núme

mayor a las 8,000 ~ 9,000 iteraciones es un desperdicio de tiempo de cálculo, la sensibilidad

aumenta significativamente.

Es posible que se necesite de un mejor generador de números aleatorios para lograr u

sensibilidad mayor.

5/13/2018 Reporte pr1 - slidepdf.com

http://slidepdf.com/reader/full/reporte-pr1 10/11

 

Código fuente

Option Explicit

Dim i As Long 'Índice utilizado en los ciclos.

Sub Main()

Dim N As Long 'Dimensión del vector resultante, cantidad de PRGN aleatorios.Dim a As LongLong, c As LongLong, m As LongLong 'Representativos de la fórmula de un LCG.Dim Xo As Integer 'Semilla del LCG.Dim Ui() As Double 'Vector donde se contendrán los PRGNs entre 0 y 1.Dim Xi() As Double 'Vector donde se mapearán los PRGNs al intervalo deseado.

 'Inputs, utilizando el LCG del GCCa = 1103515245c = 12345m = 4294967296#Xo = InputBox("Introducir la semilla (Xo)")N = InputBox("Introducir la cantidad de numeros aleatorios deseada")

 ReDim Ui(N) As DoubleReDim Xi(N) As Double

 Call RutLCG(a, c, m, N, Xo, Ui())

 'Mapeando los PRGN al intervalo del modelo

 For i = 1 To N

Xi(i) = (Ui(i) * (20.98 - 18.64)) + 18.64Next i

 'Output

For i = 1 To NCells(i + 1, 4).Value = Xi(i)

Next i 

For i = 1 To 20Cells(i + 1, 2).Value = Xi(i)Cells(i + 1, 1).Value = i

Next i 

 MsgBox ("La generacion de numeros aleatorios se realizo exitosamente.")

End Sub

'Rutina de Generador Congruencial Lineal (LCG)Sub RutLCG(a As LongLong, c As LongLong, m As LongLong, N As Long, Xo As Integer, Vector() Double) 

Dim Xold As LongLong, Xnew As LongLong'Dim Cociente As Double 'No se usa pues estamos utilizando los parámetros de GCC 

Xold = Xo 

For i = 1 To N 

'Cociente = Int((a * Xold + c) / m)'Xnew = (a * Xold + c) - (Cociente * m)Xnew = ((a * Xold) + c) Mod m Vector(i) = (Xnew / m)Xold = Xnew

  Next i

 

5/13/2018 Reporte pr1 - slidepdf.com

http://slidepdf.com/reader/full/reporte-pr1 11/11

 

End Sub

Impresión de pantalla