2010-02-02 15 views
7

scipy's interpolate.splprep फ़ंक्शन का उपयोग पैरामीटर u पर पैरामीट्रिक स्पलीन प्राप्त करें, लेकिन u का डोमेन स्पलीन की रेखा अभिन्न अंग नहीं है, यह इनपुट निर्देशांक का एक टुकड़ा रैखिक कनेक्शन है। मैंने integrate.splint की कोशिश की है, लेकिन यह केवल u पर व्यक्तिगत इंटीग्रल देता है। जाहिर है, मैं कार्टेशियन अंतर दूरी की संख्या को अंकीय रूप से एकीकृत कर सकता हूं, लेकिन मैं सोच रहा था कि क्या एक स्पलीन या स्पलीन सेगमेंट (स्पीसी या numpy का उपयोग करके) की लंबाई प्राप्त करने के लिए बंद-फॉर्म विधि थी, जिसे मैं देख रहा था।एक क्यूबिक बी-स्पलाइन की लंबाई ढूंढना

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

मैं मैं क्या मानना ​​है कि पट्टी के एक खंड के लिए समारोह है की अनिश्चितकालीन अभिन्न प्राप्त करने की कोशिश करने के लिए मैक्सिमा कोशिश करने के लिए जा रहा हूँ: मैं MathOverflow

उत्तर

6

पर इस पोस्ट क्रॉस क्योंकि दोनों एक्स & y घन हैं पैरामीट्रिक फ़ंक्शन, सरल कार्यों के संदर्भ में एक बंद समाधान नहीं है। संख्यात्मक एकीकरण जाने का रास्ता है। या तो आर्क लम्बाई अभिव्यक्ति को एकीकृत करना या लाइन सेगमेंट लम्बाई जोड़ना - उस सटीकता पर निर्भर करता है जिसके बाद आप हैं और आप कितना प्रयास करना चाहते हैं।

सटीक और तेजी से "रेखा खंडों की लंबाई जोड़ना" विधि:

recurvise उपखंड (डी Casteljeau एल्गोरिथ्म का एक रूप) का उपयोग करते हुए अंक उत्पन्न करने के लिए, आप अंक की न्यूनतम संख्या के साथ एक उच्च सही प्रतिनिधित्व दे सकते हैं । यदि वे मानदंडों को पूरा करने में विफल रहते हैं तो केवल उपविभागों को उप-विभाजित करें। आम तौर पर मानदंड नियंत्रण बिंदु (हल या पिंजरे) में शामिल होने वाली लंबाई पर आधारित होता है। क्यूबिक के लिए, आम तौर पर पी 0 पी 1 + पी 1 पी 2 + पी 2 पी 3 से पी 0 पी 3 की निकटता की तुलना, जहां पी 0, पी 1, पी 2 & पी 3 नियंत्रण बिंदु हैं जो आपके बेजियर को परिभाषित करते हैं। link text

यह अपेक्षाकृत आसान अजगर कन्वर्ट करने के लिए किया जाना चाहिए:

आप यहाँ कुछ डेल्फी कोड पा सकते हैं। यह अंक उत्पन्न करेगा। मानदंडों का परीक्षण करने के लिए कोड पहले से ही सेगमेंट की लंबाई की गणना करता है। आप बस उस लंबाई मूल्यों को रास्ते में जमा कर सकते हैं।

+0

यह समाधान अनुमानों के लिए अच्छा है, लेकिन मुझे अपने प्रश्न में यह कहना चाहिए था कि मैं सटीक या मशीन-परिशुद्धता उत्तर के बाद हूं। यह ईओएल के रोमबर्ग समाधान के समान है, लेकिन मुझे शुद्ध पायथन में पुन: प्रयास करना होगा। – Paul

+0

सामान्य विश्लेषणात्मक समाधान में अंडाकार इंटीग्रल शामिल हैं, आप संख्यात्मक रूप से एकीकृत होंगे, इससे कोई फर्क नहीं पड़ता कि आप क्या दृष्टिकोण लेते हैं। जिस विधि को मैंने रेखांकित किया है वह सीधे आर्क लंबाई अभिव्यक्ति को एकीकृत नहीं करता है लेकिन यह एक संख्यात्मक एकीकरण भी है। यह सब मायने रखता है कि विधि वांछित समय में वांछित सटीकता में परिवर्तित हो जाती है। – symmetry

+0

में थोड़ा और अधिक उन लंबाई मैं करने के लिए है कि आप रास्ते में जमा होता जिक्र कर रहे थे के बारे में सटीक होना ... यहाँ एक नजर है: http://steve.hollasch.net/cgindex/curves/cbezarclen.html व्यक्तिगत उपखंडों की चाप-लंबाई का अनुमान लगाने के लिए हल लंबाई (एल 1) और तार लंबाई (एल 0) का औसत उपयोग करें। – symmetry

4

आप u है, जहां आप डेरिवेटिव x' और scipy.interpolate.splev साथ अपने निर्देशांकों के y' गणना से अधिक समारोह sqrt(x'(u)**2+y'(u)**2) एकीकृत कर सकते हैं। scipy.integrate (quad सटीक [क्लेन्सहा-कर्टिस], romberg आमतौर पर तेज़ है) से एक दिनचर्या के साथ एकीकरण किया जा सकता है। यह बहुत सटीक, और संभवतः बहुत छोटी दूरी को जोड़ने से तेज़ होना चाहिए (जो आयताकार नियम के साथ एकीकृत करने के बराबर है)।

+0

मुझे यह समाधान पसंद है क्योंकि आप अपनी वांछित सटीकता सेट करने में सक्षम हैं, लेकिन दुर्भाग्य से मैं मशीन परिशुद्धता-प्रकार सटीकता के बाद हूं। मैंने आपके सुझाव को लागू किया, लेकिन क्वाडपैक (जैसा कि यह कमाल है) मेरी प्रदर्शन आवश्यकताओं को पूरा नहीं करता है। मैं वर्तमान में एक बंद फॉर्म समाधान की तलाश कर रहा हूं और MathOverflow पर क्रॉस-पोस्ट किया है। बीटीडब्ल्यू: क्लेन्सहा-कर्टिस बहुपदों के लिए केवल सटीक/सटीक है। इस स्पलीन की लंबाई एक अंडाकार कार्य है। – Paul

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