2014-06-12 6 views
7

का उपयोग करके 2 डी बी-स्पलाइन पथ खींचने के लिए जीएनयू वैज्ञानिक पुस्तकालय (जीएसएल) का उपयोग करके मैं ए से बी तक एक आसान पथ खींचने के लिए जीएनयू वैज्ञानिक पुस्तकालय (जीएसएल) का उपयोग करने की कोशिश कर रहा हूं। एपीआई कि (लाल रंग में) अनियमित अंतराल के अंक के (इस मामले में 8) एक छोटी संख्या देता है, तो आपको निम्न चित्र में देख सकते हैं कि:असमान रूप से दूरी वाले अंक

returned points and desired result from GSL

बैंगनी अंक अंक करता हूं कि मेरे लिए करना चाहते हैं जीएसएल से वापस देखें।

सबसे पहले, इस तरह का 2 डी बी-स्पलाइन आकार जीएसएल का उपयोग करके उपलब्ध है? मुझे बी-स्प्लिंस के बारे में बहुत कुछ पता नहीं है, अकेले 2 डी बी-स्प्लिंस दें। मैं बी splines उदाहरण दिखाया गया here चल रहा है और समस्या के बिना एक चिकनी .ps फ़ाइल बनाने प्राप्त करने में सक्षम था, लेकिन है कि उदाहरण के लिए निम्न कोड के साथ एक समान breakpoints उपयोग करता है:

/* use uniform breakpoints on [0, 15] */ 
gsl_bspline_knots_uniform(0.0, 15.0, bw); 

मेरे मामले में, उस डेटा मैं दिया 'दिया गया है अनियमित है और समान रूप से दूरी नहीं है, क्या मुझे गैर-वर्दी नॉट्स का उपयोग करना होगा? मैंने निम्नलिखित परीक्षण कोड में गैर वर्दी ब्रेकपॉइंट्स का उपयोग करने के लिए gsl_bspline_knots() का उपयोग करने का प्रयास किया, लेकिन मुझे सच में यकीन नहीं है कि यह सही दिशा है या नहीं।

#define NCOEFFS 8 // not sure what this number should be - number of data points? 
#define NBREAK (NCOEFFS - 2) 
const size_t nbreak = NBREAK; 

int main (void) { 

    // (example code)... 

    gsl_vector *non_uniform = gsl_vector_alloc(nbreak); 

    // create some random breakpoint values 
    for (i=0; i<nbreak; i++) { 
     double val = gsl_ran_gaussian(r, 2.0); 
     printf("val: %f\n", val); 
     gsl_vector_set(non_uniform, i, val); 
    } 

    gsl_bspline_knots(non_uniform, bw); 

    // (more example code)... 
} 

और भी, मैं 2 डी x/y समन्वय स्थान में बी-स्प्लिंस ड्राइंग के लिए उपर्युक्त उदाहरण का अनुवाद कैसे करूं? यदि जीएनयू वैज्ञानिक पुस्तकालय इसके लिए उपयुक्त नहीं है, तो क्या कोई अधिक उपयुक्त सी/सी ++ लाइब्रेरी के लिए सिफारिश कर सकता है?

दिशा में किसी भी मदद या पॉइंटर्स की बहुत सराहना की जाएगी।

उत्तर

2

पहले: -1 डी आधार splines

NBREAK breakpoints (t_1, ..., t_{NBREAK}) का एक सेट को देखते हुए, वहाँ घन बी splines घटकों B_j(t) हैं। इन कार्यों और उनके पहले और दूसरे डेरिवेटिव हमेशा ब्रेकपॉइंट्स पर भी निरंतर रहते हैं। नतीजतन, रैखिक संयोजन f(t) = \sum m_j B_j(t) द्वारा दिया गया कोई भी फिट इन गुणों को साझा करेगा (प्राकृतिक क्यूबिक splines के समान)। बी-स्पलाइन घटकों की संख्या, NCOEFFS, डेटा बिंदुओं की संख्या के बराबर होने की आवश्यकता नहीं है, NDATA। यदि NCOEFFS < NDATA, तो आप फिट प्राप्त करने के लिए कम से कम वर्ग न्यूनीकरण का उपयोग करेंगे (जीएसएल दस्तावेज़ में बी-स्पलीन फिट here प्राप्त करने के लिए न्यूनतम कम से कम वर्ग गणना का एक अच्छा उदाहरण है)। NCOEFFS < NDATA अच्छा विकल्प है जब डेटा में शोर होता है जो आपके मामले

कारण है कि गुणांक की संख्या ब्रेकपॉइंट्स, की संख्या के बराबर नहीं है, इस तथ्य से संबंधित है कि आप निर्दिष्ट नहीं करते हैं आधार splines के साथ काम करते समय एक सीमा की स्थिति। यह देखते हुए कि लोग आमतौर पर प्राकृतिक क्यूबिक splines से अधिक परिचित हैं, यह टिप्पणी करने लायक है कि natural cubic splines सीमा की स्थिति d^2f(x)/dx^2=0 लगाओ। यही कारण है कि क्यूबिक बहुपद आधार का उपयोग कर प्राकृतिक क्यूबिक splines के किसी भी प्रतिनिधित्व NCOEFFS=NBREAK होगा। Here is a link क्यूबिक बहुपदों के गुणांक द्वारा दी गई आजादी की डिग्री की गिनती के बारे में बहुत अच्छी व्याख्या के लिए जो प्राकृतिक बी-स्प्लिंस और f(t), df(t)/dt और d^2f(t)/dt^2 की निरंतरता को लागू करने के लिए आवश्यक समीकरणों की संख्या का प्रतिनिधित्व करते हैं।

अंत में: बी-स्प्लिंस का उपयोग करके एक पैरामीट्रिक वक्र फिट करें।

आपके पास "डेटा" अंक (x_1, y_1)....(x_{NDATA},y_{NDATA}) का सेट है और आप एक पैरामीट्रिक फिट P(t)=(f_1(t), f_2(t)) बनाना चाहते हैं। यदि NCOEFFS<NDATA (यदि आप अपने ब्रेकपॉइंट्स सावधानीपूर्वक चुनते हैं और NCOEFFS=N_DATA) तो बी-स्प्लिंस फिट सभी डेटा पॉइंट्स से गुज़रेंगे नहीं। मेरे शोध में, मैं केवल 1 डी nonparametric फिट (y=f(x)) के साथ काम करता हूं, लेकिन मेरा मानना ​​है कि यह पैरामीट्रिक मामला समान है। मैं निम्नलिखित

चरण 1: "डेटा" अंक (t, x) = {(1, x_1), (2, x_2)...(NDATA, x_{NDATA})} का सेट बनाएं और उन्हें फिट करने के लिए जीएसएल 1 डी बी-स्प्लिंस का उपयोग करें। यह फिट आपको t \in [1,NDATA] के साथ देगा।

चरण 2: अब "डेटा" अंक (t, y) = {(1, y_1), (2, y_2)...(NDATA, y_{NDATA})} के सेट का निर्माण करें और उन्हें फिट करने के लिए बी-स्प्लिंस का उपयोग करें। यह आपको f_2(t) = sum_{i=1}^{NCOEFFS} my_j B_j(t)t \in [1,NDATA]

अब प्लॉट P(t)=(f_1(t), f_2(t)), t \in [1,NDATA] प्रदान करेगा। असल में, मैंने 2 डी डी पैरापरेटिक वक्र समस्या को 2 1 डी गैरपरैमेट्रिक फिट में मैप किया (जो जीएसएल प्रदान करता है)।

अंतिम बिंदु जब तक आप रेंज t\in[1, NDATA] और NCOEFFS <= NDATA कवर breakpoints की पसंद (और आधार घटकों NCOEFFS की संख्या) चरण 1 और कदम 2 में है, breakpoints के चुनाव मनमाने ढंग से है। मेरा मानना ​​है कि यदि आप {1, 3, ..., NDATA-2, NDATA } होने के लिए ब्रेकपॉइंट्स चुनते हैं तो फिट डेटा पॉइंट्स के माध्यम से जाएगा (ध्यान दें कि मैंने आंतरिक बिंदु t=2 और t=NDATA-1 जैसे NBREAK=NDATA-2 और NCOEFFS=NDATA) को छोड़ दिया है। इस प्रकार NAG लाइब्रेरी इंटरपोलेशन फिट प्राप्त करने के लिए ब्रेकपॉइंट्स का चयन करती है (अर्थ: एक फिट जो डेटा पॉइंट को गुजरती है)।

+0

गहराई से जवाब Vinicius के लिए बहुत बहुत धन्यवाद। यह शायद मुझे पचाने के लिए एक या दो दिन ले जा रहा है और वास्तव में इसे समझता है। यह मुझे स्पष्ट है कि मुझे splines के मूलभूत सिद्धांतों के संबंध में और अधिक सीखने की जरूरत है। –

+0

यदि आप जीएसएल दस्तावेज में सावधानी से उदाहरण पढ़ते हैं, तो आप देखेंगे कि 1 डी गैर-पैरामीट्रिक बी-स्पलीन फिट का व्यावहारिक कार्यान्वयन बहुत जटिल नहीं है। F_1 (टी) और f_2 (टी) फिट करने के लिए इसका पालन करें। –

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