Reporte pr1
-
Upload
cybermegacat -
Category
Documents
-
view
35 -
download
0
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 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