# uniform on [a, b]
a <- -1 ; b <- 1
out <- PoincareOptimal(distr = list("unif", a, b))
cat("Poincare constant (theory -- estimated):", (b-a)^2/pi^2, "--", out$opt, "\n")
# truncated standard normal on [-1, 1]
# the optimal Poincare constant is then equal to 1/3,
# as -1 and 1 are consecutive roots of the 2nd Hermite polynomial X*X - 1.
out <- PoincareOptimal(distr = dnorm, min = -1, max = 1,
plot = TRUE, only.values = FALSE)
cat("Poincare constant (theory -- estimated):", 1/3, "--", out$opt, "\n")
# \donttest{
# truncated standard normal on [-1.87, +infty]
out <- PoincareOptimal(distr = list("norm", 0, 1), min = -1.87, max = 5,
method = "integral", n = 500)
print(out$opt)
# truncated Gumbel(0,1) on [-0.92, 3.56]
library(evd)
out <- PoincareOptimal(distr = list("gumbel", 0, 1), min = -0.92, max = 3.56,
method = "integral", n = 500)
print(out$opt)
# symetric triangular [-1,1]
library(triangle)
out <- PoincareOptimal(distr = list("triangle", -1, 1, 0), min = NULL, max = NULL)
cat("Poincare constant (theory -- estimated):", 0.1729, "--", out$opt, "\n")
# Lognormal distribution
out <- PoincareOptimal(distr = list("lognorm", 1, 2), min = 3, max = 10,
only.values = FALSE, plot = TRUE, method = "integral")
print(out$opt)
## -------------------------------
## Illustration for eigenfunctions on the uniform distribution
## (corresponds to Fourier series)
b <- 1
a <- -b
out <- PoincareOptimal(distr = list("unif", a, b),
only.values = FALSE, der = TRUE, method = "quad")
# Illustration for 3 eigenvalues
par(mfrow = c(3,2))
eigenNumber <- 1:3 # eigenvalue number
for (k in eigenNumber[1:3]){ # keep the 3 first ones (for graphics)
plot(out$knots, out$vectors[, k + 1], type = "l",
ylab = "", main = paste("Eigenfunction", k),
xlab = paste("Eigenvalue:", round(out$values[k+1], digits = 3)))
sgn <- sign(out$vectors[1, k + 1])
lines(out$knots, sgn * sqrt(2) * cos(pi * k * (out$knots/(b-a) + 0.5)),
col = "red", lty = "dotted")
plot(out$knots, out$der[, k + 1], type = "l",
ylab = "", main = paste("Eigenfunction derivative", k),
xlab = "")
sgn <- sign(out$vectors[1, k + 1])
lines(out$knots, - sgn * sqrt(2) / (b-a) * pi * k * sin(pi * k * (out$knots/(b-a) + 0.5)),
col = "red", lty = "dotted")
}
# how to create a function for one eigenfunction and eigenvalue,
# given N values
eigenFun <- approxfun(x = out$knots, y = out$vectors[, 2])
eigenDerFun <- approxfun(x = out$knots, y = out$der[, 2])
x <- runif(n = 3, min = -1/2, max = 1/2)
eigenFun(x)
eigenDerFun(x)
# }
Run the code above in your browser using DataLab