Chciałbym przeprowadzić integrację numeryczną w jeden wymiar, gdzie integran jest wektorowo wartościowany. integrate()
zezwala tylko na integrację skalarną, dlatego musiałbym wywoływać ją kilka razy. Pakiet cubature
wydaje się dobrze pasować, ale wydaje się, że działa dość słabo dla całek 1D. Rozważmy następujący przykład (skalar wycenione całki i integracji 1D),wydajność adaptIntegrate kontra integracja
library(cubature)
integrand <- function(x, a=0.01) exp(-x^2/a^2)*cos(x)
Nmax <- 1e3
tolerance <- 1e-4
# using cubature's adaptIntegrate
time1 <- system.time(replicate(1e3, {
a <<- adaptIntegrate(integrand, -1, 1, tol=tolerance, fDim=1, maxEval=Nmax)
}))
# using integrate
time2 <- system.time(replicate(1e3, {
b <<- integrate(integrand, -1, 1, rel.tol=tolerance, subdivisions=Nmax)
}))
time1
user system elapsed
2.398 0.004 2.403
time2
user system elapsed
0.204 0.004 0.208
a$integral
> [1] 0.0177241
b$value
> [1] 0.0177241
a$functionEvaluations
> [1] 345
b$subdivisions
> [1] 10
Jakoś adaptIntegrate
wydaje się być za pomocą wielu ocenach więcej funkcji za podobną precyzją. Obie metody najwyraźniej wykorzystują kwadraturę Gaussa-Kronroda (przypadek 1D: 15-punktowa zasada kwadratury Gaussa), ale ?integrate
dodaje "algorytm Epsilon Wynna". Czy to wyjaśniałoby dużą różnicę czasową?
Jestem otwarty na propozycje alternatywnych sposobów radzenia sobie z wektora wycenione podcałkowych takich jak
integrand <- function(x, a = 0.01) c(exp(-x^2/a^2), cos(x))
adaptIntegrate(integrand, -1, 1, tol=tolerance, fDim=2, maxEval=Nmax)
$integral
[1] 0.01772454 1.68294197
$error
[1] 2.034608e-08 1.868441e-14
$functionEvaluations
[1] 345
Dzięki.
Nie przykro mi; co jest nie tak z porównaniem jeden do jednego, które daję dla integralności o wartościach skalarnych? – baptiste
Zrobiłem test z 'fDim = 2' (ostatni przykład, 345 ocen), porównanie jest tylko przypadkiem wywołania' integrate' dwa razy, 'str (lapply (c (integrand1, integrand2), integracja, -1,1 , rel.tol = tolerancja, poddziały = Nmax)) 'daje 10 + 1 = 11 ocen. Chodzi mi o to, że tak, 'adaptIntegrate' jest wielowymiarową integracją i opcjonalnie integracjami o wartości wektorowej, ale przypadek jednowymiarowej integracji jest znacznie mniej wydajny niż wielokrotne wywoływanie' integrate', ale duży margines (~ 30 razy tutaj). – baptiste
Czy widziałeś ten pakiet: http://cran.r-project.org/web/packages/R2Cuba/ –