संख्यात्मक कोड में जटिलता से कैसे निपटें, उदाहरण के लिए, जब बड़े जैकबियन मेट्रिसेस से निपटते हैं?


10

मैं युग्मित समीकरणों की एक गैर-रेखीय प्रणाली को हल कर रहा हूं, और विवेकाधीन प्रणाली के जेकोबियन की गणना की है। परिणाम वास्तव में जटिल है, नीचे (केवल!) 3 × 9 मैट्रिक्स के पहले 3 कॉलम हैं ;3×9

आंशिक याकूब मैट्रिक्स

(जटिलता, भाग में उत्पन्न होती है, क्योंकि संख्यात्मक योजना में स्थिरता के लिए घातीय फिटिंग की आवश्यकता होती है।)

मेरे पास जेकोबियंस का उपयोग करके संख्यात्मक कोड के कार्यान्वयन के बारे में एक सामान्य प्रश्न है।

मैं आगे जाकर इस मैट्रिक्स को कोड में लागू कर सकता हूं। लेकिन मेरा अंतर्ज्ञान मुझे सरासर जटिलता और त्रुटियों को पेश करने की अपरिहार्यता के कारण थकाऊ डिबगिंग के कुछ दिनों (शायद हफ्तों) की उम्मीद करने के लिए कह रहा है। संख्यात्मक कोड में इस तरह की जटिलता से कैसे सामना किया जाता है, यह अपरिहार्य लगता है ?! क्या आप प्रतीकात्मक पैकेज से स्वचालित कोड-पीढ़ी का उपयोग करते हैं (फिर हाथ से कोड को घुमाएं)?

पहले मैं एक परिमित अंतर के साथ विश्लेषणात्मक जैकबियन को डिबग करने की योजना बनाता हूं, क्या मुझे किसी भी नुकसान के बारे में पता होना चाहिए? आप अपने कोड में समान समस्याओं से कैसे निपटते हैं?

अपडेट करें

मैं इसे पायथन में कोड कर रहा हूं और याकूब को उत्पन्न करने के लिए सहानुभूति का इस्तेमाल किया है । शायद मैं कोड-पीढ़ी की सुविधा का उपयोग कर सकता हूं ?


जैकबियन भाव उत्पन्न करने के लिए आप किस कंप्यूटर बीजगणित प्रणाली का उपयोग कर रहे हैं? यदि आप मेपल का उपयोग कर रहे हैं, तो आप codegenपैकेज को देखना चाहते हैं क्योंकि यह प्रत्येक या सभी भावों के लिए स्वचालित रूप से कॉम्पैक्ट और कुशल C या फोरट्रान कोड उत्पन्न कर सकता है।
पेड्रो

यहाँ बहुत सारे उपयोगी उत्तर हैं, यह एक लेने के लिए समझ में नहीं आता है। क्या मुझे इसे एक सामुदायिक विकी पोस्ट बनाना चाहिए?
boyfarrell

जवाबों:


6

एक शब्द: मॉड्यूलरिटी

आपके जेकबियन में बहुत सारे दोहराए गए अभिव्यक्ति हैं जो उनके स्वयं के कार्य के रूप में लिखे जा सकते हैं। आपके लिए एक ही ऑपरेशन को एक से अधिक बार लिखने का कोई कारण नहीं है, और यह डीबगिंग को आसान बना देगा; यदि आप इसे केवल एक बार लिखते हैं तो एक त्रुटि के लिए केवल एक ही जगह है (सिद्धांत में)।

मॉड्यूलर कोड परीक्षण को आसान बना देगा; आप अपने जेकोबियन के प्रत्येक घटक के लिए परीक्षण लिख सकते हैं क्योंकि पूरे मैट्रिक्स का परीक्षण करने की कोशिश कर रहा है। उदाहरण के लिए, यदि आप एक मॉड्यूलर फैशन में अपना फंक्शन am () लिखते हैं, तो आप आसानी से इसके लिए पवित्रता परीक्षण लिख सकते हैं, जांचें कि क्या आप इसे ठीक से विभेदित कर रहे हैं, आदि।

एक अन्य सुझाव यह होगा कि जैकबियन को असेंबल करने के लिए स्वचालित भेदभाव पुस्तकालयों को देखा जाए। इस बात की कोई गारंटी नहीं है कि वे त्रुटि-मुक्त हैं, लेकिन संभवतः अपने स्वयं के लेखन की तुलना में कम डीबगिंग / कम त्रुटियां होंगी। यहाँ कुछ आप इसे देखना चाहते हो सकता है:

  • सैकाडो (सैंडिया लैब्स)
  • ADIC (आर्गोनोन)

क्षमा करें, बस देखा कि आप अजगर का उपयोग कर रहे हैं। साई के लिए साइंटिफिक पैथॉन का समर्थन है।


अच्छी सलाह। मध्यवर्ती अभिव्यक्तियों को अक्सर अपने स्वयं के कार्यों की आवश्यकता नहीं होती है - बस उन्हें मध्यवर्ती चर में संग्रहीत करें।
डेविड केचेसन

5

एक कहानी के साथ प्रस्तुत सावधानी के कुछ शब्दों के साथ मुझे यहाँ तौलना चाहिए। बहुत पहले, मैंने एक साथी के साथ काम किया था जब मैं बस शुरू कर रहा था। बल्कि एक गन्दा उद्देश्य के साथ हल करने के लिए उसके पास एक अनुकूलन समस्या थी। उनका समाधान एक अनुकूलन के लिए विश्लेषणात्मक व्युत्पन्न उत्पन्न करना था।

जो समस्या मैंने देखी वह ये थी कि यह बुरा था। Macsyma का उपयोग करते हुए, फोरट्रान कोड में परिवर्तित किया गया, वे प्रत्येक दर्जनों निरंतर बयान स्टेटमेंट थे। वास्तव में, फोरट्रान संकलक उस पर परेशान हो गया, क्योंकि यह निरंतरता बयानों की अधिकतम संख्या से अधिक था। जबकि हमें एक झंडा मिला, जिससे हम उस समस्या से घिर गए, और भी समस्याएँ थीं।

  • लंबी अभिव्यक्तियों में, जैसा कि आमतौर पर सीए सिस्टम द्वारा उत्पन्न किया जाता है, बड़े पैमाने पर घटाव रद्द करने का जोखिम होता है। बहुत सारी बड़ी संख्याओं की गणना करें, केवल यह पता लगाने के लिए कि वे सभी एक दूसरे को रद्द कर दें ताकि छोटी संख्या उत्पन्न हो सके।

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

मेरी कहानी का मुद्दा यह है कि सीए द्वारा निर्मित भावों के अपने मुद्दे हैं। मजेदार बात यह है कि मेरे सहयोगी वास्तव में समस्या की जटिलता पर गर्व करते थे, कि वह स्पष्ट रूप से एक कठिन समस्या को हल कर रहे थे क्योंकि बीजगणित इतना बुरा था। मुझे नहीं लगता कि उन्हें लगता है कि अगर बीजगणित वास्तव में सही चीज़ की गणना कर रहा था, तो क्या यह सही ढंग से कर रहा था, और क्या यह इतनी कुशलता से कर रहा था।

अगर मैं इस परियोजना में उस समय वरिष्ठ व्यक्ति होता, तो मैं उसे दंगा अधिनियम पढ़ता। उनके अभिमान ने उन्हें एक ऐसे समाधान का उपयोग करने के लिए प्रेरित किया जो संभवतः अनावश्यक रूप से जटिल था, यहां तक ​​कि यह भी जांचे बिना कि एक परिमित अंतर आधारित ढाल पर्याप्त था। मैं शर्त लगाता हूँ कि हमने इस अनुकूलन को चलाने के लिए शायद एक सप्ताह का समय बिताया था। बहुत कम से कम, मैं उसे ध्यान से उत्पादित ढाल का परीक्षण करने के लिए परामर्श देता। क्या यह सही था? परिमित अंतर डेरिवेटिव की तुलना में यह कितना सही था? वास्तव में, आज के आसपास ऐसे उपकरण हैं जो अपनी व्युत्पन्न भविष्यवाणी में त्रुटि का एक अनुमान भी लौटाएंगे। यह निश्चित रूप से अनुकूली भेदभाव कोड के लिए सच है , (derivest) मैंने MATLAB में लिखा है।

कोड का परीक्षण करें। डेरिवेटिव सत्यापित करें।

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

यदि आप विश्लेषणात्मक डेरिवेटिव का उपयोग करते हैं, तो उन्हें शब्दों का पुन: उपयोग करने के लिए कोड दें। यह एक गंभीर समय की बचत हो सकती है, और वास्तव में अपने समय की बचत करते हुए, बग को कम कर सकती है। लेकिन फिर उन नंबरों की जांच करें!


5

विचार करने के लिए कई रणनीतियाँ हैं:

  1. एक CAS का उपयोग करके प्रतीकात्मक रूप में डेरिवेटिव का पता लगाएं, फिर डेरिवेटिव की गणना के लिए कोड निर्यात करें।

  2. कोड उत्पन्न करने के लिए एक स्वचालित विभेदीकरण (AD) उपकरण का उपयोग करें जो कोड से व्युत्पन्न कार्यों की गणना करता है।

  3. याकूब को अनुमानित करने के लिए परिमित अंतर अनुमानों का उपयोग करें।

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



1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.