2011-10-28 11 views
6

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.

+0

Nie przykro mi; co jest nie tak z porównaniem jeden do jednego, które daję dla integralności o wartościach skalarnych? – baptiste

+0

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

+0

Czy widziałeś ten pakiet: http://cran.r-project.org/web/packages/R2Cuba/ –

Odpowiedz

2

Istnieje również R2Cuba pakiet w Cran który implementuje kilka wielowymiarowych algorytmów Integracja:

starałem się przetestować ten przykład z funkcji, a w takim prostym przypadku nie mogę dostać wszystkie algorytmy do pracy (chociaż Nie próbowałem naprawdę ciężko), a kilka metod, które dostałem do pracy, było znacznie wolniejsze niż domyślne ustawienie, ale być może w twojej prawdziwej aplikacji ten pakiet mógłby być wart próbowania.