2012-05-04 7 views
7

मैं एक दिलचस्प लेकिन बदसूरत समस्या में आया।आर: एकीकृत करें: उपखंडों की अधिकतम संख्या तक पहुंच गई, राउंडऑफ त्रुटि

मैं एक ऐसे फ़ंक्शन को एकीकृत करने की कोशिश कर रहा हूं जिसे डेटासेट से गणना की गई है। डेटा यहां पाया जा सकता है: Link to sample.txt

मैं अपने डेटा पर एक लाइन फिट करके शुरू करता हूं। इसे approxfun या splinefun के साथ गैर-रैखिक के साथ रैखिक किया जा सकता है। नीचे दिए गए मेरे उदाहरण में मैं बाद वाले का उपयोग करता हूं। अब, जब मैं फिट समारोह को एकीकृत करने की कोशिश मैं त्रुटि

  • maximum number of subdivisions reached

में चलाने लेकिन जब मैं उपखंड वृद्धि मैं

  • roundoff error

मिल मेरे नमूना कोड में मानों से, आप इस विशिष्ट डेटा के लिए देख सकते हैं सीमा निर्धारित करें 754-> 755 है।

मेरे सहयोगी को मैटलैब में इस डेटासेट को एकीकृत करने में कोई समस्या नहीं है। एकीकृत करने के लिए मेरे डेटा में हेरफेर करने का कोई तरीका है? आर में संख्यात्मक एकीकरण के लिए एक और तरीका है?

enter image description here

data<-read.table('sample.txt',sep=',') 
colnames(data)<-c('wave','trans') 
plot(data$wave,data$trans,type='l') 

trans<- -1 * log(data$trans) 
plot(data$wave,trans,type='l') 

fx.spline<-splinefun(data$wave,trans) 

#Try either 
Fx.spline<-integrate(fx.spline,min(data$wave),max(data$wave)) 
#Above: Number of subdivision reached 
Fx.spline<-integrate(fx.spline,min(data$wave),max(data$wave),subdivisions=754) 
#Above: Number of subdivision reached 
Fx.spline<-integrate(fx.spline,min(data$wave),max(data$wave),subdivisions=755) 
#Above: Roundoff error 
+0

फिट फ़ंक्शन पोस्ट करने पर विचार करें। मुझे पैरामीटर अनुमान नहीं मिल रहे हैं, हालांकि शायद यह नहीं है कि splinefun कैसे काम करता है, या मैं कुछ गलत कर रहा हूं। –

+0

आपका डेटा शानदार रूप से "फ्लैट" दिखता है, इसलिए शायद 'एकीकृत' को कॉल करना और 'rel.tol' और 'abs.tol' तर्कों के माध्यम से रूपांतरण सीमा को 1e-9 जैसे कुछ सेट करना आपको एक उत्तर मिलेगा जो कि बहुत सटीक है। –

+0

@MarkMiller यहां एक अच्छा ट्यूटोरियल है: http://casoilresource.lawr.ucdavis.edu/drupal/node/896। फ़ंक्शन को साजिश करने के लिए आप 'प्लॉट (डेटा $ लहर, fx.spline (डेटा $ लहर), टाइप =' एल ') टाइप कर सकते हैं' –

उत्तर

6

आर में कई एकीकरण दिनचर्या रहे हैं, और आप 'RSiteSearch'ing या का उपयोग करके' द्वारा एसओएस 'पैकेज उनमें से कुछ पा सकते हैं।

उदाहरण के लिए, पैकेज pracma, कई कार्यान्वयन है उदाहरण के लिए

quad(fx.spline,min(data$wave),max(data$wave)) # adaptive Simpson 
# [1] 2.170449         # 2.5 sec 
quadgk(fx.spline,min(data$wave),max(data$wave)) # adaptive Gauss-Kronrod 
# [1] 2.170449         # 0.9 sec 
quadl(fx.spline,min(data$wave),max(data$wave)) # adaptive Lobatto 
# [1] 2.170449         # 0.8 sec 

कृपया नहीं है कि इन शुद्ध आर स्क्रिप्ट और इसलिए की तुलना में धीमी है, जैसे, इस तरह के एक दोलन समारोह के साथ संकलित integrate दिनचर्या है।

+0

के माध्यम से अच्छा जवाब और मैटलैब परिणामों के लिए एक मैच को संसाधित करने की आवश्यकता है। मैं अभी भी आर सीख रहा हूं, लेकिन दस्तावेजों में चीजों को ढूंढना या सही शब्दों की खोज करना कभी-कभी सीधे आगे नहीं होता है –

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