2011-10-28 17 views
6

मैं एक आयाम, जहां integrand वेक्टर-मान है में एक संख्यात्मक एकीकरण प्रदर्शन करने के लिए करना चाहते हैं। integrate() केवल स्केलर इंटीग्रैंड्स को अनुमति देता है, इस प्रकार मुझे इसे कई बार कॉल करने की आवश्यकता होगी। cubature पैकेज अच्छी तरह से उपयुक्त लगता है, लेकिन ऐसा लगता है कि 1 डी इंटीग्रल के लिए काफी खराब प्रदर्शन करता है। निम्न उदाहरण (अदिश-मान integrand और -1 डी एकीकरण) पर विचार करेंप्रदर्शन एकीकृत

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 

किसी तरह, adaptIntegrate एक समान परिशुद्धता के लिए कई और अधिक समारोह के मूल्यांकन का उपयोग किया जा रहा है। दोनों विधियां स्पष्ट रूप से गॉस-क्रोन्रोड क्वाड्रैचर (1 डी केस: 15-पॉइंट गॉसियन क्वाड्रैचर नियम) का उपयोग करती हैं, हालांकि ?integrate "वाईन का एस्पिलॉन एल्गोरिदम" जोड़ती है। क्या यह बड़े समय के अंतर को समझाएगा?

मैं ऐसे

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 

धन्यवाद के रूप में वेक्टर-मान integrands के साथ काम करने के वैकल्पिक तरीके के सुझाव के लिए खुले हूँ।

+0

मुझे यह खेद नहीं है; स्केलर-मूल्यवान इंटीग्रैंड के लिए एक-से-एक तुलना के साथ क्या गलत है? – baptiste

+0

मैंने 'fDim = 2' (अंतिम उदाहरण, 345 मूल्यांकन भी) के साथ परीक्षण किया था, तुलना केवल दो बार 'एकीकृत' कॉल करने का मामला है, 'str (lapply (c (integrand1, integrand2), एकीकृत, -1,1 , rel.tol = सहनशीलता, उपविभाग = एनएमएक्स)) '10 + 1 = 11 मूल्यांकन देता है। मेरा मुद्दा है, हां, 'adaptIntegrate' लक्ष्य बहु-आयामी एकीकरण, और वैकल्पिक रूप से वेक्टर-मूल्यवान इंटीग्रैंड्स का लक्ष्य है, लेकिन एक-आयामी एकीकरण का मामला बार-बार' एकीकृत 'को कॉल करने से बहुत कम कुशल है, लेकिन एक बड़ा मार्जिन (~ 30 बार यहाँ)। – baptiste

+0

क्या आपने यह पैकेज देखा है: http://cran.r-project.org/web/packages/R2Cuba/ –

उत्तर

2

वहाँ भी है जो कई बहुआयामी एकीकरण एल्गोरिदम लागू करता क्रैन में R2Cuba पैकेज है: (हालांकि

मैं अपने उदाहरण समारोह के साथ इस परीक्षण करने के लिए करने की कोशिश की है, और इस तरह के एक सरल मामले में मैं सभी एल्गोरिदम काम करने के लिए नहीं मिल सका मैंने वास्तव में कड़ी मेहनत की कोशिश नहीं की), और काम करने के लिए मुझे मिली कुछ विधियां adaptIntegrate से डिफ़ॉल्ट सेटिंग के साथ काफी धीमी थीं, लेकिन शायद आपके असली एप्लिकेशन में यह पैकेज कोशिश करने के लायक हो सकता है।

संबंधित मुद्दे