a <- 2
f.lenta <- function (x)
ifelse (x <= -a | x >= a,
0,
ifelse (x > 0,
1/a^2 * (a - x),
1/a^2 * (a + x)))
f.rapida <- function (x)
1/a^2 * ((a - x) * (x >= 0) * (x < a) +
(a + x) * (x < 0) * (x > -a))
muestra.triangular.1 <- function (n=50, f=f.rapida)
{
muestra <- numeric(n)
i <- 1
while (i <= n)
{
x <- runif (1, -a, a); y <- runif (1, 0, 1/a)
if (y <= f(x))
{
muestra[i] <- x
i <- i + 1
}
}
muestra
}
muestra.triangular.2 <- function(n=50, f=f.rapida,
muestra=numeric(0), crece=2)
repeat {
m <- crece * n x <- runif(m, -a, a); y <- runif(m, 0, 1/a)
muestra <- c(muestra, x [y <= f(x)])
if (length(muestra) >= n) return(muestra[1:n])
m <- crece * m
}
muestra.triangular.3 <- function(n=50)
{
Y <- rbeta(n, 1, 2)
V <- rbinom(n, 1, 0.5)
a * 2 * Y * (V - 0.5)
}
muestra.triangular.4 <- function(n=50, f=f.rapida,
I=8, graf=FALSE, extra=2) {
corte <- seq(-a, a, length.out = I + 1)
altura <- sapply (1:I,
function(i)
optimize(f, corte[i:(i+1)], maximum=TRUE,
tol=1e-6) $ objective)
if (graf)
{
plot(f, -a, a, type = "l", col = 3)
lines(c(-a,corte), c(0,altura,0), type = "s", col = 2)
}
anchura <- diff(corte)
area <- sum(anchura * altura)
m <- extra * n * area i <- sample(I, m, TRUE, altura)
x <- anchura[i] * runif(m) + corte[i]
y <- runif(m, 0, altura[i])
x [y < f(x)] [1:n]
}
muestra.triangular.5 <- function(n=50, f=f.rapida,
I=8, graf=FALSE, extra=2) {
corte <- seq(-a, a, length.out = I + 1) altura <- sapply (1:I,
function(i)
optimize(f, corte[i:(i+1)], maximum=TRUE,
tol=1e-6) $ objective)
if (graf)
{
plot(f, -a, a, type = "l", col = 3)
lines(c(-a,corte), c(0,altura,0), type = "s", col = 2)
}
anchura <- diff(corte) C <- sum (anchura * altura) G <- c(0, cumsum (anchura * altura))
G1 <- function (u) {
i <- sum(u > G) corte[i] + (corte[i+1]-corte[i])/(G[i+1]-G[i]) * (u-G[i])
}
m <- extra * n * C u <- runif (m, 0, C)
A <- sapply(u, G1)
g <- function(A) altura[ceiling((A-(-a))/anchura[1])] b <- runif (m, 0, g(A))
A [b < f(A)] [1:n]
}
system.time (hist (muestra.triangular.1(1e6, f=f.lenta), breaks=100, col=2))
system.time (hist (muestra.triangular.1(1e6), breaks=100, col=3))
system.time (hist (muestra.triangular.2(1e6, f=f.lenta), breaks=100, col=4))
system.time (hist (muestra.triangular.2(1e6), breaks=100, col=5))
system.time (hist (muestra.triangular.3(1e6), breaks=100, col=6))
system.time (hist (muestra.triangular.4(1e6, f=f.lenta), breaks=100, col=7))
system.time (hist (muestra.triangular.4(1e6), breaks=100, col=2))
system.time (hist (muestra.triangular.4(1e6, I=1), breaks=100, col=3))
system.time (hist (muestra.triangular.4(1e6, I=100), breaks=100, col=4))
system.time (hist (muestra.triangular.5(1e6), breaks=100, col=5))
system.time (hist (muestra.triangular.5(1e6, I=1), breaks=100, col=6))
system.time (hist (muestra.triangular.5(1e6, I=100), breaks=100, col=7))