2012-11-19 30 views
5

बनाना, इसलिए, मैंने यह कोड लिखा है जो प्रभावी रूप से एच (एक्स) के रूप में परिभाषित फ़ंक्शन के वक्र के तहत क्षेत्र का अनुमान लगाएगा। मेरी समस्या यह है कि मुझे क्षेत्र को 6 दशमलव स्थानों के भीतर अनुमान लगाने में सक्षम होना चाहिए, लेकिन अनुमान लगाया गया है कि एल्गोरिदम मैंने अपनी मशीन के लिए बहुत भारी उपयोग किया है। अनिवार्य रूप से सवाल यह है कि मैं निम्नलिखित कोड को और अधिक कुशल कैसे बना सकता हूं? क्या कोई रास्ता है कि मैं उस लूप से छुटकारा पा सकता हूं?एक अधिक कुशल मोंटे कार्लो सिमुलेशन

h = function(x) { 
    return(1+(x^9)+(x^3)) 
} 
estimateN = function(n) { 
    count = 0 
    k = 1 
    xpoints = runif(n, 0, 1) 
    ypoints = runif(n, 0, 3) 
    while(k <= n){ 
    if(ypoints[k]<=h(xpoints[k])) 
     count = count+1 
    k = k+1 
    } 
    #because of the range that im using for y 
    return(3*(count/n)) 
} 
#uses the fact that err<=1/sqrt(n) to determine size of dataset 
estimate_to = function(i) { 
    n = (10^i)^2 
    print(paste(n, " repetitions: ", estimateN(n))) 
} 

estimate_to(6) 
+1

'estimate_to (6)' एक छोटे से भी लालची हो सकता है: अपने वर्तमान एल्गोरिथ्म संभावना आर कर देगा स्मृति लंबाई 1e12 के संख्यात्मक वैक्टर आवंटित करने के लिए कोशिश कर रहा से बाहर चलाने के। – flodel

+0

यदि आपको वास्तव में 1e12 सिमुलेशन की आवश्यकता है, तो आपको अपने एल्गोरिदम को फिर से लिखना होगा ताकि इसे गणना समय और स्मृति उपयोग के बीच एक समझौता मिल सके। – flodel

+0

मोंटे कार्लो एकीकरण (अधिक) को और अधिक कुशल बनाने का सबसे अच्छा तरीका, यानी कम पुनरावृत्तियों के भीतर एक ही सटीकता प्राप्त करना, महत्वपूर्ण नमूनाकरण का उपयोग करना है, उदाहरण के लिए मेट्रोपोलिस मोंटे कार्लो। '1.0' के करीब 'x' के साथ आपके मामले बिंदुओं में' 0.0' के करीब की तुलना में अभिन्न के मूल्य में अधिक योगदान मिलता है। –

उत्तर

8

इस कोड को बदलें:

count = 0 
k = 1 
while(k <= n){ 
if(ypoints[k]<=h(xpoints[k])) 
    count = count+1 
k = k+1 
} 

इस लाइन के साथ: यदि यह सही मायने में दक्षता आप के लिए प्रयास कर रहे हैं

count <- sum(ypoints <= h(xpoints)) 
+1

मुझे लगता है कि वेक्टरेशन की शक्ति को काफी हद तक बताती है। –

1

, integrate परिमाण के कई आदेशों तेजी से होता है (उल्लेख करने के लिए नहीं अधिक स्मृति कुशल) इस समस्या के लिए।

integrate(h, 0, 1) 

# 1.35 with absolute error < 1.5e-14 

microbenchmark(integrate(h, 0, 1), estimate_to(3), times=10) 

# Unit: microseconds 
#    expr  min   lq  median   uq  max neval 
# integrate(h, 0, 1)  14.456  17.769  42.918  54.514  83.125 10 
#  estimate_to(3) 151980.781 159830.956 162290.668 167197.742 174881.066 10 

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

  • कोई संबंधित समस्या नहीं^_^