मैट्रिक्स बैलेंसिंग एल्गोरिथम


9

मैं स्क्रैच से नियंत्रण प्रणाली टूलबॉक्स लिख रहा हूं और शुद्ध रूप से पायथन 3 (बेशर्म प्लग:) में harold। अपने पिछले शोध से, मुझे हमेशा रिक्ती सॉल्वर के बारे में शिकायत care.mहै कि वे तकनीकी / अप्रासंगिक हैं।

इसलिए, मैं दिनचर्या का अपना सेट लिख रहा हूं। एक चीज जो मुझे नहीं मिल रही है, वह यह है कि एक उच्च-प्रदर्शन संतुलन एल्गोरिथ्म प्राप्त किया जाए, कम से कम उतना ही अच्छा हो balance.m। इससे पहले कि आप इसका उल्लेख करें, xGEBALपरिवार को स्काइप में उजागर किया गया है और आप मूल रूप से स्काइप से निम्नानुसार कॉल कर सकते हैं, मान लें कि आपके पास एक फ्लोट प्रकार 2 डी सरणी है A:

import scipy as sp
gebal = sp.linalg.get_lapack_funcs(('gebal'),(A,)) # this picks up DGEBAL
Ab, lo, hi, scaling , info = gebal(A, scale=1 , permute=1 , overwrite_a=0 )

अब अगर मैं निम्नलिखित परीक्षण मैट्रिक्स का उपयोग करता हूं

array([[ 6.      ,  0.      ,  0.      ,  0.      ,  0.000002],
       [ 0.      ,  8.      ,  0.      ,  0.      ,  0.      ],
       [ 2.      ,  2.      ,  6.      ,  0.      ,  0.      ],
       [ 2.      ,  2.      ,  0.      ,  8.      ,  0.      ],
       [ 0.      ,  0.      ,  0.000002,  0.      ,  2.      ]])

मुझे मिला

array([[ 8.      ,  0.      ,  0.      ,  2.      ,  2.      ],
       [ 0.      ,  2.      ,  0.000002,  0.      ,  0.      ],
       [ 0.      ,  0.      ,  6.      ,  2.      ,  2.      ],
       [ 0.      ,  0.000002,  0.      ,  6.      ,  0.      ],
       [ 0.      ,  0.      ,  0.      ,  0.      ,  8.      ]])

हालाँकि, अगर मैं इसे पास कर दूं, तो balance.mमुझे मिल जाएगा

>> balance(A)

ans =

    8.0000         0         0    0.0625    2.0000
         0    2.0000    0.0001         0         0
         0         0    6.0000    0.0002    0.0078
         0    0.0003         0    6.0000         0
         0         0         0         0    8.0000

यदि आप क्रमपरिवर्तन पैटर्न की जांच करते हैं, तो वे समान हैं, हालांकि स्केलिंग बंद है। gebalएकता स्केलिंग देता है जबकि मतलाब 2 की निम्न शक्तियाँ देता है [-5,0,8,0,2]:।

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

एक बात शायद मैं इस बात पर जोर दे सकता हूं कि मुझे बेनर के काम की जानकारी है; विशेष रूप से इस उद्देश्य के लिए विशेष रूप से हैमिल्टनियन मेट्रिसेस के सिम्पलेक्टिक संतुलन । हालांकि, ध्यान दें कि इस प्रकार के उपचार को gcare.m(सामान्यीकृत रिक्ति सॉल्वर) के भीतर किया जाता है और संतुलन को सीधे के माध्यम से किया जाता है balance.m। इसलिए, अगर कोई मुझे वास्तविक कार्यान्वयन के लिए इंगित कर सकता है, तो मैं सराहना करूंगा।


प्रकटीकरण: मैं वास्तव में इंजीनियर मैथवर्क्स कोड को उलटने की कोशिश नहीं कर रहा हूं: मैं वास्तव में इस प्रश्न की प्रेरणा सहित विभिन्न कारणों के कारण इससे दूर होना चाहता हूं, यह कहना है, मुझे नहीं पता कि यह क्या कर रहा है जिससे मुझे बहुत फायदा हुआ दिन में समय वापस। मेरा इरादा एक संतोषजनक संतुलन एल्गोरिथ्म प्राप्त करना है जो मुझे CAREX उदाहरणों को पारित करने की अनुमति देता है जैसे कि मैं नियमित सॉल्वर के शीर्ष पर न्यूटन पुनरावृत्ति विधियों को लागू कर सकता हूं।

जवाबों:


7

मुझे यह पता लगाने में काफी समय लगा और जैसा कि आप अपराधी को ढूंढने के बाद करते हैं।

डेविड एस वाटकिंस में रिपोर्ट किए गए समस्याग्रस्त मामलों की जाँच के बाद एक मामला जहां संतुलन हानिकारक है। इलेक्ट्रॉन। ट्रांस। Numer। गुदा, २३: १-४, २००६ और यहां भी चर्चा (दोनों में उद्धृत किया जा रहा है : १४०१.५ ) ६६वी १ ), यह पता चला है कि पहले माटाबेल विकर्ण तत्वों को अलग करके संतुलन का उपयोग करता है।

मेरा प्रारंभिक विचार LAPACK कार्यों पर शास्त्रीय सीमित प्रलेखन के अनुसार था, GEBAL ने स्वचालित रूप से यह प्रदर्शन किया। हालाँकि, मुझे लगता है कि विकर्ण तत्वों की अनदेखी करने से लेखकों का क्या मतलब है , उन्हें पंक्ति / स्तंभ से नहीं निकाल रहे हैं।

वास्तव में, यदि मैं मैन्युअल रूप से तिरछे को सरणी से हटाता हूं, तो दोनों परिणाम संयोग होते हैं, अर्थात

import scipy as sp
gebal = sp.linalg.get_lapack_funcs(('gebal'),(A,)) # this picks up DGEBAL
Ab, lo, hi, scaling , info = gebal(A - np.diag(np.diag(A)), scale=1 , permute=1 , overwrite_a=0 )  

balance.m( परिणाम के विकर्ण प्रविष्टियों के बिना) के रूप में एक ही परिणाम देता है ।

यदि कोई फोरट्रान- सेवी उपयोगकर्ता dgebal.f की जाँच करके इसकी पुष्टि कर सकता है , तो मैं आभारी रहूँगा।

EDIT: उपरोक्त परिणाम का अर्थ यह नहीं है कि यह एकमात्र अंतर है। मैंने अलग-अलग मेट्रिसेस का भी निर्माण किया है जहाँ GEBAL और balance.m. विकर्णों के अलग होने के बाद भी अलग-अलग परिणाम उत्पन्न करते हैं।

मैं काफी उत्सुक हूं कि अंतर क्या हो सकता है लेकिन ऐसा लगता है कि यह पता करने का कोई तरीका नहीं है कि यह एक matlab बिल्ट-इन है और इसलिए यह बंद कोड है।

EDIT2 : यह पता चलता है कि Matlab LAPACK (शायद पूर्व 3.5.0) के पुराने संस्करण का उपयोग कर रहा था और 2016b तक वे नए संस्करण में अपग्रेड किए गए प्रतीत हो रहे हैं। अब परिणाम सहमत हैं जहां तक ​​मैं परीक्षण कर सकता हूं। इसलिए मुझे लगता है कि इस मुद्दे को सुलझाता है। मुझे पुराने LAPACK संस्करणों के साथ इसका परीक्षण करना चाहिए था।

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