2011-10-28 25 views
6

tek boyutlu numaralı bir tümleştirmeyi gerçekleştirmek istiyorum, burada tümleştirmesi vektör değerli'dur. integrate() sadece skaler integrallere izin verir, bu yüzden birkaç kez çağırmam gerekecek. cubature paketi çok uygun görünüyor, ancak 1D integralleri için oldukça zayıf bir performans sergiliyor.uyarlamasıEngrasyon ve eşitleme

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 

nasılsa, şu örneği (skaler değerli integrali alınan ve 1D entegrasyonu) düşünün, adaptIntegrate benzer bir hassasiyet için daha birçok fonksiyon değerlendirmeler kullanıyor görünüyor. ?integrate bir "Wynn's Epsilon algoritması" ekler olsa da, her iki yöntem de Gauss-Kronrod kareleme (1D durum: 15-noktalı Gaussian quadrature kuralı) kullanın. Bu büyük zamanlama farkını açıklar mı?

Böyle

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 

teşekkür olarak vektör değerli integraller ile başa alternatif yollardan önerilere açığım.

+0

Üzgünüm; Skaler değerli integral için verdiğim bire bir karşılaştırmayla ilgili sorun nedir? – baptiste

+0

"fDim = 2" ile test yaptım (son örnek, 345 de değerlendirmeler), karşılaştırma sadece "integrate" kelimesini iki kez çağırmaktır, str (gecikme (integral1, integrand2), integral, -1,1 , rel.tol = tolerans, altbölüm = Nmax)) '10 + 1 = 11 değerlendirmesini verir. Benim düşüncem, evet, 'adapIntegrate', çok boyutlu entegrasyonu ve isteğe bağlı olarak vektör değerli integralleri hedefler, ancak tek boyutlu entegrasyon durumu, tekrar tekrar entegre edilmekten çok daha az verimlidir, ancak büyük bir fark (~ 30 kez) İşte). – baptiste

+0

Bu paketi gördünüz mü: http://cran.r-project.org/web/packages/R2Cuba/ –

cevap

2

Orada birkaç boyutlu entegrasyon algoritmaları uygular CRAN içinde R2Cuba Paket ayrıca geçerli:

Ben senin örnek işlevi ile bunu test etmeye çalıştı ve böyle basit bir durumda tüm algoritmalar işe alamadım (her ne kadar Ben gerçekten zor denemedim) ve işe yaramadı birkaç yöntem varsayılan ayar ile adaptIntegrate önemli ölçüde daha yavaştı, ama belki de gerçek uygulamada bu paket denemeye değer olabilir.

İlgili konular