सबसे पहले, हमें इष्टतम परिभाषित करने की आवश्यकता है । चूंकि आप यह नहीं कहते हैं कि आप क्या इष्टतम मानते हैं, ज्यादातर लोग एक द्विघात अभिव्यक्ति का चयन करते हैं। उदाहरण के लिए, मान लीजिए कि आपके वर्तमान संयुक्त कोण वेक्टर द्वारा दिए गए हैं । हम आवश्यक आंदोलन को कम करने पर विचार कर सकते हैं - त्रुटि , आप एक लागत फ़ंक्शन परिभाषित कर सकते हैं कुछ मैट्रिक्स लिए । हम आम तौर पर एक विकर्ण मैट्रिक्स का उपयोग करते हैं, लेकिन कोई भी सकारात्मक-निश्चित मैट्रिक्स करेगा।α⃗ x⃗ =α⃗ −α⃗ startJ=x⃗ TQx⃗ Q
दो संयुक्त कोण के साथ एक सरलीकृत उदाहरण में, यदि संयुक्त एक सस्ता मोटर (शायद अंत प्रेरक के करीब) था, हम की लागत समारोह हो सकता हैa
J=[xaxb][1002][xaxb] , यानी। संयुक्त का आंदोलन संयुक्त की तुलना में दोगुना महंगा ।ba
अब, काइनेमैटिक समीकरण एक मैट्रिक्स फॉर्मूला है, और डेनवेट-हर्टनबर्ग संकेतन में हो सकता है:
∏Ti=⎡⎣⎢⎢⎢100001000010xyz1⎤⎦⎥⎥⎥ , जहां दाहिने हाथ की स्थिति और अभिविन्यास का प्रतिनिधित्व करती है। (वर्तमान में शून्य रोटेशन के रूप में सेट), संयुक्त कोण दिए गए।(x,y,z)
चूंकि हम अभिविन्यास, और केवल स्थिति की परवाह नहीं करते हैं, हम अंतिम परिवर्तन मैट्रिक्स के पहले 3 कॉलम, और पहले परिवर्तन मैट्रिक्स की अंतिम पंक्ति को काट सकते हैं। हम इस सूत्र को समान रूप से व्यक्त कर सकते हैं:
⎡⎣⎢100010001000⎤⎦⎥∏Ti⎡⎣⎢⎢⎢0001⎤⎦⎥⎥⎥=⎡⎣⎢xyz⎤⎦⎥
बाएं हाथ की तरफ से गुणा करने पर हमें तीन समीकरण मिलते हैं। यदि पैरामीटर रैखिक थे, तो हल करना आसान होगा। यह मामला है यदि सभी एक्ट्यूएटर रैखिक एक्ट्यूएटर हैं। इस मामले में, समस्या वास्तव में एक द्विघात कार्यक्रम है । हम समीकरण प्राप्त करने के लिए बाएं हाथ की ओर फिर से व्यवस्था कर सकते हैं:
Kx⃗ =⎡⎣⎢xyz⎤⎦⎥कुछ मैट्रिक्स लिए ।K
एक द्विघात कार्यक्रम एक समस्या है जिसे प्रपत्र में व्यक्त किया जा सकता है:
कम से कमJ=12x⃗ TQx⃗ +c⃗ Tx⃗
, अधीनAx⃗ ≤b⃗ Ex⃗ =d⃗
इसे हल करने के लिए, कई एल्गोरिदम हैं जिनका आप उपयोग कर सकते हैं, उदाहरण के लिए, आंतरिक बिंदु, सक्रिय सेट, ...। बस एक उपयुक्त पुस्तकालय ढूंढें, और यह आपके लिए इसे हल करेगा।
समीकरणों की एक गैर-रेखीय प्रणाली को हल करना अधिक कठिन है। इसे नॉन-लीनियर प्रोग्रामिंग कहा जाता है , लेकिन यह आपके पास है यदि आपके पास घूमने वाले जोड़ हैं।
अनिवार्य रूप से, मैट्रिक्स समीकरणों के स्थान पर, आपके पास गैर-रेखीय कार्य हैं।
कम से कम के अधीन , (शून्य की कमी आरएचएस बनाने के लिए फिर से व्यवस्था यदि आवश्यक हो)f(x)h⃗ (x)=0g⃗ (x)≤0
इसे हल करने के लिए उपयोग किए जाने वाले एल्गोरिदम और भी अधिक जटिल हैं, लेकिन इसमें आंतरिक-बिंदु, अनुक्रमिक द्विघात प्रोग्रामिंग (SQP), सक्रिय-सेट, ट्रस्ट-क्षेत्र चिंतनशील एल्गोरिदम शामिल हैं। जाहिर है, इन एल्गोरिदम का काम कितना लंबा है, इसका स्पष्टीकरण और मैं इसे इस उत्तर के दायरे से बाहर कर दूंगा। यह कहने के लिए पर्याप्त है कि, केवल द्विघात प्रोग्रामिंग के लिए उपयोग किए जाने वाले एल्गोरिदम पर सामग्री की मात्रा अपने आप में एक संपूर्ण पाठ्यक्रम हो सकती है।
आपको समस्या को हल करने के लिए बस एक पुस्तकालय ढूंढना चाहिए, एक कुशल कार्यान्वयन को कोड करने में एक लंबा समय लगेगा, और कुशल कार्यान्वयन एक समय में 100 (या अधिक) चर को संभाल सकता है। उदाहरण के लिए, यदि आप MATLAB का उपयोग करते हैं, तो ऑप्टिमाइज़ेशन टूलबॉक्स से फ़ंक्शन फ़िनकोन का उपयोग करने के तरीके पर प्रलेखन है ।
इसे ऑनलाइन हल करने के लिए, आप C ++ या अन्य मूल कार्यान्वयन चाहते हैं, उदाहरण के लिए, NLopt। ध्यान दें कि यह कुछ ऐसा नहीं हो सकता है जो एक माइक्रोकंट्रोलर जल्दी से हल कर सकता है, और कई पुस्तकालयों में अन्य निर्भरताएं हो सकती हैं जो कि माइक्रोकंट्रोलर पर उपयोग करना आसान नहीं है (क्योंकि वे कंप्यूटर के लिए अभिप्रेत हैं)।
यदि आप दक्षता के बारे में चिंतित नहीं हैं, और बस कुछ आप अपने आप को कोड कर सकते हैं, तो यह मानते हुए कि एक फ़ंक्शन है जिसे आप उलटा गतिज समस्या को हल करने के लिए कॉल कर सकते हैं , आप बस एक ढाल वंश विधि कर सकते हैं। उदाहरण के लिए, मनमाने ढंग से एक यादृच्छिक प्रारंभिक अभिविन्यास चुनना, उलटा समस्या को हल करना, फिर लागत फ़ंक्शन की जांच करना। फिर आप यह जांचने के लिए कि आप अभिविन्यास में क्या अंतर होना चाहिए, गड़बड़ी विश्लेषण का उपयोग कर सकते हैं। उदाहरण के लिए, यदि आप अपने वर्तमान अभिविन्यास (यानी एक क्यूबिक ग्रिड में 8 अंक) के आसपास समान अभिविन्यासों की जांच करते हैं, तो आप एक दूसरा आदेश प्राप्त कर सकते हैं कि प्रत्येक दिशा में लागत फ़ंक्शन कैसे भिन्न होता है।
दूसरे क्रम सन्निकटन का उपयोग करना (जिसे हेसियन मैट्रिक्स के रूप में जाना जाता है क्योंकि यह बहुभिन्नरूपी है - 3-आयामी अभिविन्यास के लिए), आप लागत फ़ंक्शन के ढाल के शून्य-क्रॉसिंग (यानी स्थानीय अनुमानित मिनीमा) को पा सकते हैं।
नई भविष्यवाणी की गई अभिविन्यास के साथ, बस इसे उलटा सॉल्वर के माध्यम से फिर से डालें, और सटीकता पर्याप्त होने तक दोहराएं।
ध्यान दें कि यह संभवतः उतना कुशल नहीं होगा, क्योंकि उलटा गतिज समस्या स्वयं ही इसे हल किया जाना चाहिए (इसलिए आप बार-बार एक फ़ंक्शन का उपयोग कर रहे हैं जिसे हल करने में कुछ समय लगता है)। इसके अलावा, इसमें शामिल कोड पूरी तरह से अनुकूलन एल्गोरिथ्म से कम हो सकता है, लेकिन यह अभी भी काफी पर्याप्त है, और समय का महत्वहीन निवेश नहीं है।
या तो विधि का उपयोग करना (औपचारिक रूप से एक nonlinear कार्यक्रम के रूप में हल करना या उलटा समस्या को हल करने के लिए एक फ़ंक्शन का उपयोग करके पुनरावृत्ति का उपयोग करना), समाधान कई स्थानीय मिनिमा होने पर इष्टतम नहीं हो सकता है। इस मामले में, आप विभिन्न तरीकों का उपयोग करके वैश्विक मिनीमा को खोजने का प्रयास कर सकते हैं। यहां तक कि एक गैर-रैखिक प्रोग्रामिंग सॉल्वर के साथ, आपको शुरुआती मूल्यों (जैसे संयुक्त कोण) के साथ इसे बीजने की उम्मीद होगी। आप विभिन्न तरीकों से उत्पन्न बीज के साथ विधि को बार-बार चला सकते हैं:
- यादृच्छिक पुनरारंभ (यह अनियमित रूप से उत्पन्न होता है)
- ग्रिड आधारित
या अन्य कस्टम तरीके।
हालांकि, ध्यान दें कि यदि कई मिनीमा हैं, तो गारंटी देने का कोई अच्छा तरीका नहीं है कि आप वैश्विक मिनीमा पाएंगे। आप केवल अपने अवसरों में सुधार कर सकते हैं।