paquetes <- c("ggplot2", "dplyr", "ggpubr", "tidyr", "evd")
instalar_si_faltan <- function(paquetes) {
nuevos <- paquetes[!(paquetes %in% installed.packages()[, "Package"])]
if(length(nuevos)) install.packages(nuevos)
}
instalar_si_faltan(paquetes)
invisible(lapply(paquetes, library, character.only = TRUE))
Para simular los conteos de desintegraciones por minuto, usamos la distribución de Poisson con media 45.62. Luego aplicamos la fórmula de decaimiento radioactivo para estimar la edad de cada muestra:
\[ t = \frac{\log(15.3) - \log(\frac{X}{10})}{0.0001210} \]
set.seed(123)
X <- rpois(10000, lambda = 45.62)
t_hat <- (log(15.3) - log(X / 10)) / 0.0001210
head(t_hat)
## [1] 10883.189 8761.537 12430.392 9932.203 8160.220 9580.470
Calculamos la media de las edades estimadas para tener una idea general del tiempo transcurrido:
mean_t <- mean(t_hat)
mean_t
## [1] 10114.79
La desviación estándar nos permite ver cuánta variabilidad hay en las estimaciones:
desv_t <- sd(t_hat)
desv_t
## [1] 1237.73
Calculamos la proporción de estimaciones que se alejan más de 1000 años del valor real (10,000 años):
prob_error <- mean(abs(t_hat - 10000) > 1000)
prob_error
## [1] 0.4114
Simulamos los tiempos de vida de cuatro componentes con distribuciones log-normales, cada una con distintos parámetros. Luego construimos tres sistemas distintos usando operaciones de series (suma) y paralelos (máximo o mínimo):
set.seed(123)
n <- 1000
R1 <- rlnorm(n, meanlog = 2, sdlog = 1)
R2 <- rlnorm(n, meanlog = 1, sdlog = 0.1)
R3 <- rlnorm(n, meanlog = 2, sdlog = 1)
R4 <- rlnorm(n, meanlog = 1, sdlog = 0.1)
sistema1 <- pmax(R1, R2) + pmax(R3, R4)
sistema2 <- pmin(pmax(R1, R3), pmax(R2, R4))
sistema3 <- pmin(R1 + R3, R2 + R4)
head(sistema1)
## [1] 8.648674 15.234423 39.416929 32.937650 17.203458 45.055010
head(sistema2)
## [1] 2.677730 2.630632 2.713399 2.682589 3.524889 3.016380
head(sistema3)
## [1] 5.138366 5.080428 5.065205 5.217787 5.631469 5.724510
Se calcula la media de los tiempos de vida de cada sistema:
print(mean(sistema1))
## [1] 24.43403
print(mean(sistema2))
## [1] 2.872922
print(mean(sistema3))
## [1] 5.416374
Esto se hace comparando cada simulación con el umbral de 2 unidades:
print(mean(sistema1 < 2))
## [1] 0
print(mean(sistema2 < 2))
## [1] 0.008
print(mean(sistema3 < 2))
## [1] 0.001
El percentil 20 nos dice cuál es el tiempo de vida por debajo del cual cae el 20% de las observaciones:
quantile(sistema1, 0.20)
## 20%
## 10.15041
Se generan QQ plots para comparar visualmente los tiempos de vida con una distribución normal:
qq1 <- ggqqplot(sistema1, title = "Sistema 1")
qq2 <- ggqqplot(sistema2, title = "Sistema 2")
qq3 <- ggqqplot(sistema3, title = "Sistema 3")
ggarrange(qq1, qq2, qq3, ncol = 3)
Se grafican histogramas para cada sistema con diferentes colores:
hist1 <- ggplot(data.frame(sistema1), aes(sistema1)) + geom_histogram(bins = 30, fill = "skyblue") + ggtitle("Sistema 1")
hist2 <- ggplot(data.frame(sistema2), aes(sistema2)) + geom_histogram(bins = 30, fill = "salmon") + ggtitle("Sistema 2")
hist3 <- ggplot(data.frame(sistema3), aes(sistema3)) + geom_histogram(bins = 30, fill = "lightgreen") + ggtitle("Sistema 3")
ggarrange(hist1, hist2, hist3, ncol = 3)
Se usa la distribución de Poisson con media 30 para representar el número de solicitudes que recibe el servidor cada minuto:
set.seed(123)
solicitudes <- rpois(10000, lambda = 30)
head(solicitudes)
## [1] 26 36 20 30 39 32
prob_mas_40 <- mean(solicitudes > 40)
print(prob_mas_40)
## [1] 0.0298
sobrecarga <- mean(solicitudes > 35)
print(sobrecarga)
## [1] 0.1503
Para evitar sobrecargas, se puede implementar:
Escalamiento automático
Balanceadores de carga
Distribución geográfica de servidores
ggplot(data.frame(solicitudes), aes(solicitudes)) +
geom_histogram(bins = 30, fill = "purple") +
ggtitle("Distribución de Solicitudes por Minuto")
Se utiliza la distribución Gumbel para simular datos diarios durante 10 años (3650 días):
set.seed(123)
mu <- 500
beta <- 100
n <- 3650
caudales <- evd::rgumbel(n, loc = mu, scale = beta)
head(caudales)
## [1] 517.0246 555.0589 471.5532 845.5315 787.8643 615.0428
Calculamos la probabilidad de que el caudal diario supere el umbral al menos una vez:
prob_superado <- 1 - (mean(caudales <= 750))^3650
print(prob_superado)
## [1] 1
El percentil 99 de la distribución de Gumbel representa el valor de diseño:
nuevo_diseño <- evd::qgumbel(0.99, loc = mu, scale = beta)
print(nuevo_diseño)
## [1] 960.0149
ggplot(data.frame(caudales), aes(caudales)) +
geom_histogram(bins = 30, fill = "dodgerblue") +
ggtitle("Distribución del Caudal Máximo Diario")
Para reducir el riesgo:
Mejorar infraestructura del puente
Canales de desvío
Refuerzo estructural
Sistemas de alerta temprana