Simulación de sistemas

Anuncio
Simulación
de Sistemas
Efraı́n Soto Apolinar
Simulación
de Sistemas
Notas por:
Efraı́n Soto Apolinar
PISIS
Monterrey, N.L., México. 2008
Índice
1 Introducción
1.1
5
Conceptos Básicos . . . . . . . . . . . . . . . . . . . . . . . . . .
7
1.1.1
Definiciones . . . . . . . . . . . . . . . . . . . . . . . . . .
9
1.1.2
Etapas del Estudio de Simulación . . . . . . . . . . . . . .
10
1.1.3
Distribuciones de probabilidad . . . . . . . . . . . . . . .
12
1.2
Simulación 01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
1.3
Simulación 02 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
1.3.1
Consideraciones . . . . . . . . . . . . . . . . . . . . . . . .
19
1.3.2
Simulación por computadora . . . . . . . . . . . . . . . .
20
1.3.3
Cálculo analı́tico . . . . . . . . . . . . . . . . . . . . . . .
23
Simulación 03 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
1.4.1
Definiciones . . . . . . . . . . . . . . . . . . . . . . . . . .
25
1.5
Simulación 04 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
1.6
Simulación 05 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
1.7
Simulación 06 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
1.4
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
1.8
Simulación 07 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
1.9
Simulación 07 (Reposición) . . . . . . . . . . . . . . . . . . . . .
51
1.10 Simulación 08 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
1.11 Movimiento Browniano . . . . . . . . . . . . . . . . . . . . . . . .
59
1.11.1 Bosquejo de experimento . . . . . . . . . . . . . . . . . .
59
1.12 Simulación 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
2 Proyecto Final
2.1
73
Simulación del Recurso Eólico . . . . . . . . . . . . . . . . . . . .
75
2.1.1
Energı́a extraida del viento . . . . . . . . . . . . . . . . .
75
2.1.2
Distribución del viento . . . . . . . . . . . . . . . . . . . .
77
2.1.2.1
Distribución Weibull . . . . . . . . . . . . . . . .
77
2.1.2.2
Distribución Rayleigh . . . . . . . . . . . . . . .
78
2.1.2.3
Distribución de energı́a . . . . . . . . . . . . . .
78
2.1.2.4
Anemómetros digitales . . . . . . . . . . . . . .
79
2.1.2.5
Predicción del recurso eólico . . . . . . . . . . .
79
2.1.3
Un caso especı́fico . . . . . . . . . . . . . . . . . . . . . .
80
2.1.4
Implementación . . . . . . . . . . . . . . . . . . . . . . . .
80
2.1.5
Resultados de la simulación . . . . . . . . . . . . . . . . .
85
2.1.6
Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . .
90
3 End matter
93
3.1
Fuentes bibliográficas . . . . . . . . . . . . . . . . . . . . . . . . .
95
3.2
Términos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
3.3
Créditos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
1
Introducción
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
1.1 Conceptos Básicos
1.1
7
Conceptos Básicos
En esta sección se encuentran algunos conceptos básicos de la simulación de
sistemas.
Definición 1.1.1.
Simulación
Es la imitación de la operación de un proceso o sistema (encontrado en el mundo
real) y su evolución en el tiempo.
El comportamiento de un sistema conforme evoluciona en el tiempo se estudia
desarrollando un modelo de simulación.
Ventajas de la simulación
• Pueden estudiarse nuevas polı́ticas, procedimientos operacionales, reglas
de decisión, flujos de información, procedimientos organizacionales, etc.,
sin afectar la operación normal del sistema real.
• Pueden probarse nuevos diseños mecánicos, sistemas de transporte, etc.,
sin asignar grandes cantidades de recursos financieros para su adquisición.
• Puede probarse la factibilidad del cómo o por qué ciertos fenómenos pueden
ocurrir.
• Podemos acelerar o decelerar un fenómeno en investigación.
• Podemos obtener información acerca de la interacción de las variables.
• Podemos obtener información acerca de la importancia de cada una de las
variables en el desempeño general del sistema.
• Se puede desarrollar análisis de “cuello de botella”, indicando en qué
partes se están retrasando demasiado información, materiales, etc.
• Una simulación puede ayudar a entender cómo opera el sistema.
• Podemos responder preguntas del tipo: “¿Qué pasarı́a si...?”. Esto es
particularmente útil en el diseño de nuevos sistemas.
Desventajas de la simulación
• Construir un modelo requiere de entrenamiento. Es un arte que se aprende
con el tiempo y a través de la práctica. Más aún, si dos personas competentes construyen un modelo para el mismo sistema, pueden tener similitudes, pero es muy poco probable que sean exactamente iguales.
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
8
Introducción
• Los resultados de la simulación pueden ser muy difı́ciles de interpretar.
Dado que la mayorı́a de los resultados de las simulaciones son esencialmente variables aleatorias (están basadas en entradas aleatorias), puede
ser difı́cil determinar si una observación es un resultado de las interrelaciones de las variables o de la aleatoriedad.
• La modelación de un sistema y su análisis puede consumir mucho tiempo
y ser costoso. Dedicarse a hacer la simulación de un sistema y su análisis
puede después indicar que este modelo es insuficiente.
• La simulación se utiliza en algunos casos aún cuando podemos encontrar
las soluciones analı́ticamente, o aún preferibles. Esto es verdadero en la
simulación de algunas lı́neas de espera donde hay disponibles modelos de
colas cerradas.
¿Cuándo es apropiada la simulación?
• La simulación permite el estudio, la experimentación, interacciones internas de un sistema, o de un subsistema dentro de un sistema complejo.
• Cambios organizacionales, informáticos y ambientales pueden ser simulados y el efecto de estas alteraciones puede observarse.
• El conocimiento ganado al diseñar un modelo de simulación puede ser de
gran valor para sugerir mejoras en el sistema investigado.
• Al cambiar las entradas del modelo y al observar las salidas, podemos
obtener sugerencias valiosas acerca de cuáles variables son más importantes y cómo interactuan entre ellas.
• La simulación puede utilizarse como un dispositivo pedagógico para fortalecer metodologı́as de soluciones analı́ticas.
• La simulación puede ser usada para experimentar con nuevos diseños o
polı́ticas antes de su implementación para prepararnos sabiéndo qué puede
ocurrir.
• La simulación puede utilizarse para verificar soluciones obtenidas analı́ticamente.
Áreas de aplicación
• Sistemas de manufactura.
• Sistemas públicos.
• Sistemas de trasnporte.
• Sistemas de construcción.
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.1 Conceptos Básicos
9
• Sistemas de entretenimiento.
• Reingenierı́a de procesos de negocios.
• Procesamiento de alimentos.
• Desempeño de sistemas computacionales.
1.1.1
Definiciones
Definición 1.1.2.
modelo
Representación de un sistema con el propósito de estudiarlo.
Definición 1.1.3.
Modelo matemático
Utiliza notación simbólica y ecuaciones matemáticas para representar el sistema.
Definición 1.1.4.
Simulación estática
Representa al sistema en un punto particular del tiempo. También se conoce
como simulación de Monte Carlo.
Definición 1.1.5.
Simulación dinámica
Representa el sistema y su evolución conforme avanza el tiempo.
Definición 1.1.6.
Modelo determinista
Es un modelo de simulación que no contiene variables aleatorias.
Definición 1.1.7.
modelo estocástico
Es un modelo de simulación que incluye una o varias variables aleatorias.
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
10
Introducción
Nota: Entradas aleatorias generan salidas aleatorias. Dado que las salidas
son aleatorias, solamente podemos considerarlas como una estimación de las
verdaderas caracterı́sticas del modelo.
Definición 1.1.8.
Sistema discreto
Un sistema en el cual las variables de estado cambian con valores discretos.
Definición 1.1.9.
Sistema continuo
Un sistema en el cual las variables de estado cambian con valores continuos con
el tiempo.
1.1.2
Etapas del Estudio de Simulación
En el proceso de construción del modelo de simulación se realizan, en general,
los siguientes pasos:
Definición del sistema Determinar la interacción de las variables entre sı́, del
sistema con otros sistemas, etc. Debemos entender el problema antes de
iniciar con su solución.
Formulación del modelo Definir todas las variables que forman parte del
sistema, sus relaciones. Escribir una definición completa del problema.
incluir detalles como entradas y salidas esperadas, el procesamiento necesario, suposiciones sobre el problema, etc.
Colección de datos Definir con claridad los datos con que se va a alimentar
el modelo.
Implementación del modelo Decidir el lenguaje de programación a utilizar
para implementar el modelo en una computadora.
Validación Detallar las deficiencias del modelo o en los datos alimentados al
mismo.
• Opinión de expertos sobre los resultados de la simulación.
• La exactitud con que se predicen datos históricos.
• La exactitud de la predicción en el futuro.
• La comprobación de falla del modelo de simulación con datos que
hacen fallar al sistema real.
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.1 Conceptos Básicos
11
• La aceptación y confianza en el modelo de la persona que hará uso
de los resultados que arroje el experimento de la simulación.
Experimentación.
La experimentación con el modelo se realiza después de que éste ha sido validado.
Consiste en generar datos.
Interpretación.
Se interpretan los resultados que arroja la simulación para tomar una decisión.
Documentación.
Documentación técnica Servirá para hacer modificaciones al modelo.
Documentación para el usuario Manual detallado de uso del sistema de
simulación para la persona que maneje el sistema.
Nota: Las suposiciones deben siempre escribirse en la documentación del programa de computradora generado como simulador. Por ejemplo, si debemos
alimentar al sistema con un coeficiente para indicar un porcentaje que debe
cumplir con: 0 ≤ p ≤ 1, la documentación debe mencionar este requerimiento
de manera explı́cita.
Definición 1.1.10.
Software de calidad
Debe cumplir con los siguientes:
Funciona Debe realizar la tarea para la cual se le diseño, completa y correctamente.
Es legible y comprensible El manual del usuario es fácil de comprender para
un usuario. Las notas técnicas (del programador) son fácilmente comprensibles por otros programadores. Esto se logra con un buen diseño y con
escritura clara. El código autodocumentado sirve para que otros programadores entiendan nuestros programas.
Es modificable No debe requerirse mucho tiempo para hacer modificaciones al
sistema de simulación. El programa de cómputo debe fácilmente adaptarse
a pequeñas modificaciones sin gran problema.
Definición 1.1.11.
Código autodocumentado
Es el código que utiliza para cada uno de los identificadores de las variables el
nombre más parecido al uso que tiene en la realidad.
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
12
Introducción
Por ejemplo el código:
double x,y,z;
x = y / z;
No nos dice mucho acerca de los significados de las variables x, y, z, sin embargo,
podemos escribir:
double velocidad, distancia, tiempo;
velocidad = distancia / tiempo;
lo cual hace evidente el significado de cada variable y entendible por otros programadores.
Definición 1.1.12.
Robustez
La habilidad de un programa de cómputo para recuperarse después de encontrar
un error, es decir, de continuar en operación.
Por ejemplo, en el caso de que un usuario ingrese por error una letra en lugar de
un dı́gito, el programa debe advertir al usuario del error y permitirle intentar
de nuevo.
1.1.3
Distribuciones de probabilidad
Se han creado cientos de distribuciones de probabilidad para ciertos procesos
fı́sicos. La elección de una distribución adecuada para cada proceso es importante.
Es una buena idea considerar las caracterı́ticas fı́sicas del proceso en estudio
para seleccionar una distribución. Cuestiones de continuidad o discretización,
si la variable está acotada o no acotada, etc., facilitan la decisión.
Una vez que vaya a elegir una distribución debe tener cuidado. Aquı́ se indican
algunos ejemplos.
Binomial Modela el número de triunfos en n intentos, cuando los intentos son
independientes con probabilidad de éxito p (todos los intentos tienen la
misma probabilidad de éxito). Por ejemplo, el número de piezas defectuosas en un lote de n piezas.
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.1 Conceptos Básicos
13
Binomial Negativa (incluida la distribución geométrica) Modela el número
de intentos requeridos para obtener k triunfos. Por ejemplo, el número de
piezas que debemos inspeccionar para encontrar 2 defectuosas.
Poisson Modela el número de eventos independientes que ocurren en una cantidad fija de tiempo y espacio. Por ejemplo, el número de clientes que llegan
a una tienda durante una hora, o el número de defectos encontrados en
una lámina de 50 m2 .
Normal Modela la distribución de un proceso que puede pensarse como la suma
de un número de subprocesos. Por ejemplo, el tiempo para ensamblar un
producto, que es igual a la suma de los tiempos requeridos para cada
operación del ensamble. Nótese que la distribución normal admite valores
negativos, los cuales pueden ser imposibles para procesos de tiempo.
Lognormal Modela la distribución de un proceso que pueden pensarse como el
resultado de la multiplicación de un número de subprocesos. Por ejemplo,
la rapidez de retorno de una inversión, cuando el interés es compuesto, es
el producto del retorno por el número de periodos.
Exponencial Modela el tiempo entre eventos independientes, o un proceso
en el tiempo que no tiene memoria (el hecho de saber cuánto tiempo
ha pasado no nos da información sobre cuánto tiempo debe pasar para
completar el proceso). Por ejemplo, el tiempo entre llegadas de un gran
número de clientes que actuan independientemente uno de otro.
Gamma Una distribución muy flexible usada para modelar variables aleatorias
no negativas. Esta distribución puede desplazarse (de cero) sumando una
constante.
Beta Una distribución muy flexible usada para modelar variables aleatorias con
un intervalo definido (limites inferior y superior fijos).
Erlang Modela procesos que pueden ser vistos como la suma de varios procesos con distribución exponencial. Por ejemplo, las fallas de la red computacional debido al fallo de una computadora y a dos computadoras de
respaldo, y cada una tiene un tiempo de fallo que tiene distribución exponencial.
Weibull Modela el tiempo de fallo de componentes. Por ejemplo, el tiempo de
falla de un aparato electrodoméstico.
Uniforme (Discreta o contı́nua) Modela incerteza completa, dado que todos
los valores tienen la misma probabilidad de salir.
Triangular Modela procesos donde solamente se conocen el mı́nimo, máximo
y el más frecuente. Por ejemplo, los tiempos requeridos mı́nimo, máximo
y el más frecuente para reparar un aparato electrico.
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
14
Introducción
Empirica Vuelve a muestrear de los datos reales medidos. Frecuentemente se
utiliza cuando no se conoce una distribución teórica apropiada para el
proceso en estudio.
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.2 Simulación 01
1.2
15
Simulación 01
Primera simulación
Considere el planeta tierra con un tunel que le atraviesa por su centro. Se suelta
una piedra de masa m para que caiga a través de ese tunel. Simular la posición
de la piedra para cada instante t. Considere la masa de la tierra constante e
igual a M .
Desarrollar los siguientes casos:
1. Considerar la masa de la tierra M concentrada en su centro. Suponer que la
fricción con el aire es despreciable.
La fuerza que “siente” la piedra es su peso:
W = m · ẍ(t)
Por otra parte, esta fuerza es ocasionada por la atracción gravitatoria de la
tierra sobre la piedra:
m·M
FG = G
[x(t)]2
Igualando las fuerzas obtenemos:
m · ẍ(t) = G
m·M
[x(t)]2
Lo cual puede simplificarse para obtener:
ẍ(t) = G
M
[x(t)]2
La ecuación diferencial que representa el modelo matemático para esta situación
es:
ẍ(t) · [x(t)]2 = G M
(1.1)
La solución de esta ecuación no se ha logrado encontrar.
En primer lugar, como x(t) está en el denominador, tenemos división por
cero cuando la piedra está en el centro de la tierra.
De cualquier manera, se muestra una solución que muestra la velocidad en
función de la posición.
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
16
Introducción
Definimos: v(t) = ẋ(t), entonces,
dv dx
dv
·
=v·
dx dt
dx
ẍ(t) = v̇(t) =
Entonces, la ecuación se reduce de orden obteniendo:
v·
dv
GM
= 2
dx
x
Podemos separar las variables para resolver la ecuación:
Z
Z
GM
dx
v dv =
x2
v2
GM
= −
+C
2
3 x3
de donde al despejar v(x) obtenemos:
r
−
v=
2 GM
+K
3 x3
(1.2)
Esta solución nos puede dar alguna información del fenómeno que estudiamos.
2. Considerar la masa de la tierra M distribuida uniformemente. Suponer que
la fricción con el aire es despreciable.
Por definición, la densidad de un material es igual al cociente de la masa del
mismo entre su volumen. La densidad de la tierra en este caso se considera
constante. Suponemos además que la forma de la tierra es esférica. El
volumen de una esfera de radio x(t) es:
V =
4
π [x(t)]3
3
Pero para la fórmula de la ley universal de gravitación de Newton necesitamos
la masa de la fracción de la tierra que sigue atrayendo a la piedra.
En este caso, se trata de una esfera de radio x(t), su masa puede calcularse
como el producto del volumen parcial por la densidad promedio de la tierra,
es decir:
4
M (t) = π [x(t)]3 ρT
3
Ahora, sustituimos este valor en la fórmula de la ecuación encontrada en el
primer mdelo:
Efraı́n Soto A.
4
[x(t)]3
m π ρT
3
[x(t)]2
m · ẍ(t)
=
G
ẍ(t)
=
4
π x(t) ρT G
3
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.2 Simulación 01
17
y definiendo: L =
4
π ρT G, podemos escribir de una manera más compacta:
3
ẍ(t) = L x(t)
(1.3)
La solución de esta ecuación es como sigue: suponemos una solución del tipo
x(t) = er t . Entonces, ẋ(t) = r er t , y ẍ(t) = r2 er t . Sustituyendo estos
resultados en la ecuación obtenemos:
r 2 er t
2 rt
= L er t
rt
− Le
r − L · er t
r e
2
=
0
=
0
pero er t 6= 0 para cualquier t. Entonces,
r2 − L =
r
=
0
+√
L
Y la solución de la ecuación es:
√
x(t) = C1 e
Lt
√
+ C2 e−
Lt
Con las condiciones iniciales podemos encontrar los valores de las constantes
C1 y C2 .
En caso de que L sea negativo, tendremos soluciones imaginarias.
3. Considerar la masa de la tierra M distribuida uniformemente. Suponer que
la fricción con el aire es directamente proporcional a la velocidad de la piedra.
Ahora, tenemos una nueva fuerza que consiste en la resistencia debido al aire.
En este caso se trata de una fuerza proporcional a ẋ(t).
Entonces, la ecuación que considera las fuerzas que actúan sobre la piedra
es:
4
m · ẍ(t) = π x(t) ρT m G − c · ẋ(t)
3
la cual puede expresarse como:
m · ẍ(t) + c · ẋ(t) − λx(t) = 0
(1.4)
4
π ρT m G.
3
La solución de esta ecuación es inmediata, dado que se trata de una ecuación
diferencial lineal de segundo orden.
donde λ =
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
18
Introducción
Suponemos que la solución es de la forma: x(t) = er t . Entonces, ẋ(t) = r er t ,
y ẍ(t) = r2 er t . Sustituyendo estos resultados en la ecuación obtenemos:
m r2 er t + c r er t − λ er t = 0
Inmediatamente observamos que podemos factorizar la función er t , para
obtener:
er t m r 2 + c r − λ = 0
pero er t 6= 0 para cualquier t. Esto nos obliga a hacer: m r2 + c r − λ = 0.
Aquı́ tenemos una ecuación cuadrática que se resuelve con la fórmula general:
√
−c + c2 + 4 mλ
r=
2m
y obtenemos los dos valores de r que hacen que x(t) = er t sean solución de
la ecuación diferencial: m · ẍ(t) + c · ẋ(t) − λx(t) = 0:
√
−c + c2 + 4 mλ
r1 =
√2 m
−c − c2 + 4 mλ
r2 =
2m
De donde la solución de la ecuación diferencial es:
x(t) = C1 er1 t + C2 er2 t
Con las condiciones iniciales podemos encontrar los valores de las constantes
C1 y C2 .
Por la forma del experimento, puede probarse que el valor de c > 0, y que
las raı́ces r1 , r2 de la ecuación caracterı́stica de la ecuación diferencial son
números complejos, y la solución tiene la forma:
x(t) = e−c/2m C1 eiρt + C2 e−iρt
y finalmente puede simplificarse, con la ayuda de las condiciones iniciales a:
x(t) = R e−c/2m cos(ρt)
√
donde ρ =
Efraı́n Soto A.
(1.5)
c2 + 4 mλ
.
2m
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.3 Simulación 02
1.3
19
Simulación 02
Problema 2
Se lanza un alfiler de longitud L a una mesa que tiene dibujadas lı́neas paralelas
equidistantes separadas a L unidades una de la otra. Calcular la probabilidad
de que el alfiler toque lı́nea.
1.3.1
Consideraciones
Se realizaron las siguientes suposiciones:
1. La longitud del alfiler es 1.
2. El alfiler siempre cae dentro de la mesa.
3. La distancia (medida verticalmente) de una recta a la cabeza del alfiler es
una variable aleatoria que presenta distribución uniforme.
4. El ángulo que forma el alfiler con las rectas dibujadas sobre la mesa es una
variable aleatoria que presenta distribución uniforme.
Con base en estas suposiciones, podemos definir como x la distancia (medida
verticalmente) de una recta a la cabeza del alfiler, y θ como el ángulo que forma
una de las rectas dibujadas sobre la mesa y el alfiler.
1
`i+1
θ
x
0
`i
Ahora definimos y como la posición de la punta del alfiler (el extremo opuesto
a la cabeza del alfiler).
Dado que el alfiler mide 1, la coordenada y puede calcularse con:
y = x + sin (2 π θ)
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
20
Introducción
donde π = 3.141592654 · · · , es la constante geométrica1 , y θ es el ángulo como
se definió anteriormente.
El alfiler tocará lı́nea siempre y cuando se cumpla alguna de las siguientes condiciones:
i. y > 1, ó
ii. y < 0
Geométricamente, de la figura podemos ver que en estos casos, la punta del
alfiler estará fuera del área encerrada por las lı́neas paralelas `i y `i+1 .
1.3.2
Simulación por computadora
En seguida se muestra el código del programa que simula este experimento.
/* Nombre del archivo: simulacion01.cpp
Descripción:
Este programa simula el siguiente experimento:
Se lanza un alfiler de longitud L a una mesa
que tiene dibujadas lı́neas paralelas equidistantes
separadas a L unidades una de la otra.
El usuario debe ingresar el número total de
experimentos (entero) que se deben realizar,
entendiendo por experimento la simulación de un
lanzamiento del alfiler sobre la mesa.
El resultado indica la probabilidad de que el
alfiler toque una de las lı́neas dibujadas sobre la
mesa.
------------------------------------------------------------------------------------------------------Autor: Efraı́n Soto Apolinar
Email: [email protected]
Fecha de última Modificación: 24 de enero de 2008
Lenguaje de Programación: C++
Compilador: Dev - C++ Versión 4.9.9.2.
------------------------------------------------------------------------------------------------------*/
#include <iostream> // Funciones básicas para input/output
#include <stdlib.h> // para usar la función rand()
#include <math.h> // funciones matemáticas (sin (double))
#include <conio.h> // para usar: getche, getch
1 Al multiplicar θ por 2 π convertimos la variable aleatoria θ, cuyos valores van desde 0
hasta 1 a radianes. Se trata de un simple mapeo uno a uno.
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.3 Simulación 02
21
using namespace std;
int main(void)
{
char respuesta;
int si, no, i, j, total;
double p, x, y, a;
const double pi = 3.141592654;
/*
x --> representa la distancia de una recta
paralela de referencia
al punto donde cayó la cabeza del alfiler.
y = x + sin (2 * pi * a)
a --> es el ángulo que forma el alfiler con
las rectas paralelas dibujadas sobre
la mesa
si --> es el número de veces que el alfiler
toca lı́nea
no --> es el número de veces que el alfiler
NO toca lı́nea
p
--> es la probabilidad de que toque...
total --> es el número de experimentos que
realizará el programa...
/
*
cout << "\nEste programa calcula la probabilidad de que";
cout << "\nal lanzar un alfiler de una longitud dada ";
cout << "\nsobre una mesa que tiene dibujadas lı́neas ";
cout << "\nparalelas separadas por una distancia igual ";
cout << "\na la longitud del alfiler, toque lı́nea... ";
//
for (;;)
{
cout << "\n\n\nIngrese el número de experimentos: ";
cin >> total;
si = no = 0;
p = 0;
for (i = 1 ; i <= total ; i++)
{ // realizo los experimentos
x = double(rand()) / double(RAND_MAX);
a = double(rand()) / double(RAND_MAX);
y = x + sin(2*pi*a);
if ((y < 0) || (y > 1))
{si++;}
else
{no++;}
} // end del ciclo for ()
p = double(si) / double(total);
cout << "\n\n\nDe los " << total << " experimentos ";
cout << si << " tocaron lı́nea, \nmientras que " << no ;
cout << " no tocaron lı́nea.\n";
cout << "\nDe aquı́ que la probabilidad de que el alfiler";
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
22
Introducción
cout << "\ntoque lı́nea es: " << p;
cout << "\n\n\n";
//
cout << "Presione < S > para salir...";
respuesta = getche();
if ((respuesta == ’S’)||(respuesta == ’s’))
{
break; // Salir del ciclo for inicial...
}
cout <<"\n\n\n";
}
return 0;
}
Como los resultados generados con este programa son aleatorios, los resultados
varı́an ligeramente.
En la siguiente tabla se muestran algunos resultados obtenidos con el mismo.
No. Experimentos
100
200
300
400
500
600
700
800
900
1 000
10 000
106
108
Probabilidad
0.66
0.62
0.613333
0.63
0.644
0.646667
0.624173
0.64
0.647778
0.623
0.6437
0.636592
0.636612
De hecho, aún si se dan los mismos valores al programa, éste arrojará diferentes
resultados cada vez, dado que los valores que van tomando las variables x (que
representa la distancia desde la recta `i a la cabeza del alfiler) y θ (que representa
el ángulo que forma el alfiler con cualquiera de las lı́neas dibujadas sobre la mesa)
son variables aleatorias con distribución contı́nua.
Esto se puede verificar realizando los cálculos de nuevo con el programa alimentándolo con los mismos valores.
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.3 Simulación 02
1.3.3
23
Cálculo analı́tico
Para hacer el cálculo analı́tico podemos definir las siguientes coordenadas: Sea
d la distancia del centro del alfiler a la recta más cercana.
Sea ` esta recta, y sea α el menor ángulo formado entre ` y el alfiler. De aquı́
se deduce que:
1
π
0≤d≤ ,
y
0≤α≤
2
2
También es claro que el alfiler tocará la recta ` si la hipotenusa del triángulo es
menor a 0.5, es decir:
d
1
<
sin α
2
Entonces, al lanzar el alfiler, las coordenadas (d, α) tienen distribución uniforme
en los intervalos antes definidos, que se pueden representar mediante el siguiente
rectángulo:
1
2
π
2
La probabilidad de que el alfiler toque lı́nea es igual a la fracción del área del
1
rectángulo que yace debajo de la gráfica de la función: d = sin α.
2
El área del rectángulo es: π/4 y el área debajo de la gráfica de la función en
cuestión es:
Zπ/2
1
1
sin α dα =
2
2
0
y ası́ obtenemos:
1
2 = 2 ≈ 0.6366197724
p(A) = π
π
4
Ası́ que la simulación codificada en C++ es correcta.
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
1.4 Simulación 03
1.4
1.4.1
25
Simulación 03
Definiciones
Definición 1.4.13.
Distribución de probabilidad
El conjuunto de todos los pares (x, p(x)) para los cuales p(x) > 0 se denomina
la distribución de probabilidad de la variable aleatoria X.
Un experimento binomial presenta las siguientes propiedades:
3 El experimento consiste de n intentos idénticos.
3 Cada intento resulta en uno de dos resultados. Uno de ellos se define como
éxito y el otro como fracaso.
3 La probabilidad de éxito en un intento es p y continua constante de un
intento a otro.
3 La probabilidad de fracaso es 1 − p.
3 Los intentos son independientes.
3 La variable aleatoria X es el número de éxitos observados durante los n
intentos.
Teorema.1.4.1
La distribución binomial está dada por:
n x n−x
p(x) =
p q
x
Desarrollar una simulación por computadora que simule experimentos de
Bernoulli. El programa debe repetir los intentos hasta que se supere un valor
fijo p de éxito, definido por el usuario. Este mismo experimento debe realizarse
con el método binomial. Se debe ir calculando el valor de la probabilidad binomial P (n, k) para k = 0, 1, 2 · · · i, hasta que se rebase el valor de p.
El programa debe indicar al usuario cuántos intentos de Bernoulli se requierieron
para superar el valor de p y cuántas iteraciones binomiales se requirieron para
alcanzar el mismo objetivo.
Se elaboró un programa que requiere de la siguiente información:
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
26
Introducción
3 Máximo de intentos de Bernoulli, que corresponde al número máximo de
experimentos de Bernoulli que se simularán.
3 El valor de la probabilidad de éxito, que corresponde al valor de p del
evento a simular.
El código en el lenguaje C++ se enlista en seguida.
/* Nombre del archivo: simulacion03.cpp
Descripción:
Este programa simula experimentos de Bernoulli
y probabilidad binomial.
------------------------------------------------------------------------------------------------------Autor: Efraı́n Soto Apolinar
Email: [email protected]
[email protected]
Fecha de última Modificación: 03 de febrero de 2008
Lenguaje de Programación: C++
Compilador: Dev - C++ Versión 4.9.9.2.
------------------------------------------------------------------------------------------------------*/
#include <iostream> // Funciones básicas para input/output
#include <stdlib.h> // para usar la función rand()
#include <math.h> // funciones matemáticas (pow (double))
#include <conio.h> // para usar: getche, getch
#include <ctime> // clock_t = clock();
int errores; // variable global...
int factorial(int n);
int permuta(int n, int k);
//
using namespace std;
int main(void){
char respuesta;
int i, j, kBer, kBin, n;
double p, q, prob, x;
//
cout << "\nEste programa simula experimentos binomiales";
cout << "\ny repeticiones de experimentos de Bernoulli...";
//
//
//
for (;;)
{
errores = 0;
kBer = 0;
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.4 Simulación 03
27
kBin = 0;
cout << "\n\n\nMáximo de intentos de Bernoulli: ";
cin >> n;
if((n < 0) || (n > 20)) {
cout << "\nn debe estar entre 1 y 20 (inclusive)...";
cout << "\n\n";
continue;
}
for (;;) { // para que pueda ingresar el valor de p...
cout << "\nIngrese el valor de la probabilidad de éxito: ";
cin >> p;
if ((p < 0) || (p > 1)) {
cout << "\np está entre cero y uno (inclusive)...";
cout << "\n\n\n";
continue;
}
q = 1 - p; // probabilidad de fracaso...
break;
} // termina el for...
//
//
//
// realizo el cálculo de acuerdo a Bernoulli...
for (i=1 ; i <= n ; i++) {
x = double(rand()) / double(RAND_MAX); // genero x
if (p >= x){
kBer++;
} // endif
} // end for
//
//
// realizo el cálculo por Binomial...
x = double(rand())/ double(RAND_MAX); // genero x
prob = 0; // inicio la probabilidad acumulada de Bernoulli
kBin = 0; // inicio el número de intentos...
for(;;){ // for infinito...
prob +=double(permuta(n,kBin))*pow(p,double(kBin))*pow(q,double(n-kBin));
if (prob >= x) {
break;
}
kBin++;
}
//
// Muestro los resultados...
cout << "\n\n\nIntentos con Bernoulli: " << kBer;
cout << "\n\nIntentos con Binomial: " << kBin;
cout << "\n\n\nTotal de errores: " << errores;
//
cout << "\n\n\nPresione < S > para salir...";
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
28
Introducción
respuesta = getche();
if ((respuesta == ’S’)||(respuesta == ’s’))
{
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
}
return 0;
}
/**************************************
Declaro la función factorial...
***************************************/
int factorial(int n)
{
long fi,i;
fi = i = 1;
while (i <= n)
{
fi *=i;
if (fi <= 0){ // por si se pasa la memoria...
cout << "\nLo siento, se rebasó la memoria...";
fi = 1;
errores++;
break;
}
i++;
}
return fi;
}
/**************************************
Declaro la función permuta...
***************************************/
int permuta(int n, int k)
{
int perm,subfactorial,i;
i = n - k + 1; // n - k + 1 para calcular el subfactorial
subfactorial = 1; // reinicio el subfactorial
while (i <= n){
subfactorial *= i;
i++;
}
perm = subfactorial / factorial(k);
return perm;
}
Los resultados que arroja el programa evidentemente varı́a con los datos con
que alimente al mismo.
Por ejemplo, con 12 intentos de Bernoulli máximo y una probabilidad de éxito
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.4 Simulación 03
29
de 0.35 obtenemos los siguientes resultados:
Este programa simula experimentos binomiales
y repeticiones de experimentos de Bernoulli...
Máximo de intentos de Bernoulli: 12
Ingrese el valor de la probabilidad de éxito: 0.35
Intentos con Bernoulli: 3
Intentos con Binomial: 5
Total de errores: 0
Presione < S > para salir...
Los resultados obtenidos de un segundo ejemplo considerando 12 intentos de
Bernoulli y un valor de p = 0.65, son:
Máximo de intentos de Bernoulli: 12
Ingrese el valor de la probabilidad de éxito: 0.65
Intentos con Bernoulli: 7
Intentos con Binomial: 9
Total de errores: 0
Un tercer ejemplo se muestra en seguida:
Máximo de intentos de Bernoulli: 12
Ingrese el valor de la probabilidad de éxito: 0.95
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
30
Introducción
Intentos con Bernoulli: 12
Intentos con Binomial: 12
Total de errores: 0
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.5 Simulación 04
1.5
31
Simulación 04
Suponga deseamos calcular la distribución de probabilidad de que ocurra un
accidente en una intersección de calles. Podemos considerar una unidad de
tiempo, por ejemplo una hora, o un minuto, de manera que la probabilidad de
que ocurra un accidente en ese intervalo sea distinta de cero.
Entonces, si p es la probabilidad de que ocurra exactamente un accidente, 1 − p
es la probabilidad de que NO ocurra.
Si la ocurrencia de un accidente en in intervalo de tiempo es independiente de
los demás intervalos, el número total de accidentes en un intervalo mayor, por
ejemplo, una semana, tendrá una distribución binomial.
Nosotros consideramos el caso en el que el producto n p permanece constante,
al hace cambiar el tamaño del intervalo, es decir, si n → ∞, p → 0, implica
n p = λ, siendo λ una constante.
Entonces,
n x
lim
p (1 − p)n−y
n→∞ x
x n−x
λ
n (n − 1) · · · (n − x + 1) λ
1−
= lim
n→∞
x!
n
n
−x
n
x
λ
λ
n (n − 1) · · · (n − x + 1)
λ
= lim
1−
1−
n→∞ x!
n
nx
n
n −y x
λ
λ
λ
1
2
x−1
1−
1−
1−
··· 1 −
lim 1 −
=
x! n→∞
n
n
n
n
n
Pero
lim
n→∞
λ
1−
n
n
= e−λ
y todos los demás factores se hacen 1, dado que n → ∞. Entonces:
P (x) =
λx −x
e
x!
Las variables que presentan esta distribución se conocen como variables aleatorias con distribución de Poisson.
Desarrollar un programa por computadora que simule experimentos con distribución de Poisson. El programa debe repetir los intentos hasta que se supere
un valor fijo p de éxito, definido por el usuario.
El programa debe indicar al usuario cuántos intentos del experimento se requierieron para superar el valor de p.
Se elaboró un programa que requiere de la siguiente información:
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
32
Introducción
3 Valor de Lambda, que corresponde al promedio de la muestra.
3 El valor de la probabilidad de éxito, que corresponde al valor de p del
evento a simular.
El código en el lenguaje C++ se enlista en seguida.
/* Nombre del archivo: simulacion04.cpp
Descripción:
Este programa simula experimentos con distribución de Poisson
y probabilidad binomial.
------------------------------------------------------------------------------------------------------Autor: Efraı́n Soto Apolinar
Email: [email protected]
[email protected]
Fecha de última Modificación: 03 de febrero de 2008
Lenguaje de Programación: C++
Compilador: Dev - C++ Versión 4.9.9.2.
------------------------------------------------------------------------------------------------------*/
#include <iostream> // Funciones básicas para input/output
#include <stdlib.h> // para usar la función rand()
#include <math.h> // funciones matemáticas (pow (double))
#include <conio.h> // para usar: getche, getch
#include <ctime> // clock_t = clock();
int errores; // variable global...
int factorial(int n);
int permuta(int n, int k);
//
using namespace std;
int main(void){
char respuesta;
int i, k;
double p, prob, x, lambda;
//
cout << "\nEste programa simula experimentos con";
cout << "\ndistribucion de Poisson...";
//
//
//
for (;;)
{
errores = 0;
cout << "\n\n\nValor de Lambda (Promedio): ";
cin >> lambda;
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.5 Simulación 04
33
if((lambda < 0)) {
cout << "\nLambda debe ser un valor positivo...\n\n";
continue;
}
for (;;) { // para que pueda ingresar el valor de p...
cout << "\nIngrese el valor de la probabilidad de éxito: ";
cin >> p;
if ((p < 0) || (p > 1)) {
cout << "\np está entre cero y uno (inclusive)...";
cout << "\n\n\n";
continue;
}
break;
} // termina el for...
//
//
// realizo el cálculo de la probabilidad...
srand(unsigned(time(0)));// Semilla para el aleatorio...
x = double(rand())/ double(RAND_MAX); // genero x
prob = 0; // inicio la probabilidad acumulada
for(i = 0 ; prob <= x ; i++){ // for infinito...
prob += exp(-lambda) * pow(lambda,i) / factorial(i);
//
}
//
// Muestro los resultados...
cout << "\n\n\nIntentos con Poisson: " << i-1;
cout << "\n\n\nTotal de errores: " << errores;
//
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == ’S’)||(respuesta == ’s’))
{
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
}
return 0;
}
/**************************************
Declaro la función factorial...
***************************************/
int factorial(int n)
{
long fi,i;
fi = i = 1;
while (i <= n)
{
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
34
Introducción
fi *=i;
if (fi <= 0){ // por si se pasa la memoria...
cout << "\nLo siento, se rebasó la memoria...";
fi = 1;
errores++;
break;
}
i++;
}
return fi;
}
Un ejemplo de la ejecución del código se muestra enseguida:
Este programa simula experimentos con
distribucion de Poisson...
Valor de Lambda (Promedio): 12
Ingrese el valor de la probabilidad de Txito: 0.45
Intentos con Poisson: 13
Total de errores: 0
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.6 Simulación 05
1.6
35
Simulación 05
Desarrollar un programa por computadora que simule el lanzamiento de dos
dados.
El programa debe permitir al usuario indicar cuántos experimentos realizar y si
desea o no ver los resultados de cada experimento.
El programa debe imprimir en pantalla el promedio de la suma de todos los
experimentos realizados.
El código en el lenguaje C++ se enlista en seguida.
/* Nombre del archivo: simulacion05.cpp
Descripción:
Este programa simula el lanzamiento de dos dados...
------------------------------------------------------------------------------------------------------Autor: Efraı́n Soto Apolinar
Email: [email protected]
[email protected]
Fecha de última Modificación: 08 de febrero de 2008
Lenguaje de Programación: C++
Compilador: Dev - C++ Versión 4.9.9.2.
------------------------------------------------------------------------------------------------------*/
#include <iostream> // Funciones básicas para input/output
#include <stdlib.h> // para usar la función rand()
#include <conio.h> // para usar: getche, getch
#include <ctime> // clock_t = clock();
using namespace std;
int main(void){
char respuesta,resp;
int i, x, y, n; // variables aleatorias...
int suma;
double promedio;
//
cout << "\nEste programa simula el lanzamiento";
cout << "\nde dos dados...";
//
//
//
for (;;)
{
// realizo el cálculo de la probabilidad...
cout << "\n\n\n¿Cuántos lanzamientos deseas simular? ";
cin >> n;
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
36
Introducción
cout << "\n\n\n¿Deseas ver los resultados? [S / N] ";
cin >> resp;
srand(unsigned(time(0)));// Semilla para el aleatorio...
suma = 0; // reinicio la suma de resultados...
if ((resp == ’S’)||(resp == ’s’)){
cout << "\n\nSimulación ";
cout << "\t\tDADO 1: ";
cout << "\tDADO 2: ";
cout << "\tSUMA: \n";
}
for (i = 1 ; i <= n ; i++ ){
//
x = (rand() % 6) + 1;
y = (rand() % 6) + 1;
//
suma += x+y;
if ((resp == ’S’)||(resp == ’s’)){
// Muestro los resultados...
cout << "\t" << i << "\t";
cout << "\t
" << x << "\t";
cout << "\t
" << y << "\t";
cout << "\t
" << x+y << "\n\n";
}
}
promedio = double(suma) / double(i-1);
cout << "\n\n\n Suma Promedio: " << promedio;
//
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == ’S’)||(respuesta == ’s’))
{
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
}
return 0;
}
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.7 Simulación 06
1.7
37
Simulación 06
Elaborar un programa que simule una variable aleatoria con distribución de
Poisson que a su vez toma una variable con distribución exponencial. Comparar
el número de intentos que debe realizar esta variable para alcanzar el valor 1
y compararlo con una variable aleatoria con distribución de Poisson que toma
una variable con distribución uniforme.
• Se muestra en seguida el código del programa que se preparó en el lenguaje
C++ .
/* Nombre del archivo: simulacion06.cpp
Descripción:
Este programa simula experimentos con distribución de Poisson
cuya variable de dominio tiene una distribución exponencial
y compararla con la distribución de Poisson con dominio en
una variable aleatoria con distribución uniforme.
------------------------------------------------------------------------------------------------------Autor: Efraı́n Soto Apolinar
Email: [email protected]
[email protected]
Fecha de última Modificación: 14 de febrero de 2008
Lenguaje de Programación: C++
Compilador: Dev - C++ Versión 4.9.9.2.
------------------------------------------------------------------------------------------------------*/
#include <iostream> // Funciones básicas para input/output
#include <stdlib.h> // para usar la función rand()
#include <math.h> // funciones matemáticas (pow (double))
#include <conio.h> // para usar: getche, getch
#include <ctime> // clock_t = clock();
int errores; // variable global...
int factorial(int n); // función...
using namespace std;
int main(void){
char respuesta;
int i, ipe, ip;
double prob, probe, u, lambda, x;
//
for (;;){
cout << "\nEste programa simula experimentos con";
cout << "\ndistribucion de Poisson a partir de una";
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
38
Introducción
cout << "\nvariable aleatoria con distribución exponencial...";
//
//
//srand(unsigned(time(0)));// Semilla para el aleatorio...
// Con distribución Poisson - Exponencial
probe = 0; // inicio la probabilidad acumulada
for(i = 0 ; probe <= 1 ; i++){ // calculo la probabilidad...
u = double(rand())/ double(RAND_MAX); // genero x
x = - log(1 - u) / u; //
probe += exp(-x) * pow(x,i) / factorial(i);
ipe = i;
}
//
// Ahora realizo el cálculo con distribución uniforme...
prob = 0; // inicio la probabilidad acumulada
for(i = 0 ; prob <= 1 ; i++){
prob += exp(-lambda) * pow(lambda,i) / factorial(i);
}
//
// Muestro los resultados...
cout << "\n\n\nIntentos con poisson exponencial: " << ipe;
cout << "\n\n\nIntentos con poisson uniforme: " << i;
//
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == ’S’)||(respuesta == ’s’)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
}
return 0;
}
/**************************************
Declaro la función factorial...
***************************************/
int factorial(int n)
{
long fi,i;
fi = i = 1;
while (i <= n)
{
fi *=i;
if (fi <= 0){ // por si se pasa la memoria...
cout << "\nLo siento, se rebasó la memoria...";
fi = 1;
errores++;
break;
}
i++;
}
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.7 Simulación 06
39
return fi;
}
En seguida se muestran ejemplos de resultados obtenidos con este programa:
Este programa simula experimentos con
distribucion de Poisson a partir de una
variable aleatoria con distribuci=n exponencial...
Lo siento, se rebas= la memoria...
Intentos con poisson exponencial: 17
Intentos con poisson uniforme: 3
///////////////////////////////////////////////
Este programa simula experimentos con
distribucion de Poisson a partir de una
variable aleatoria con distribuci=n exponencial...
Lo siento, se rebas= la memoria...
Intentos con poisson exponencial: 17
Intentos con poisson uniforme: 3
///////////////////////////////////////////////
Este programa simula experimentos con
distribucion de Poisson a partir de una
variable aleatoria con distribuci=n exponencial...
Intentos con poisson exponencial: 16
Intentos con poisson uniforme: 3
///////////////////////////////////////////////
Este programa simula experimentos con
distribucion de Poisson a partir de una
variable aleatoria con distribuci=n exponencial...
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
40
Introducción
Intentos con poisson exponencial: 6
Intentos con poisson uniforme: 3
///////////////////////////////////////////////
Este programa simula experimentos con
distribucion de Poisson a partir de una
variable aleatoria con distribuci=n exponencial...
Lo siento, se rebas= la memoria...
Intentos con poisson exponencial: 17
Intentos con poisson uniforme: 3
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.8 Simulación 07
1.8
41
Simulación 07
Elaborar un programa que genere números aleatorios con distribución uniforme,
utilizando la siguiente definición:
∞
x X
(−x2 )i
Φ(x) = √
2 π i=0 2i · i! · (2 i + 1)
• Se muestra en seguida el código del programa que se preparó en el lenguaje
C++ .
/* Nombre del archivo: simulacion07Final.cpp
Descripción:
Este programa simula números aleatorios con
distribución normal.
------------------------------------------------------------------------------------------------------Autor: Efraı́n Soto Apolinar
Email: [email protected]
[email protected]
Fecha de última Modificación: 26 de febrero de 2008
Lenguaje de Programación: C++
Compilador: Dev - C++ Versión 4.9.9.2.
------------------------------------------------------------------------------------------------------*/
#include <iostream> // Funciones básicas para input/output
#include <stdlib.h> // para usar la función rand()
#include <math.h> // funciones matemáticas (pow (double))
#include <conio.h> // para usar: getche, getch
#include <ctime> // clock_t = clock();
#include <cmath>
int errores; // variable global...
double rfactorial(int n);
// función...
double normal(double x); // función...
double intnormal(double x);
const double pi = 3.141592653589; // global
using namespace std;
int main(void){
char respuesta;
double x, xa, u, approx, approxa;
double step, error, errorx;
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
42
Introducción
int j, total, cont, z;
char signo;
// para los dı́gitos...
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(8);
//
for (;;){
cout << "\nEste programa simula la generación de números";
cout << "\ncon distribucion normal a partir de una";
cout << "\nvariable aleatoria con distribución uniforme...";
//
//srand(unsigned(time(0))); // Semilla para el aleatorio...
//
cout << "\n\n\n¿Cuantos numeros desea generar? ";
cin >> total;
//
for (cont = 1 ; cont <= total ; cont++){
// Genera un aleatorio en [0,1]
u = double(rand()) / double(RAND_MAX);
//
x = 0;
// valor inicial supuesto (media)
z = 0;
if (u < 0.01){
step = u / 2;
}
else{
step = 0.25;
}
for (;;){
//
xa = x;
approx = normal(x);
//
// Decido si incremento o decremento x
while (approx < u){
x += step;
approx = normal(x);
//cout << "\napprox <... " << approx;
z++;
}
step /= 1.5;
while (approx > u){
x -= step;
approx = normal(x);
//cout << "\napprox >... " << approx;
z++;
}
step /= 1.5;
if (approx < 0.0001 && fabs(x) > 3.999){
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.8 Simulación 07
43
x = u / 2;
approx = normal(u);
}
// calculo el error relativo para x
if (fabs(xa - x) < 0.0001){
// Criterio para salir del ciclo...
cout << "\n" << cont << "\tu = " << u << "\tApprox = "
<< intnormal(x) << "\t x = " << x;
break;
}
} // end for que hace las iteraciones...
//
} // end for cont = 1 to total;
//
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == ’S’)||(respuesta == ’s’)){
break; // Salir...
}
cout << "\n\n\n";
} // end for infinito...
return 0; // Salir...
}
/**************************************
Declaro la función normal...
***************************************/
double normal(double x){
double u = 0;
double un, ua, temp;
int i;
if (x < -4){
return 0;
}
if (x > 4){
return 1;
}
for (i = 0 ; i < 40 ; i++){
ua = u;
u += pow(-0.5 * x * x,i) * rfactorial(i) / (2*i+1);
un = u;
} // endfor
if (x < 0 ){
u = 0.5 - u * x / sqrt(2*pi);
}
else{
u = 0.5 + u * x / sqrt(2*pi);
}
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
44
Introducción
return u;
}
/**************************************
Declaro la función intnormal...
***************************************/
double intnormal(double x){
double u = 0;
double ua, up, ac;
double xi, step;
// xi es la iteracion actual
// step es el tamaño del paso...
int i;
step = 0.00000001; // El paso es 1 / 1000
xi = 0; // empieza a integrar desde cero...
while (xi <= fabs(x)){
u += exp(-xi*xi / 2) * step;
xi += step;
} // end while
u = u / sqrt(2*pi) + 0.5;
if (x < 0 ){
return (u - 0.5);
}
else{
return u;
}
}
/**************************************
Declaro la función rfactorial...
***************************************/
double rfactorial(int n){
double fi, i;
int j;
fi = i = 1.0;
j = 1;
while (j <= n){
fi /=i;
i = i + 1;
j++;
}
return fi;
}
Un ejemplo de corrida se da en seguida:
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.8 Simulación 07
45
Este programa simula la generacion de numeros
con distribucion normal a partir de una
variable aleatoria con distribucion uniforme...
Cuantos numeros desea generar? 10
1
2
3
4
5
6
7
8
9
10
u
u
u
u
u
u
u
u
u
u
=
=
=
=
=
=
=
=
=
=
0.00125126
0.56358531
0.19330424
0.80874050
0.58500931
0.47987304
0.35029145
0.89596240
0.82284005
0.74660482
Approx
Approx
Approx
Approx
Approx
Approx
Approx
Approx
Approx
Approx
=
=
=
=
=
=
=
=
=
=
0.50024959
0.56354406
0.53849867
0.80873107
0.58496935
0.59481027
0.56951744
0.89594475
0.82283187
0.74659295
x
x
x
x
x
x
x
x
x
x
=
=
=
=
=
=
=
=
=
=
0.00062563
0.15996089
0.09665212
0.87322977
0.21462296
0.23993652
0.17514573
1.25877805
0.92621113
0.66380659
Presione < S > para salir...
Un programa modificado que NO genera números aleatorios para la variable u,
sino que el usuario da los valores que desea que se generen es el siguiente:
/* Nombre del archivo: simulacion07FinalB.cpp
Descripción:
Este programa simula transformación inversa de la
distribución normal, esto es, a partir del valor de
u = Phi(x) calcula de manera aproximada x.
El usuario indica el valor u que está en el
intervalo (0,1)
------------------------------------------------------------------------------------------------------Autor: Efraı́n Soto Apolinar
Email: [email protected]
[email protected]
Fecha de última Modificación: 26 de febrero de 2008
Lenguaje de Programación: C++
Compilador: Dev - C++ Versión 4.9.9.2.
------------------------------------------------------------------------------------------------------*/
#include <iostream> // Funciones básicas para input/output
#include <stdlib.h> // para usar la función rand()
#include <math.h> // funciones matemáticas (pow (double))
#include <conio.h> // para usar: getche, getch
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
46
Introducción
#include <ctime> // clock_t = clock();
#include <cmath>
int errores; // variable global...
double rfactorial(int n);
// función...
double normal(double x); // función...
double intnormal(double x);
const double pi = 3.141592653589; // global
using namespace std;
int main(void){
char respuesta;
double x, xa, u, approx, approxa;
double step, error, errorx;
int j, total, cont, z;
char signo;
// para los dı́gitos...
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(8);
//
for (;;){
cout << "\nEste programa simula la generación de números";
cout << "\ncon distribucion normal a partir de un";
cout << "\nvalor dado por el usuario entre cero y uno...";
for (;;){
cout << "\n\n\ningresa un valor entre cero y 1: ";
cin >> u;
if (u < 0 && u > 1){
cout << "\nError en argumento...";
cout << "\n\n";
continue;
}
break;
} // end for para pedir u
//
x = 0;
// valor inicial supuesto (media)
z = 0;
if (u < 0.01){
step = u / 2;
}
else{
step = 0.25;
}
for (;;){
//
xa = x;
approx = normal(x);
// Decido si incremento o decremento x
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.8 Simulación 07
47
while (approx < u){
x += step;
approx = normal(x);
//cout << "\napprox <... " << approx;
z++;
}
step /= 1.5;
while (approx > u){
x -= step;
approx = normal(x);
//cout << "\napprox >... " << approx;
z++;
}
step /= 1.5;
if (approx < 0.0001 && fabs(x) > 3.999){
x = u / 2;
approx = normal(u);
}
// calculo el error relativo para x
if (fabs(xa - x) < 0.0001){
// Criterio para salir del ciclo...
cout << "\tu = " << u << "\tApprox = " << intnormal(x)
<< "\t x = " << x;
break;
}
} // end for que hace las iteraciones...
//
//} // end for cont = 1 to total;
//
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == ’S’)||(respuesta == ’s’)){
break; // Salir...
}
cout << "\n\n\n";
} // end for infinito...
return 0; // Salir...
}
/**************************************
Declaro la función normal...
***************************************/
double normal(double x){
double u = 0;
double un, ua, temp;
int i;
if (x < -4){
return 0;
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
48
Introducción
}
if (x > 4){
return 1;
}
for (i = 0 ; i < 40 ; i++){
ua = u;
u += pow(-0.5 * x * x,i) * rfactorial(i) / (2*i+1);
un = u;
} // endfor
if (x < 0 ){
u = 0.5 - u * x / sqrt(2*pi);
}
else{
u = 0.5 + u * x / sqrt(2*pi);
}
return u;
}
/**************************************
Declaro la función normal...
***************************************/
double intnormal(double x){
double u = 0;
double ua, up, ac;
double xi, step;
// xi es la iteracion actual
// step es el tamaño del paso...
int i;
step = 0.00000001; // El paso es 1 / 1000
xi = 0; // empieza a integrar desde cero...
while (xi <= fabs(x)){
u += exp(-xi*xi / 2) * step;
xi += step;
} // endfor
u = u / sqrt(2*pi) + 0.5;
if (x < 0 ){
return (u - 0.5);
}
else{
return u;
}
}
/**************************************
Declaro la función rfactorial...
***************************************/
double rfactorial(int n){
double fi, i;
int j;
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.8 Simulación 07
49
fi = i = 1.0;
j = 1;
while (j <= n){
fi /=i;
i = i + 1;
j++;
}
return fi;
}
Y los resultados obtenidos con este programna son:
Este programa simula la generaci=n de n·meros
con distribucion normal a partir de un
valor dado por el usuario entre cero y uno...
ingresa un valor entre cero y 1: 0.8423
u = 0.84230000
Approx = 0.84228995
x = 1.00391391
Presione < S > para salir...c
Este programa simula la generaci=n de n·meros
con distribucion normal a partir de un
valor dado por el usuario entre cero y uno...
ingresa un valor entre cero y 1: 0.56657
u = 0.56657000
Approx = 0.56654646
x = 0.16758842
Presione < S > para salir...
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
1.9 Simulación 07 (Reposición)
1.9
51
Simulación 07 (Reposición)
Elaborar un programa que genere números aleatorios con distribución normal.
El usuario debe ingresar la media de la muestra y su varianza.
• Se muestra en seguida el código del programa que se preparó en el lenguaje
C++ .
/* Nombre del archivo: simulacion07A.cpp
Descripción:
Este programa simula una variable aleatoria
con distribución normal, dados el promedio y la
varianza de la muestra.
------------------------------------------------------------------------------------------------------Autor: Efraı́n Soto Apolinar
Email: [email protected]
[email protected]
Fecha de última Modificación: 03 de febrero de 2008
Lenguaje de Programación: C++
Compilador: Dev - C++ Versión 4.9.9.2.
------------------------------------------------------------------------------------------------------*/
#include <iostream> // Funciones básicas para input/output
#include <stdlib.h> // para usar la función rand()
#include <math.h> // funciones matemáticas (pow (double))
#include <conio.h> // para usar: getche, getch
#include <ctime> // clock_t = clock();
double normal(double media, double sigma); // función...
const double pi = 3.141592653589793238462643;
using namespace std;
int main(void){
char respuesta;
double x, varianza, promedio;
int i, j, total;
//
for (;;){
cout << "\nEste programa simula experimentos con";
cout << "\ndistribucion normal a partir de una";
cout << "\nvariable aleatoria con distribución normal.";
//
cout << "\n\n\n¿Cuántos numeros desea generar? ";
cin >> total;
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
52
Introducción
cout << "\n\n\nPromedio de la muestra: ";
cin >> promedio;
cout << "\nVarianza de la muestra: ";
cin >> varianza;
varianza = sqrt(varianza);
//
for (j = 1; j <= total ; j++){
x = rand(); // Genera un aleatorio
// Imprimo el indice con el número generado...
cout << "\n " << j << "\t" << normal(promedio, varianza);
}
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == ’S’)||(respuesta == ’s’)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
}
return 0;
}
/**************************************
Declaro la función normal...
***************************************/
double normal(double media, double sigma){
double u, v, x, y, z;
u = double(rand()) / double(RAND_MAX);
v = double(rand()) / double(RAND_MAX);
x = sqrt(-2 * log(u)) * cos(2*pi*y);
if (u >= 0.5){
z = media + sigma * x;
}
else{
z = media - sigma * x;
}
return z;
}
Un ejemplo de corrida se muestra en seguida:
Este programa simula experimentos con
distribucion normal a partir de una
variable aleatoria con distribución normal.
¿Cuántos numeros desea generar? 25
Promedio de la muestra: 120
Varianza de la muestra: 15
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.9 Simulación 07 (Reposición)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
53
124.148
124.01
121.815
112.758
124.471
111.528
112.659
112.01
114.597
123.903
123.511
110.731
122.568
121.993
121.522
115.187
113.153
120.31
114.703
122.286
111.552
108.083
113.758
122.306
113.109
Presione < S > para salir...
Fuente bibliográfica del modelo matemático:
Autor: Banks, J.; Carson, J. S., Nelson, B.L.
Tı́tulo: Discrete–Event System Simulation
Editorial: Prentice Hall
Edición: 2da. Edición. 1 996.
Páginas: 341 – 343.
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
1.10 Simulación 08
1.10
55
Simulación 08
Simular la generación de números aleatorios con distribución uniorme con el
método de aceptación - rechazo.
Método del rechazo
Se aplica solamente para variables aleatorias continuas.
Tenemos una V.A.C. y conocemos su distribución.
Sea Y una variable aleatoria continua con densidad g y sabemos cómo simular
esta variable aleatoria con esta distribución.
Deseamos simular una V.A.C. X con densidad f .
Supongamos que U es una V.A.C. continua con distribución uniforme en el
intervalo [0, 1].
Ya sabemos simular U y Y .
Sea c una cota superior del siguiente conjunto:
f (x)
|x ∈ R
A=
g(x)
Podemos suponer que el conjunto A está acotado superiormente, es decir, estamos suponiendo que dicha c existe.
Para simular la V.A.C. X con densidad f , podemos hacer lo siguiente:
Paso 1: Simular Y y U .
Sea u el valor simulado de U , y sea y el valor simulado de Y .
Paso 2: Decidir
Si:
u≤
f (y)
c · g(y)
Entonces el valor simulado de X es y.
Si no, regresar al paso 1.
El valor de c es el número esperado de iteraciones que se deben realizar para
que la simulación nos genere un valor para la V.A.C. X. Por lo tanto, es muy
conveniente elegir a c como la mı́nima cota superior:
f (x)
c ≡ sup
|x ∈ R
g(x)
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
56
Introducción
•
El código del programa en el lenguaje C++ se muestra en seguida:
/* Nombre del archivo: simulacion08.cpp
Este programa simula la generación de números
aleatorios con duistribución normal
por el método de aeptación - rechazo.
------------------------------------------------------------------Autor: Efraı́n Soto Apolinar
Email: [email protected]
[email protected]
Fecha de última Modificación: 01 de marzo de 2008
------------------------------------------------------------------*/
#include <cstdio> // Otra librerı́a...
#include <cstdlib> // Librerı́a por si se requiere
#include <iostream> // Funciones básicas para input/output
#include <math.h> // funciones matemáticas
#include <conio.h> // para usar: getche, getch
// Defino las funciones que voy a usar...
double f(double y);
double g(double y);
//
using namespace std;
int main(void){
int i, total;
char respuesta;
double x, y, z, u;
// el valor de c = 1.315489247
// const double c = sqrt(2 * 2.718281828 / 3.141592653);
const double c = 1.315489247;
//
for (;;){ // for infinito...
cout << "\nEste programa simula la generacion de numeros";
cout << "\ncon distribucion normal con el metodo de ";
cout << "\naceptacion y rechazo...";
cout << "\n\nCuantos numeros desea generar... ";
cin >> total;
cout << "\n\n\n"; // un poco de espacio...
for (i = 1; i<= total ; i++){
x = double(rand()) / double(RAND_MAX); // aleatorio
z = double(rand()) / double(RAND_MAX); // aleatorio
if (z < 0.5){ // genero el valor de y
y = log(2 * z);
}
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.10 Simulación 08
57
else
{
y = - log(2 - 2 * z);
}
// x es el valor a comparar...
// y es el argumento de las funciones...
u = f(y) / (c * g(y));
if (u >= x){
// aceptar el valor...
cout << "\n" << i << "\t----->\t" << y;
}
}
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == ’S’)||(respuesta == ’s’)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
} // end for infinito...
return 0;
}
/*************************************
Defino la función f(y)
**************************************/
double f(double y){
return 0.39894228 * exp(- y * y / 2) ;
// el factor 0.39894228 = 1 / sqrt(2 * 3.141592653);
}
/*************************************
Defino la función g(y)
**************************************/
double g(double y){
return exp(-fabs(y)) / 2;
}
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
1.11 Movimiento Browniano
1.11
59
Movimiento Browniano
Proceso de Brown. Bt≥0
3 Cada Bt es una variable aleatoria contı́nua, salvo B0 = (0, 0).
3 Bt presenta una distribución normal con media 0 y varianza proporcional
al tiempo.
Bt,i ∼ N (0, αt)
{α > 0, α ∈ R}
3 Bt tiene dos componentes: Bt = (Bt,1 , Bt,2 ), siendo Bt,1 independiente de
Bt,2 con la misma distribución para cada valor de t.
3 Si t1 ≤ t2 ≤ t3 ≤ t4 , i ∈ 1, 2, entonces las variables aleatorias Bt2 ,i − Bt1 ,i
y Bt4 ,i −Bt3 ,i son independientes y tienen media 0 y varianza proporcional
a α (t2 − t1 ) y α (t4 − t3 ), respectivamente.
En general, Bt,i − Bs,i tiene distribución normal con media cero y varianza
α |t − s|, ∀t, s ≥ 0 con t 6= s.
Propiedad: Si (Bt )t≥0 es un proceso Browniano, entonces la probabilidad
de que el proceso sea contı́nuo con respecto al tiempo es 1. Sin embargo, la
probabilidad de que su trayectoria sea derivable en algún punto es cero.
Propiedad: Si t1 > t0 > 0, entonces, la trayectoria del proceso (Bt )t≥0 de t0 a
t1 tiene longitud infinita.
1.11.1
Bosquejo de experimento
Supongamos que conozco α = 1, de un proceso browniano. Si conozco la
posición de la partı́cula en n puntos, deseo conocer una aproximación de la
posición de la partı́cula para algún punto s que estuvo entre los puntos xi , xi+1 .
El promedio “esperado” de s es la media ponderada.
Una posible varianza serı́a la media geométrica: σ 2 = (v − s)(s − u)
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
60
Introducción
Bt (w)
Bs
Bu
Bv
u
O
s
v
t
Desconocemos x1 = Bs . Sabemos que x1 depende de x0 y de x2 , siendo x0 =
Bu , x1 = Bs y x2 = Bv .
Definimos: X = Bu , Y = Bs , W = Bv .
X es una variable aleatoria con distribución normal, media cero y varianza u:
X → N (0, u). De manera semejante:
Y
→
N (0, s)
W
→
N (0, v)
Las funciones de densidad de la variables aleatorias son:
x2
exp −
2u
X = fX (x) = √ √
u 2π
x2
exp −
2s
Y = fY (x) = √ √
s 2π
x2
exp −
2v
W = fW (x) = √ √
v 2π
Ahora calculamos la densidad de s condicionada por el valor de la variable
aleatoria X:
(x − x0 )2
exp −
v−u
p
fY |X=x0 =
π (v − u)
De manera semajante:
(x − x2 )2
exp −
v−u
p
=
π (v − u)
fY |W =x2
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.11 Movimiento Browniano
61
Podemos considerar como una variable aleatoria a Y |X = x0 y W |X = x0
condicionada cada una a W .
Supongamos que conocemos la distribución conjunta: fU,V (x, y):
fu (x)
=
Z∞
f (x, y) dy
−∞
Z∞
fv (x)
=
f (x, y) dy
−∞
También necesitamos calcular la distribución marginal condicionada.
Distribución bivariada
fXY = fX · fY |X
⇒
fY |X =
fXY
fX
Consideremos tres puntos. Conocemos t0 y x0 . Tenemos un movimiento browniano con varianza ∆t.
Bt (w)
x1
x0
x2
O
t0
t1
t2
t
La densidad de xt1 es normal con media x0 y varianza t1 − t0 ; la densidad de
xt2 es también normal y con media x0 y varianza t2 − t0 .
La densidad condicional de Xt2 dado que Xt1 = x1 es normal con media x1 y
varianza t2 − t1 .
Entonces, la densidad conjunta de (Xt1 , Xt2 ) está dada por:
La simulación que se generó en el lenguaje C++ se muestra enseguida:
/* Nombre del archivo: simulacion09.cpp
Este programa simula un movimiento browniano.
----------------------------------
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
62
Introducción
---------------------------------Autor: Efraı́n Soto Apolinar
Email: [email protected]
[email protected]
Fecha de última Modificación: 01 de marzo de 2008
------------------------------------------------------------------*/
#include <cstdio> // Otra librerı́a...
#include <cstdlib> // Librerı́a por si se requiere
#include <iostream> // Funciones básicas para input/output
#include <math.h> // funciones matemáticas
#include <conio.h> // para usar: getche, getch
#include <fstream> // para grabar datos generados...
//
const double PI = 3.141592653;
// función para generar los números pseudoaleatorios
// con distribución normal...
double dnormal(double media, double sigma);
double dnormal(void);
// Función para generar un número pseudoaleatorio
// con distribución uniforme en el intervalo (0,1)
double uniforme(void);
using namespace std;
int main(void){
char respuesta, semilla;
double t, step, tiempo; // escala de tiempo.
double xn, x = 0; // posición de la partı́cula.
double media, sigma; // parámetros de dist. Normal.
int i = 0;
//
for (;;){ // for infinito...
cout << "\nEste programa simula un ";
cout << "movimiento browniano ";
cout << "\n\nTiempo en segundos a simular: ";
cin >> tiempo;
for (;;){
cout << "\nIntervalo entre dos posiciones
consecutivas (seg): ";
cin >> step;
if (step <= 0){
cout << "\n\nEl intervalo debe ser un numero
positivo...";
cout << "\nPreferentemente menor a un segundo.";
}
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.11 Movimiento Browniano
63
else{ // ingresó un step positivo...
break;
cout << "\n\n\n";
}
}
cout << "\nMedia de la posicion: ";
cout << "\n(Presione 0 (cero) si la desconoce): ";
cin >> media;
cout << "Desviacion estandar de la posicion...";
cout << "\n(Presione 0 si la desconoce): ";
cin >> sigma;
if (sigma == 0){
sigma = 1;
}
for (;;){ // hasta que presione S ó N
cout << "\n\nDesea iniciar la semilla? [S/N]";
cin >> semilla;
if (semilla == ’S’ || semilla == ’s’){
srand(time(0));
cout << "\n\nSe reinicia la semilla...";
break; // salir del for infinito
}
if (semilla == ’N’ || semilla == ’n’){
cout << "\n\nNo se reinicia la semilla...";
break; // salir del for infinito
}
cout << "\n\nError en argumento...";
} // end for infinito para la semilla
cout << "\n\n\n"; // un poco de espacio...
t = 0; // reinicio el tiempo del experimento...
ofstream out_stream; // escritura de datos...
out_stream.open("brown.txt"); // creo y abro el archivo...
if (out_stream.fail()){ // si no puede abrir el archivo...
cout << "\n\nNo se pudo abrir el archivo...";
cout << "\nPor favor, reinicie el programa...";
exit(1); // Termina el programa
}
out_stream << "\n";
out_stream << "# Simulacion de un movimiento
Browniano" << "\n";
out_stream << "# el eje t representa al tiempo" << "\n";
out_stream << "# y el eje x (vertical) representa la
posicion..." << "\n";
out_stream << "# Los datos van desde t = 0 hasta t = "
<< tiempo << ".\n";
out_stream << "0 0 i\n"; // Primer dato...
for (t = step; t <= tiempo ; t += step){
x = dnormal(media, sigma);
out_stream << t << " " << x << " i\n";
i++;
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
64
Introducción
}
cout << "\n\n\nSe han grabado " << i << " datos en
el archivo";
cout << "\nbrown.txt\n";
out_stream << "# Este archivo contiene " << i << " datos.";
// pregunto si desea salir...
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == ’S’)||(respuesta == ’s’)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
} // end for infinito...
return 0;
}
/**************************************
Declaro la función DNORMAL...
***************************************/
double dnormal(double media, double sigma){
/*
Esta función genera números pseudoaleatorios
con distribución uniforme a partir de su media
y su desviación estándar.
*/
double u, v, x, y, z;
u = uniforme();
y = uniforme();
x = sqrt(-2 * log(u)) * cos(2 * PI * y);
if (u >= 0.5){
z = media + sigma * x;
}
else{
z = media - sigma * x;
}
return z;
}
/**************************************
Declaro la función DNORMAL...
***************************************/
double dnormal(void){
/*
Esta función genera números pseudoaleatorios
con distribución uniforme.
*/
double u, x, y, z;
// Como no se definen la media y
// desviación estándar, las defino...
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.11 Movimiento Browniano
65
double media = 0, sigma = 1;
u = uniforme();
y = uniforme();
x = sqrt(-2 * log(u)) * cos(2 * PI * y);
if (u >= 0.5){
z = media + sigma * x;
}
else{
z = media - sigma * x;
}
return z;
}
/**************************************
Declaro la función UNIFORME...
***************************************/
double uniforme(void){
// Esta función genera un número pseudoaleatorio
// con distribución uniforme en el intervalo (0,1).
return (double(rand())/double(RAND_MAX));
}
Y la gráfica que muestra los resultados que se generaron con esta simulación es:
Bt
3
2
1
t (s)
0
1
2
3
4
5
6
7
−1
−2
−3
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
1.12 Simulación 11
1.12
67
Simulación 11
Escribir un programa con una función que genere números pseudo-aleatorios
con distribución uniforme.
La función debe ser creada por el autor del programa. NO se permite utilizar
la función rand() definida en ANSI-C o en C++ .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
---------------------------------Nombre del Archivo: uniforme.cpp
Descripción:
Este programa simula la generación de números
pseudoaleatorios con distribución uniforme.
Tiene definidas las funciones:
- void suniforme(int seed);
- double uniforme(void);
- double uniforme(float a, float b);
que se diseñaron por el autor de este
programa.
Autor: Efraı́n Soto Apolinar
Email: [email protected]
[email protected]
Fecha de última Modificación: 08 de mayo de 2008
17
18
19
20
21
22
23
24
------------------------------------------------------------------*/
#include <cstdio> // Otra librerı́a...
#include <cstdlib> // Librerı́a por si se requiere
#include <iostream> // Funciones básicas para input/output
#include <math.h> // funciones matemáticas
25
26
27
28
29
30
// reinicializar la semilla del aleatorio
void suniforme(int seed);
double uniforme(void);
double uniforme(float a, float b);
void duniforme(void);
31
32
33
// Constantes para las funciones:
const long PROBABILITY_RAND_MAX = 2147483647; // = 2ˆ31 - 1;
34
35
36
37
38
39
int main(int argc, char *argv[]){
char respuesta, distribucion;
double lambda; // promedio de la exponencial
int i, j;
for(;;){ // for infinito...
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
68
Introducción
40
41
42
43
printf("\n\nEste programa genera números aleatorios");
printf("\ncon distribución uniforme...");
// Llamo la función para generar los histogramas...
duniforme();
44
45
46
47
48
49
50
51
52
53
54
55
56
// pregunto si desea salir...
scanf("%c", &respuesta);
printf("\n\n\nPresione < S > para salir... ");
scanf("%c", &respuesta);
if ((respuesta == ’S’)||(respuesta == ’s’)){
break; // Salir del ciclo for inicial...
}
printf("\n\n\n");
} // end for infinito...
// system("PAUSE");
return 0;
}
57
58
59
60
61
62
63
64
65
66
67
68
69
/***************************************************
suniforme(int):
Esta función reinicia la semilla del generador
de números pseudo-aleatorios de la función
double uniforme(void).
****************************************************/
void suniforme(int seed){
static int semilla = seed;
//printf("\n\n\nPasó este punto...");
static bool first = false;
return;
}
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/***************************************************
uniforme(void):
Esta función genera un número pseudo-aleatorio
con distribución uniforme en el intervalo (0,1).
****************************************************/
double uniforme(void){
double u;
int primo1 = 8191; // = 2ˆ13 - 1;
int primo2 = 524287; // = 2ˆ19 - 1;
static int semilla = 1001; // semilla inicial
static bool first = true;
if (first){
first = false;
return ((double)(semilla)/((double)
(PROBABILITY_RAND_MAX)));
}
unsigned modular = semilla;
//
modular = (primo1 * modular + primo2) %
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.12 Simulación 11
PROBABILITY_RAND_MAX;
semilla = modular; // cambio la semilla...
// calculo el valor que me va a devolver...
u = (double)(modular) / ((double)
(PROBABILITY_RAND_MAX));
return (u);
90
91
92
93
94
95
96
69
}
97
98
99
100
101
102
103
104
105
106
/***************************************************
uniforme(float a, float b):
Esta función genera un número pseudo-aleatorio
con distribución uniforme en el intervalo (a,b).
****************************************************/
double uniforme(float a, float b){
double x = (double)(a) + uniforme() * (double)(b - a);
return x;
}
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/**************************************
Declaro la función DUNIFORME..
***************************************/
void duniforme(void){
/*
Para generar los números
con distribución uniforme...
*/
// divido el intervalo (0,1) en 10
// subintervalos de igual longitud
// I1 almacenará el número de números
// que caigan en el intervalo (0,0.1)
int I[9]; // los intervalos...
int errores = 0, max =0, min = 1000000;
int imax, imin;
int total; // cuántos vamos a generar...
int semilla;
int correcto = 0;
int i, j; // contadores
float x; // el número generado...
double escala; // para hacer la gráfica...
int factor; // para hacer la gráfica...
float a, b; // Lı́mites del intervalo
char seedu; // para saber si quiere indicar la semilla...
//
printf("\nIndique el lı́mite inferior del intervalo: ");
scanf("%f", &a);
printf("\nIndique el lı́mite superior del intervalo: ");
scanf("%f", &b);
for(;;){ // hasta que ingrese un número entero positivo
printf("\nIndique cuantos numeros desea generar: ");
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
70
Introducción
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
scanf("%d", &total);
if (total <= 0){
printf("\n\nError en argumento...");
printf("\nPor favor, ingrese un número entero positivo...");
printf("\n\n\n");
continue;
}
break;
}
for(;correcto == 0;){ // hasta que reinicie la semilla
printf("\n\nDesea reiniciar la semilla del aleatorio?
[S/N]");
scanf("%c", &seedu);
if (seedu == ’S’ || seedu == ’s’){
for(;;){ // Inicia for infinito ... [A]
printf("\nIndique el valor de la semilla:
(Número Entero) ");
scanf("%i", &semilla);
if (semilla == 0){
//printf("\n\n\nPasó este punto...");
suniforme((int)(time(0)));
printf("\n\nSe ha reiniciado la semilla del
aleatorio...");
printf("\nCon el reloj de la computadora...");
printf("\n\n");
correcto = 1;
break;
}
else{
if (semilla > 0){
suniforme(unsigned(semilla));
printf("\n\nSe ha reiniciado la semilla
del aleatorio...");
correcto = 1;
break;
}
else{ // No tecleó un entero positivo...
printf("Error en argumento...");
printf("\nPor favor, intente de nuevo...");
continue; // regresar a pedir la semilla.
}
} // End else...
} // end for infinito... [A]
}
if (seedu == ’N’ || seedu == ’n’){
printf("\n\nNo se reinicia la semilla del
aleatorio...\n\n");
break;
}
if (correcto == 0){
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
1.12 Simulación 11
printf("\n\nError en argumento...");
printf("\nPor favor, intente de nuevo...");
190
191
}
192
193
71
}
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
// Limpio la memoria del arreglo:
for (i = 0 ; i <= 9 ; i++){
I[i] = 0;
}
for (i = 0; i <= total; i++){
// Genero un pseudoaleatorio
x = uniforme(a, b);
for (j = 0 ; j <= 9 ; j++){
if (x > (a + 0.1 * j * (b - a)) && x <
(a + 0.1 * (j + 1) * (b - a))){
I[j]++;
}
}
}
// Encuentro el intervalo con
// mayor número de ocurrencias
for (i = 0; i <= 9 ; i++){
if (I[i] > max){
max = I[i];
imax = i;
}
if (I[i] < min){
min = I[i];
imin = i;
}
}
// Ahora imprimo los resultados...
for (i = 0 ; i <= 9 ; i++){
printf("\n Intervalo %.1f -- %.1f ", (1.0 * i * (b - a)/
10 + a), (1.0 * (i+1) * (b - a) / 10 + a));
escala = 35.0 * I[i] / max;
factor = int(escala + 0.5); // redondeo
// Imprime la barra del intervalo (i-1)
for (j = 0 ; j <= factor ; j++){
printf("|");
} // termina de imprimir la barra...
if (i == imax){
printf(" (%i) [Max]\n", I[i]);
continue;
}
if (i == imin){
printf(" (%i) [Min]\n", I[i]);
continue;
}
printf(" (%i) \n", I[i]);
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
72
Introducción
240
241
242
}
return;
} // Fin de la función DUNIFORME
Un ejemplo de corrida es la siguiente:
Este programa genera n·meros aleatorios
con distribuci 34 n uniforme...
Indique el lÝmite inferior del intervalo: 0
Indique el lÝmite superior del intervalo: 10
Indique cuantos numeros desea generar: 12000000
Desea reiniciar la semilla del aleatorio? [S/N]s
Indique el valor de la semilla: (N·mero Entero) 0
Se ha reiniciado la semilla del aleatorio...
Con el reloj de la computadora...
Intervalo
Intervalo
Intervalo
Intervalo
Intervalo
Intervalo
Intervalo
Intervalo
Intervalo
Intervalo
0.0
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
-----------
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
10.0
|||||||||||||||||||||||||||||||||||| (1226331)
||||||||||||||||||||||||||||||||||| (1209130)
||||||||||||||||||||||||||||||||||| (1204179)
||||||||||||||||||||||||||||||||||| (1202058)
|||||||||||||||||||||||||||||||||||| (1224251)
||||||||||||||||||||||||||||||||||| (1207161)
|||||||||||||||||||||||||||||||||||| (1238754) [Max]
|||||||||||||||||||||||||||||||||| (1162282)
||||||||||||||||||||||||||||||||| (1128922)
||||||||||||||||||||||||||||||||||| (1196933)
Presione < S > para salir...
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
2
Proyecto Final
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
2.1 Simulación del Recurso Eólico
2.1
2.1.1
75
Simulación del Recurso Eólico
Energı́a extraida del viento
Un generador eólico utiliza la energı́a cinética del viento para generar electricidad.
Lo que pasa en realidad es que la energı́a del viento es transferida a un rotor
que tiene dos o más aspas acopladas mecánicamente al generador eléctrico.
La enegı́a cinética que contienen m kilogramos de viento que se mueve a velocidad v [m/s] es:
1
Ek = mv 2
2
Sin embargo, generalmente no conocemos la masa de aire que atravesarán las
aspas del generador eólico, ası́ que es una mejor idea expresarlo con términos
de la densidad y la velocidad del viento.
Por definición, la densidad ρ del viento es igual al cociente de su masa al volumen. De donde, m = ρ · V .
Podemos ver el volumen de aire que atraviesan las aspas del generador eólico
como el cilindro de altura v · t y área de base igual al área A [m2 ] que barren las
aspas del generador. Entonces, por unidad de tiempo, el volumen de aire que
atraviesan las aspas del generador eólico es:
V =A·v
Flujo volumétrico (m3 /s)
Ası́ que la energı́a cinética del viento con velocidad v puede expresarse como:
P =
1
ρAv 3
2
potencia (W)
El recurso eólico de dos sitios distintos se compara en base a la potencia eólica
especı́fica, es decir, por cada metro cuadrado de área que barren sus aspas.
Sabemos que la potencia eólica especı́fica varı́a con el cubo de la velocidad del
viento.
√
Considerando que 3 2 ≈ 1.2599, podemos darnos cuenta que cuando la velocidad
del viento aumenta en un 25.99% la potencia generada crece al doble. Por otra
parte, si la velocidad del viento disminuye el mismo porcentaje, la potencia
generada disminuye a la mitad.
√
También, 3 3 ≈ 1.4422 nos indica que si la velocidad del viento crece un 44.22%,
la potencia eléctrica generada aumentará al triple, mientras que si la velocidad
del viento disminuye en esa misma cantidad, la potencia generada disminuirá a
la tercera parte.
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
76
Proyecto Final
He aquı́ la importancia de caracterizar la distribución de la velocidad del viento
para poder determinar correctamente la potencia generada en un sitio especı́fico.
La energı́a extraida del viento es igual a la diferencia de la energı́a cinética del
viento que atraviesa el generador antes y después de pasar a través de él:
P0 =
1
· ṁ · (v 2 − v02 )
2
donde P0 es la potencia [W] absorvida por el generador, ṁ es el flujo másico
[kg/s], v es la velocidad del viento [m/s] al entrar al generador y v0 es la velocidad
del viento [m/s] después de atravesar el generador.
La velocidad del viento es discontinua de v a v0 en el plano de las aspas del
generador. El flujo másico del viento a través de las aspas se calcula multiplicando la densidad por la velocidad promedio:
v + v0
ṁ = ρ · A ·
2
La potencia mecánica que mueve al rotor, que mueve finalmente al generador
eléctrico es:
1
v + v0
P0 =
ρA ·
· (v 2 − v02 )
2
2
Esta expresión puede reescribirse como:
P0 =
1
ρ A · v3
2
v 2 v0 0
1+
1−
v
v
2
Podemos definir:
v 2 v0 0
1+
1−
v
v
Cp =
2
que representa la fracción del viento que “aprovechan” las aspas del generador
eólico.
Para velocidades de entrada del viento a las aspas del generador eólico, los
valores de Cp dependen de la proporción v0 /v, alcanzando un máximo cuando
este cociente es igual a 1/3. Entonces, Cp = 16/27 ≈ 0.5926.
La máxima potencia transmitida a las aspas ocurrirá cuando v = 3 v0 , o bien,
cuando Cp = 0.5926. Entonces,
P0 =
1
ρ A · v 3 · (0.59)
2
En diseños prácticos de aspas, el valor máximo alcanzado es de aproximadamente 0.5 para turbinas de alta velocidad que trabajan con dos aspas, y entre
0.2 y 0.4 para turbinas de baja velocidad con más aspas.
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
2.1 Simulación del Recurso Eólico
77
Considerando Cp = 0.5 obtenemos una expresión más simple:
P0 =
2.1.2
1
ρ A · v3
4
Distribución del viento
Dato que el viento se origina con las diferencias de densidad en el aire debido
a los cambios de temperatura que el sol ocasiona en el aire atmosférico, con
la colaboración del movimiento rotativo de la tierra, los patrones de viento
generalmente se repiten con periodicidad de un año.
Dado que la potencia generada con un generador eólico es proporcional al cubo
de la velocidad del viento, su distribución se convierte en la medición más importante para determinar la cantidad de energı́a que un sitio considerado.
El comportamiento de la velocidad del viento nunca es estable. Depende de
muchos factores, entre el clima, la topografı́a del lugar y la altura en la que se
mide a partir del suelo.
La velocidad del viento cambia continuamente, por lo que la velocidad promedio
debe basarse en mediciones de al menos una década. De esta manera tendremos
mayor confianza en el valor asignado al sitio. Sin embargo, medir la velocidad
del viento por 10 años requiere de una inversión grande además de que un
proyecto generalmente no puede esperar tanto. En los casos en que se tienen
poca información, se mide la velocidad del viento y ésta se compara con la
velocidad medida en otro sitio cercano y a partir de estas consideraciones se
realiza una estimación del promedio anual del sitio considerado.
Las variaciones de la velocidad del viento se pueden describir por una función
de distribución de probabilidad.
2.1.2.1
Distribución Weibull
La distribución de la velocidad del viento en una localidad puede descibirse
utilizando al distribución Weibull con el parámetro k de forma y el parámetro
c de escala.
La probabilidad de que la velocidad de viento sea de v m/s durante algún
intervalo de tiempo dado es:
v k−1 −(v/c)k
k
h(v) =
e
para 0 < v < ∞
c
c
En la gráfica de distribución de probabilidad se grafica h vs. v para distintos
intervalos de tiempo, donde:
Fracción de tiempo en que la velocidad del viento está entre v y v + ∆v
h=
∆v
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
78
Proyecto Final
Por definición de la función de probabilidad, la probabilidad de que la velocidad
del viento esté entre cero e infinito en ese periodo de tiempo es igual a uno:
Z∞
h dv = 1
0
Si elegimos el periodo de tiempo igual a un año, y expresamos la integral en
términos del número de horas en un año, entonces tenemos:
h=
Número de horas que la velocidad del viento está entre v y v + ∆v
∆v
Las unidades de h son horas por año por metros por segundo, y la integral se
convierte en 8 760, el número total de horas en el año, en lugar de la unidad.
Para la distribución Weibull con valor de k = 1 tenemos la distribución exponencial. En el caso k = 2 la distribución se conoce como distribución Rayleigh.
Este tipo de distribución es el que presenta la velocidad de viento en muchos
sitios.
2.1.2.2
Distribución Rayleigh
• Distribución Rayleigh:
2
f (x)
=
Φ(u)
=
2 αxe−αx para x > 0
0
para x ≤ 0
donde: α > 0 u 2
2u
exp
−
c2
c
Para esta distribución:
µ =
σ2
2.1.2.3
=
r
1 π
2 α
1 π
1−
α
4
Distribución de energı́a
Si definimos la función de densidad de energı́a como:
e=
Contribución en kWh al año por las velocidades entre v y v + ∆v
∆v
podremos graficar esta distribución y la distribución de probabilidad de la velocidad y conocer a partir de qué velocidad el número de horas que el viento
presenta esa velocidad, decrece más rápido que v 3 . Este valor nos indicará un
decremento neto en la contribución energética anual global.
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
2.1 Simulación del Recurso Eólico
2.1.2.4
79
Anemómetros digitales
La velocidad promedio de un sitio en un periodo de tiempo se calcula sumando
muchas lecturas en ese periodo de tiempo entre el número de lecturas. La
mayorı́a de los anemómetros se instalaban con el propósito de medir la velocidad
del viento y no con propósitos de la medición del recurso energético. Ası́ que el
promedio calculado como se indicó se realizaba de manera semejante para una
hora, un dı́a y para un año:
n
1X
v̄ =
vi
n i=1
Pero para estimar el recurso eólico disponible en un lugar necesitamos calcular:
v
u n
u1 X 3
3
v
vrmc = t
n i=1 i
La expresión anterior no toma en cuenta la densidad del aire, que también afecta
la cantidad de energı́a producida por el viento. Para calcular el recurso eólico
de un sitio se recomienda utilizar la siguiente fórmula:
n
Prmc =
1 X
ρi vi3
2 n i=1
donde n es el número de mediciones realizadas, ρi es la densidad del aire [kg/m3 ]
en el momento de realizar la i-ésima medición y vi es la velocidad del viento
[m/s] en la i-ésima medición, y Prmc representa la densidad de energı́a promedio.
2.1.2.5
Predicción del recurso eólico
La energı́a que podemos aprovechar del viento depende de su velocidad, la cual
es una variable aleatoria. Para el operador de la granja eólica esto representa
una dificultad para designar el despacho de energı́a a la red, además de que no
se conoce la cantidad de energı́a disponible con anticipación.
Sin embargo, si la velocidad del viento puede pronosticarse con varias horas
de anticipación, podemos despachar la energı́a de una manera cómoda. Alexiadis, et al1 , han propuesto una nueva técnica para pronosticar la velocidad del
viento y la cantidad de energı́a producida con muchas horas de anticipación. La
técnica está basada en correlación cruzada en sitios vecinos y redes artificiales
neuronales. La técnica propuesta puede mejorar significativamente la precisión
de las predicciones comparado con el modelo comúnmente usado. El modelo
propuesto se calibra en diferentes sitios en un periodo de un año.
1 Alexiadis, M. C., Dokopoulos, P. S., and Sahsamanogdou, H. S. 1998. Wind Speed and
Power Forecasting Based on Spatial Correlation Models, IEEE Paper No. PE-437-EC-0-041998.
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
80
Proyecto Final
2.1.3
Un caso especı́fico
• La Venta, Oaxaca. México2 .
– El viento presenta Distribución Weibull.
– Velocidad promedio del viento: 9.3 m/s.
– k = 1.77, c = 11.86 m/s a una altura de 32 metros.
– k = 1.73, c = 10.44 m/s a una altura de 15 metros.
2.1.4
Implementación
Enseguida se muestra el código de la implementación elaborada en el lenguaje
C++ .
/* Nombre del archivo: windFinal.cpp
Este programa simula la velocidad de viento de
una localidad de acuerdo a la distribución que
se especifique.
Calcula además, la densidad de recurso eólico
local (Watts/metro cuadrado) y en el caso de
la distribución Weibull, calcula la velocidad
de viento promedio como media ponderada de la
velocidad media de cada intervalo por la
probabilidad de que el viento presente esa
velocidad.
------------------------------------------------------------------Autor: Efraı́n Soto Apolinar
Email: [email protected]
[email protected]
Fecha de última Modificación: 01 de mayo de 2008
------------------------------------------------------------------*/
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <math.h>
#include <conio.h>
#include <fstream>
//
double uniforme (void);
double weibull(double c, double k);
//
void duniforme(void);
void drayleigh(void);
void dweibull(void);
float windPower(double windSpeed);
using namespace std;
int main(void){
char respuesta, semilla;
int i = 0;
2 Fuente: Evaluación del recurso eólico de La Venta, Juchitán, Oaxaca. M. A. Borja, O. A.
Jaramillo, M. F. Morales. Instituto de Investigaciones Eléctricas. Temixco, Morelos, México.
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
2.1 Simulación del Recurso Eólico
81
int continuar;
char distribucion;
for (;;){ // for infinito...
//continuar = 0;
cout << "Este programa simula el Recurso Eolico";
cout << "\nde un sitio dados los parametros de su distribucion.";
for (;;){ // hasta que presione S ó N
cout << "\n\nDesea iniciar la semilla del aleatorio? [S/N] ";
cin >> semilla;
if (semilla == ’S’ || semilla == ’s’){
srand(time(0));
cout << "Se reinicia la semilla...";
break; // salir del for infinito
}
if (semilla == ’N’ || semilla == ’n’){
cout << "No se reinicia la semilla...";
break; // salir del for infinito
}
cout << "\n\nError en argumento...";
} // end for infinito para la semilla
cout << "\n\nSeleccione la distribucion estadistica ";
cout << "\nque presenta el viento de la localidad: ";
cout << "\n[R] Rayleigh.";
cout << "\n[W] Weibull.";
cout << "\n[C] Cancelar...";
cout << "\nIngrese una opcion: ";
cin >> distribucion;
switch (distribucion){
case ’R’:
drayleigh();
break;
case ’r’:
drayleigh();
break;
case ’W’:
dweibull();
break;
case ’w’:
dweibull();
break;
case ’C’:
break;
case ’c’:
break;
default:
cout << "\n\nError en argumento...";
cout << "\nPor favor, intente de nuevo...";
continuar = 1;
} // end switch
if (continuar == 0){
// se debe salir...
break;
}
// pregunto si desea salir...
cout << "\n\nPresione < S > para salir... < C > para continuar...";
respuesta = getche();
if ((respuesta == ’S’)||(respuesta == ’s’)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
respuesta = getche();
} // end for infinito...
return 0;
}
/**************************************
Declaro la función UNIFORME...
***************************************/
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
82
Proyecto Final
double uniforme(void){
// Esta función genera un número pseudoaleatorio
// en el intervalo (0,1) con distribución uniforme.
return (1.0 * rand()/(1.0 * RAND_MAX));
}
/**************************************
Declaro la función WEIBULL...
***************************************/
double weibull(double c, double k){
// Esta función genera números pseudoaleatorios
// con distribución Weibull
double x;
x = c * pow(-log(1 - uniforme()), 1/k);
return x;
}
/**************************************
Declaro la función RAYLEIGH...
***************************************/
double rayleigh(double media){
// Esta función genera números pseudoaleatorios
// con distribución rayleigh
// Fuente:
// http://www.brighton-webs.co.uk/distributions/rayleigh.asp
double factor, r;
factor = media / 1.253314;
r = sqrt(-2 * factor * factor * log(uniforme()));
return r;
}
/**************************************
Declaro la función DWEIBULL..
***************************************/
void dweibull(void){
/*
Para simular viento con distribución Weibull...
*/
int I[24]; // los intervalos...
int max =0, min = 1000000;
int i = 0, j; // contadores
double x; // el número generado...
double escala; // para hacer la gráfica...
int factor; // para hacer la gráfica...
double c, k; // parámetros alpha y beta
double t; // tiempo
float velocidadProm = 0; // Velocidad Promedio
float sv3 = 0;// suma de cubo de velocidad
float densidadEnergetica;
float energia = 0; // Energia anual
//
cout << "\nValor del parametro c: ";
cin >> c; // alpha
cout << "Valor del parametro k: ";
cin >> k; // beta
t = 0; // reinicio el tiempo del experimento...
FILE* f = fopen("speedwei.txt", "w+");
// limpio la memoria del array...
for (i = 0 ; i <= 24 ; i++){
I[i] = 0;
}
for (t = 0; t < 8760; t++){
x = weibull(c, k);// Genero un pseudoaleatorio
fprintf(f, "%f\n", x); // grabo en archivo...
sv3 += pow(x, 3.0) / 4.0;
energia += windPower(x);
for (i = 0 ; i <= 24 ; i++){
if ((x > 0.1 * i * c) && (x <= 0.1 * (i + 1) *c)){
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
2.1 Simulación del Recurso Eólico
83
I[i]++;
break;
}
}
}
fclose(f);
// Calculo la velocidad promedio...
for (i = 0 ; i <= 24 ; i++){
velocidadProm += 1.0 * I[i] * c / 8760;
}
velocidadProm = velocidadProm * 465 / 593; // factor de escala...
// Encuentro el intervalo con mayor número de ocurrencias
for (i = 0; i <= 24 ; i++){
if (I[i] > max){
max = I[i];
}
if (I[i] < min){
min = I[i];
}
}
for (i = 0 ; i <= 24 ; i++){
printf("\n%.2f m/s -- %.2f m/s ", (0.1 * i * velocidadProm),
(0.1 * (i+1) * velocidadProm));
escala = 35.0 * I[i] / max;
factor = (int)(escala + 0.5); // redondeo
// Imprime la barra del intervalo (i-1)
for (j = 0 ; j <= factor ; j++){
cout << "|";
} // termina de imprimir la barra...
if (I[i] == max){
cout << " (" << I[i] << ") [Maximo]";
continue;
}
if (I[i] == min){
cout << " (" << I[i] << ") [Minimo]";
continue;
}
cout << " (" << I[i] << ")";
}
printf("\n\nVelocidad Promedio del viento: %.2f m/s.",
velocidadProm);
// calculo recurso energético...
densidadEnergetica = sv3 / (2 * 8760);
printf("\nDensidad energetica promedio: %.3f W/mˆ2",
densidadEnergetica);
printf("\nEnergia anual estimada: %.2f W-hr/mˆ2.",
energia);
return;
} // Fin de la función DWEIBULL
/**************************************
Declaro la función DRAYLEIGH..
***************************************/
void drayleigh(void){
int I[24]; // los intervalos...
int max =0, min = 1000000;
int total; // cuántos vamos a generar...
int i, j; // contadores
int imax, imin;
double t;
double x; // el número generado...
float sv3 = 0.0;
float densidadEnergetica;
float energia = 0; // Energia anual
float media; // parámetro de la distribución
double escala; // para hacer la gráfica...
int factor; // para hacer la gráfica...
FILE* f = fopen("speedray.txt", "w+");
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
84
Proyecto Final
for(;;){// hasta que indique el valor de lambda
cout << "\nIntroduzca la velocidad media del viento: ";
scanf("%f", &media);
if (media <= 0.0){
cout << "\n\nEl valor debe ser positivo...";
cout << "\nPor favor intente de nuevo...\n";
continue;
}
break;
}
// limpio la memoria del array...
for (i = 0 ; i <= 24 ; i++){
I[i] = 0;
}
for (t = 0; t < 8760; t++){
x = rayleigh(media);// Genero un pseudoaleatorio
x = x * 593 / 465;
fprintf(f, "%f\n", x); // grabo en archivo...
sv3 += pow(x, 3.0) / 4;
energia += windPower(x);
for(i = 0 ; i <= 24 ; i++){
if ((x > 0.1 * i * media) && (x <= 0.2 * (i + 1) * media)){
I[i]++;
break;
}
}
}
fclose(f);
// Encuentro el intervalo con mayor número de ocurrencias
for (i = 0; i <= 24 ; i++){
if (I[i] > max){
max = I[i];
imax = i;
}
if (I[i] < min){
min = I[i];
imin = i;
}
}
// Ahora imprimo el histograma...
for (i = 0 ; i <= 24 ; i++){
printf("\n%.2f m/s -- %.2f m/s ", (0.1*i*media), (0.1*(i+1)*media));
escala = 35.0 * I[i] / max;
factor = (int)(escala + 0.5); // redondeo
// Imprime la barra del intervalo (i-1)
for (j = 0 ; j <= factor ; j++){
cout << "|";
} // termina de imprimir la barra...
if (I[i] == max){
cout << " (" << I[i] << ") [Maximo]";
continue;
}
if (I[i] == min){
cout << " (" << I[i] << ") [Minimo]";
continue;
}
cout << " (" << I[i] << ")";
}
// calculo recurso energético...
densidadEnergetica = sv3 / (2 * 8760);
printf("\n\nDensidad energetica promedio: %.3f W/mˆ2", densidadEnergetica);
printf("\nEnergia anual estimada: %.2f W-hr/mˆ2.", energia);
return;
} // Fin de la función DRAYLEIGH
/**************************************
Declaro la función WINDPOWER..
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
2.1 Simulación del Recurso Eólico
85
***************************************/
float windPower(double windSpeed){
/*
Esta función calcula la energı́a producida por el generador
considerando la el teorema de Welt’z,
Densidad del aire = 1,000 kg/mˆ3,
Area de rotor = 1 mˆ2
v ---> generada por el programa,
windspeed (con distribución dada)
*/
double rho = 1.00; // densidad del aire
double potencia; // Potencia generada
double eficiencia = 0.15; // eficiencia del generador
double weltz = 0.59; // factor de terorema de Weltz
potencia = eficiencia * rho * weltz * pow(windSpeed,3);
return potencia;
}
2.1.5
Resultados de la simulación
Se consideraron los siguientes datos:
• Velocidad promedio del viento: 9.3 m/s.
• k = 1.77, c = 11.86 m/s.
que corresponden a La Venta, Oaxaca. Los parámetros de la distribución
Weibull están calculados a partir de mediciones de velocidad de viento realizadas a 53 metros de altura (respecto del suelo).
Este programa simula el Recurso Eolico
de un sitio dados los parametros de su distribucion.
Desea iniciar la semilla del aleatorio? [S/N] s
Se reinicia la semilla...
Seleccione la distribucion estadistica
que presenta el viento de la localidad:
[R] Rayleigh.
[W] Weibull.
[C] Cancelar...
Ingrese una opcion: r
Introduzca la velocidad media del viento: 9.3
0.00
0.93
1.86
2.79
3.72
4.65
5.58
6.51
7.44
8.37
9.30
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
------------
Simulación
de Sistemas
0.93 m/s
1.86 m/s
2.79 m/s
3.72 m/s
4.65 m/s
5.58 m/s
6.51 m/s
7.44 m/s
8.37 m/s
9.30 m/s
10.23 m/s
|||||| (157)
|||||||||||||||| (449)
|||||||||||||||||||||||||| (752)
||||||||||||||||||||||||||||||||| (944)
|||||||||||||||||||||||||||||||||||| (1045) [Maximo]
|||||||||||||||||||||||||||||||||||| (1040)
|||||||||||||||||||||||||||||||||| (998)
|||||||||||||||||||||||||||||| (857)
|||||||||||||||||||||||| (699)
||||||||||||||||||| (523)
|||||||||||||||| (442)
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
86
Proyecto Final
10.23
11.16
12.09
13.02
13.95
14.88
15.81
16.74
17.67
18.60
19.53
20.46
21.39
22.32
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
---------------
11.16
12.09
13.02
13.95
14.88
15.81
16.74
17.67
18.60
19.53
20.46
21.39
22.32
23.25
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
m/s
||||||||||| (302)
|||||||| (196)
|||||| (143)
|||| (76)
||| (57)
|| (39)
|| (22)
| (7)
| (4)
| (6)
| (1)
| (0) [Minimo]
| (0) [Minimo]
| (0) [Minimo]
Densidad energetica promedio: 403.707 W/mˆ2
Energia anual estimada: 2503818.25 W-hr/mˆ2.
Presione < S > para salir... < C > para continuar... c
Este programa simula el Recurso Eolico
de un sitio dados los parametros de su distribucion.
Desea iniciar la semilla del aleatorio? [S/N] s
Se reinicia la semilla...
Seleccione la distribucion estadistica
que presenta el viento de la localidad:
[R] Rayleigh.
[W] Weibull.
[C] Cancelar...
Ingrese una opcion: w
Valor del parametro c: 11.86
Valor del parametro k: 1.77
0.00 m/s -- 0.92 m/s ||||||||| (159)
0.92 m/s -- 1.85 m/s ||||||||||||||||| (317)
1.85 m/s -- 2.77 m/s |||||||||||||||||||||||| (460)
2.77 m/s -- 3.69 m/s ||||||||||||||||||||||||||||||||| (640)
3.69 m/s -- 4.62 m/s |||||||||||||||||||||||||||||||| (631)
4.62 m/s -- 5.54 m/s |||||||||||||||||||||||||||||||||||| (706) [Maximo]
5.54 m/s -- 6.46 m/s |||||||||||||||||||||||||||||||||||| (699)
6.46 m/s -- 7.39 m/s |||||||||||||||||||||||||||||||||| (669)
7.39 m/s -- 8.31 m/s ||||||||||||||||||||||||||||||| (601)
8.31 m/s -- 9.23 m/s |||||||||||||||||||||||||||||||| (629)
9.23 m/s -- 10.16 m/s |||||||||||||||||||||||||||| (542)
10.16 m/s -- 11.08 m/s |||||||||||||||||||||||| (459)
11.08 m/s -- 12.00 m/s ||||||||||||||||||||||| (435)
12.00 m/s -- 12.93 m/s ||||||||||||||||||| (363)
12.93 m/s -- 13.85 m/s ||||||||||||||||| (315)
13.85 m/s -- 14.77 m/s |||||||||||||| (253)
14.77 m/s -- 15.70 m/s ||||||||||| (201)
15.70 m/s -- 16.62 m/s ||||||||| (153)
16.62 m/s -- 17.54 m/s |||||||| (135)
17.54 m/s -- 18.47 m/s |||||| (102)
18.47 m/s -- 19.39 m/s |||| (66)
19.39 m/s -- 20.32 m/s |||| (65)
20.32 m/s -- 21.24 m/s ||| (45)
21.24 m/s -- 22.16 m/s || (28)
22.16 m/s -- 23.09 m/s || (25) [Minimo]
Velocidad Promedio del viento: 9.23 m/s.
Densidad energetica promedio: 325.489 W/mˆ2
Energia anual estimada: 2018713.00 W-hr/mˆ2.
Presione < S > para salir... < C > para continuar... c
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
2.1 Simulación del Recurso Eólico
87
Este programa simula el Recurso Eolico
de un sitio dados los parametros de su distribucion.
Desea iniciar la semilla del aleatorio? [S/N] s
Se reinicia la semilla...
Seleccione la distribucion estadistica
que presenta el viento de la localidad:
[R] Rayleigh.
[W] Weibull.
[C] Cancelar...
Ingrese una opcion: r
Introduzca la velocidad media del viento: 8.62
0.00 m/s -- 0.86 m/s ||||||| (189)
0.86 m/s -- 1.72 m/s ||||||||||||||||| (489)
1.72 m/s -- 2.59 m/s ||||||||||||||||||||||||| (723)
2.59 m/s -- 3.45 m/s ||||||||||||||||||||||||||||||| (929)
3.45 m/s -- 4.31 m/s |||||||||||||||||||||||||||||||||||| (1075) [Maximo]
4.31 m/s -- 5.17 m/s ||||||||||||||||||||||||||||||||||| (1033)
5.17 m/s -- 6.03 m/s |||||||||||||||||||||||||||||||| (965)
6.03 m/s -- 6.90 m/s |||||||||||||||||||||||||||||| (898)
6.90 m/s -- 7.76 m/s |||||||||||||||||||||||| (700)
7.76 m/s -- 8.62 m/s ||||||||||||||||||| (562)
8.62 m/s -- 9.48 m/s |||||||||||||| (395)
9.48 m/s -- 10.34 m/s |||||||||| (264)
10.34 m/s -- 11.21 m/s |||||||| (210)
11.21 m/s -- 12.07 m/s ||||| (125)
12.07 m/s -- 12.93 m/s |||| (85)
12.93 m/s -- 13.79 m/s ||| (54)
13.79 m/s -- 14.65 m/s || (27)
14.65 m/s -- 15.52 m/s || (21)
15.52 m/s -- 16.38 m/s | (9)
16.38 m/s -- 17.24 m/s | (5)
17.24 m/s -- 18.10 m/s | (0) [Minimo]
18.10 m/s -- 18.96 m/s | (1)
18.96 m/s -- 19.83 m/s | (1)
19.83 m/s -- 20.69 m/s | (0) [Minimo]
20.69 m/s -- 21.55 m/s | (0) [Minimo]
Densidad energetica promedio: 310.544 W/mˆ2
Energia anual estimada: 1926020.50 W-hr/mˆ2.
Presione < S > para salir... < C > para continuar... c
Este programa simula el Recurso Eolico
de un sitio dados los parametros de su distribucion.
Desea iniciar la semilla del aleatorio? [S/N] s
Se reinicia la semilla...
Seleccione la distribucion estadistica
que presenta el viento de la localidad:
[R] Rayleigh.
[W] Weibull.
[C] Cancelar...
Ingrese una opcion: w
Valor del parametro c: 10.44
Valor del parametro k: 1.73
0.00 m/s -- 0.81 m/s
0.81 m/s -- 1.62 m/s
1.62 m/s -- 2.44 m/s
Simulación
de Sistemas
|||||||||| (169)
||||||||||||||||||| (354)
||||||||||||||||||||||||||| (509)
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
88
Proyecto Final
2.44 m/s -- 3.25 m/s |||||||||||||||||||||||||||||||| (609)
3.25 m/s -- 4.06 m/s ||||||||||||||||||||||||||||||||| (624)
4.06 m/s -- 4.87 m/s |||||||||||||||||||||||||||||||||||| (677) [Maximo]
4.87 m/s -- 5.68 m/s |||||||||||||||||||||||||||||||||||| (668)
5.68 m/s -- 6.50 m/s |||||||||||||||||||||||||||||||||||| (674)
6.50 m/s -- 7.31 m/s ||||||||||||||||||||||||||||||||| (615)
7.31 m/s -- 8.12 m/s ||||||||||||||||||||||||||||||| (575)
8.12 m/s -- 8.93 m/s |||||||||||||||||||||||||||||||| (593)
8.93 m/s -- 9.74 m/s |||||||||||||||||||||||||| (492)
9.74 m/s -- 10.56 m/s ||||||||||||||||||||| (394)
10.56 m/s -- 11.37 m/s |||||||||||||||||||| (359)
11.37 m/s -- 12.18 m/s ||||||||||||||| (278)
12.18 m/s -- 12.99 m/s |||||||||||||| (259)
12.99 m/s -- 13.80 m/s |||||||||||| (212)
13.80 m/s -- 14.62 m/s ||||||||| (155)
14.62 m/s -- 15.43 m/s ||||||| (120)
15.43 m/s -- 16.24 m/s |||||| (92)
16.24 m/s -- 17.05 m/s ||||| (75)
17.05 m/s -- 17.86 m/s ||||| (71)
17.86 m/s -- 18.68 m/s ||| (48)
18.68 m/s -- 19.49 m/s ||| (43)
19.49 m/s -- 20.30 m/s || (24) [Minimo]
Velocidad Promedio del viento: 8.12 m/s.
Densidad energetica promedio: 226.478 W/mˆ2
Energia anual estimada: 1404631.75 W-hr/mˆ2.
Presione < S > para salir... < C > para continuar...
El número entre paréntesis a la derecha de cada intervalo indica la cantidad
de horas que se tuvieron velocidades de viento en ese intervalo en un año, considerando que la distribución de probabilidad de esa variable aleatoria sigue la
distribución indicada.
Es de notar que la densidad energética varı́a al considerar distintas distribuciones, a pesar de utilizar los datos de un sitio obtenidos a partir del mismo
estudio y realizar el cálculo de la densidad de recurso eólico local con la misma
metodologı́a.
Para la distribución Weibull se obtuvo una densidad energética de 315.558
W/m2 , mientras que para el caso de la distribuión Rayleigh se obtuvo un valor
correspondiente de 403.202 W/m2 . El primer caso siendo un 78.26% de la segunda estimación.
También es importante indicar que no se calcula la densidad de recurso eólico
a partir de la velocidad promedio estimada, sino con las velocidades de viento,
conforme se van generando estos valores con la distribución correspondiente.
Cuando se elige la distribución Weibull, el programa calcula la velocidad promedio del viento a partir de la siguiente fórmula:
n
P
v=
vi · P (vi )
i=1
n
P
fi
i=1
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
2.1 Simulación del Recurso Eólico
89
donde n es es el número de intervalos en los cuales se dividió la distribución
al dibujar el histograma, vi es la velocidad promedio del intervalo i de la distribución, P (vi ) es la probabilidad de que el viento tenga la velocidad vi , que
se calculó dividiendo la frecuencia fi del i−ésimo intervalo entre el número de
mediciones realizadas.
A. Los resultados pronosticados...
Datos de la Ventosa, Oax. México. (32 metros)
3 Velocidad del Viento promedio:
Rayleigh: 9.3 m/s∗
Weibull: 9.23 m/s
3 Densidad energética promedio:
Rayleigh: 403.707 W/m2
Weibull: 325.489 W/m2
3 Energı́a anual estimada:
Rayleigh: 2.503 818 MW-hr/m2
Weibull: 2.018 713 MW-hr/m2
Para el caso de las mediciones a 15 metros, se utilizó la siguiente relación para
aproximar el valor de la velocidad de viento a esa altura:
• Sean v2 la velocidad del viento a la altura h2 ,
• y v1 la velocidad del viento a la altura h1 ...
• Entonces, se cumple:
v2 = v1
h2
h1
α
• donde α es el coeficiente de fricción superficial con el suelo caracteristico
local3 .
Valores tı́picos de α
Tipo de
Terreno
Lago, Océano, Terreno firme y plano
Pasto alto en terreno plano
Sembradı́os, arbustos, forraje
Bosque o selva
Población pequeña con árboles
Ciudad con edificios altos
3 Fuente:
Coeficiente de
Fricción (α)
0.10
0.15
0.20
0.25
0.30
0.40
Wind and Solar Power Systems. Patel, Mukind R. CRC Press. 1 999
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
90
Proyecto Final
Usando la relación anterior, y considerando que los generadores eólicos están
instalados en una playa, tenemos:
0.1
15
= 8.62 m/s.
vh=15m = 9.3
32
B. Los resultados pronosticados...
Datos de la Ventosa, Oax. México. (15 metros)
3 Velocidad del Viento promedio:
Rayleigh: 8.62 m/s∗
Weibull: 8.12 m/s
3 Densidad energética promedio:
Rayleigh: 310.544 W/m2
Weibull: 226.478 W/m2
3 Energı́a anual estimada:
Rayleigh: 1.926 021 MW-hr/m2
Weibull: 1.404 632 MW-hr/m2
2.1.6
Conclusiones
Resultados: los resultados obtenidos con la simulación están basados en consideraciones teóricas solamente. Para realizar cálculos más precisos se
requieren datos más detallados.
Por ejemplo, el programa calcula la densidad energética eólica, es decir,
la cantidad de energı́a que se espera recuperar con un generador eólico
por cada metro cuadrado de área que barran las aspas de los generadores
instalados en ese lugar.
Para pronosticar la cantidad de energı́a generada en ese lugar, se requiere,
además, el radio de las aspas de los generadores que se instalarán, las curvas de eficiencia de los generadores contra la velocidad del viento, entre
otros parámetros.
Problemas: Conseguir información sobre la distribución del viento y sus parámetros hasta hoy es complicado, no porque las personas que se encargan
de trabajar en esta área sean muy celosos de estos datos, sino porque hay
muy pocas bases de datos.
La mayorı́a de las mediciones que se habı́an hecho sobre las velocidades
de viento de diferentes localidades se habı́a realizado con fines de obtener
información para el pronóstico del tiempo. Estas mediciones solamente
estaban interesadas en la velocidad promedio del viento, y no en la distribución que presenta el viento y mucho menos en los parámetros de la
misma.
Para un proyecto de generación de energı́a a partir del viento, se requieren
conocer con precisión la distribución que presenta el viento, porque una
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
2.1 Simulación del Recurso Eólico
91
inversión grande requiere de estudios detallados para asegurar el éxito del
proyecto.
Trabajo Futuro: Él código del programa generado trabaja correctamente con
el compilador Dev-Cpp Versión 4.9.9.2.
La conversión de el código al lenguaje C es muy sencilla, y de hecho, algunas de las funciones que utiliza actualmente el código se elaboraron en
ANSI-C, de manera que la conversión debe resultar sencilla.
Por otra parte, serı́a una excelente idea convertir este código al lenguaje
Java, porque este lenguaje permite el uso de utilerı́as gráficas, que facilitarı́an la generación de una animación.
Lecciones Aprendidas:
1. La simulación de un sistema requiere, además de una buena preparación
en cuestiones técnicas de la materia (programación en algún lenguaje
de alto nivel, matemáticas, en particular estadı́stica, etc.), un sólido
conocimiento en las bases de la materia del evento o sistema que se
desea simular.
Una persona inexperta en el área de energı́a eólica pudo suponer que
la velocidad del viento podı́a considerarse con la misma magnitud
a 15, 32 ó 50 metros de altura, ocasionando errores graves en los
resultados obtenidos.
2. Cuando se desea realizar una simulación, se requiere de información
“de calidad”. Si no se cuenta con información “buena”, se corre el
riesgo de simular algo que no está acorde con la realidad.
En casos de sistemas que no se conocen muy bien, o que tienen poca
información sobre el mismo, conviene suponer algunos valores y finalmente decidir si esos valores son adecuados de acuerdo a los resultados que arroja la simulación y comparar éstos con los valores que
se debı́an esperar.
3. La simulación es solamente una simulación. No se debe considerar la
simulación como un sustituto del sistema real. De hecho, para hacer
la simulación hemos hecho muchas suposiciones que nos ayudan a
simplificar el sistema real.
En el caso de este proyecto, para el cálculo de la densidad energética
se consideró que la distribución que se midió y se reportó en el artı́culo
Evaluación del recurso eólico de La Venta, Juchitán, Oaxaca, era la
que el programa generado simulaba, y además que los valores de la
probabilidad para cada velocidad de viento considerada en cada inervalo del histograma de frecuencias generado por el mismo programa,
era el que se presentó en ese lugar.
Evidentemente, el valor de la densidad energética pronosticada cambiará, aún con el mismo algoritmo, si se aumenta o disminuye el
número de intervalos a considerar al dibujar el histograma de frecuencias de las velocidades de viento.
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
92
Proyecto Final
Efraı́n Soto A.
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Simulación
de Sistemas
3
End matter
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
3.1 Fuentes bibliográficas
3.1
95
Fuentes bibliográficas
Para la fundamentación de este proyecto final se utilizaron las siguientes fuentes:
Wind and solar power systems Patel, Mukind R., CRC Press.
1999. ISBN 0-8493-1605-7
EE.UU.
Handbook of wind energy Tony Burton, et al. Ed. John Wiley & Sons.
EE.UU. 2001. ISBN 0-471-48997-2
y se consultaron los siguientes artı́culos:
3 Alexiadis, M. C., Dokopoulos, P. S., and Sahsamanogdou, H. S. 1998.
Wind Speed and Power Forecasting Based on Spatial Correlation Models,
I.E.E.E. Paper No. PE-437-EC-0-04-1998.
3 M. A. Borja, O. A. Jaramillo, M. F. Morales. Evaluación del recurso
eólico de La Venta, Juchitán, Oaxaca, 2001. I.S.E.S. Millenium Solar
Forum 2000. ERS-22-01.
En cuanto a la parte de programación en los lenguajes C++ y C, y generación
de números pseudoaletaorios, se consultaron las siguientes fuentes:
Discrete-event system simulation Jerry Banks, John S. Carson II, Barry
L. Nelson. Ed. Prentice Hall. 1996. (2nd Edition)
Probabilidad y estadı́stica para ingenieros Ronald E. Walpole, Raymond
H. Myers. Ed. McGraw-Hill. México. 1989.
Mathematical Statistics John E. Freund. Ed. Prentice Hall. EE.UU. 1992.
5ta. Edición.
C++ for mathematicians Edward Scheinerman. Ed. Chapman & Hall. 2006.
Problem solving with C++ Walter Savitch. Ed. Addison Wesley. 1999.
(2nd Edition)
Además, el modelo matemático para generar números pseudoaleatorios con distribución Rayleigh, se obtuvo de la siguiente dirección de internet:
http://www.brighton-webs.co.uk/distributions/rayleigh.asp
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
3.2 Términos de uso
3.2
97
Términos de uso
Efraı́n Soto Apolinar no es responsable por cualesquiera daños ocasionados por
el uso de este material.
Tienes derecho de leer el material y de divulgarlo a otras personas, con la única
condición de que no modifiques el documento en ninguna forma.
Si deseas utilizar alguna parte del material, puedes hacerlo, con la única condición
de que menciones la fuente, i.e., este material y a Efraı́n Soto Apolinar como el
autor.
Espero que este material pueda ser de ayuda a muchas personas que desean
aprender la simulación de sistemas.
Con estas notas estoy aprendiendo junto contigo.
En realidad el material que estas leyendo lo estoy generando como un resumen
de lo que voy aprendiendo. Voy a utilizarlo en lo futuro como una referencia.
Este material está siendo actualizado continuamente.
Te agradeceré que me envı́es un mensaje en caso de que encuentres errores en
las definiciones, procedimientos, soluciones, ortografı́a y/o gramática, etc., del
mismo.
El material no ha tenido ninguna revisión. Agradezco infinitamente tu ayuda.
Efraı́n Soto Apolinar.
Simulación
de Sistemas
Notas del curso Simulación de Sistemas
Prohibida la reproducción sin permiso previo del autor.
Efraı́n Soto A.
3.3
Créditos
Este documento se preparó con el software de tipografı́a cientı́fica LATEX 2ε .
Todas las figuras que se presentan en este material se elaboraron con el paquete
TikZ de LATEX 2ε .
Créditos...
Profesor: Dr. César Villarreal.
Estudiante: Efraı́n Soto Apolinar.
Diseño de portada: Efraı́n Soto Apolinar.
Edición: Efraı́n Soto Apolinar.
Composición tipográfica: Efraı́n Soto Apolinar.
Productor general: Efraı́n Soto Apolinar.
Revisión técnica: Pendiente.
Año de edición: 2008
Año de publicación: Pendiente
July 11, 2008
Última revisión:
6:31pm
Agradezco tus sugerencias, comentarios, correcciones, reclamos y todo lo que se
le parezca a cualquiera de las cuentas de correo electrónico:
[email protected]
[email protected]
@
@
Descargar