मैं एक रोबोट स्थानीयकरण प्रणाली के आधार पर काम कर रहा हूं, और सच कहा जाए, तो मुझे यकीन नहीं है कि यह गणित है या कार्यान्वयन का मुद्दा है। मैं कम से कम स्क्वायर फिटिंग का उपयोग करके ध्रुवीय निर्देशांक के एक सेट में एक रेखा फिट करने की कोशिश कर रहा हूं। रेखा को ध्रुवीय रूप में दर्शाया गया है। मुझे हमारे पर्यवेक्षक से दो समीकरण दिए गए हैं, एक कोण खोजने के लिए और दूसरा मूल बिंदु की दूरी ज्ञात करने के लिए। (छवि देखें)
https://i.stack.imgur.com/jUEZ5.png
मैंने सी ++ में समीकरण को लागू करने का प्रयास किया है।
struct Pt {
double d, angle;
};
// Polar coordinates of the points (-2, 1) and (5, 1) respectively.
std::vector<Pt> points = { { 2.2360679774997898, 2.6779450445889870 }, { 5.0990195135927845, 0.19739555984988075 } };
double a, r = 0;
double n = points.size();
double sumOfWeights = n;
double num1 = 0, num2 = 0, den1 = 0, den2 = 0;
for (int i = 0; i < n; i++) {
double iP = points[i].d, iTheta = points[i].angle;
num1 += iP * iP * sin(2 * iTheta);
den1 += iP * iP * cos(2 * iTheta);
for (int j = 0; j < n; j++) {
double jP = points[j].d, jTheta = points[j].angle;
num2 += iP * jP * cos(iTheta) * sin(jTheta);
den2 += iP * jP * cos(iTheta + jTheta);
}
}
a = 0.5 * atan2((num1 - (2.0 / sumOfWeights) * num2), (den1 - (1.0 / sumOfWeights) * den2));
for (int i = 0; i < n; i++) r += points[i].d * cos(points[i].angle - a);
r /= sumOfWeights;
मैं फिर इसे बिंदुओं (-2,1) और (5,1) का ध्रुवीय निरूपण देता हूं और इसके परिणामस्वरूप 0 का कोण और 1.5 की दूरी होती है, जो गलत है, क्योंकि रेखा में pi/2 का कोण होना चाहिए और 1 की उत्पत्ति की दूरी, है ना?
1 उत्तर
मुझे आपके कोड में कोई समस्या नहीं दिख रही है।
आपके उदाहरण में, आप जिस रेखा की तलाश कर रहे हैं उसका समीकरण y = 1 है।
मेरी समझ में, यह 0 के बराबर कोण के अनुरूप है, pi/2 नहीं। आपने इंगित किया है कि आपका प्रोग्राम जो प्रदान करता है वह 0 का कोण है।
पाई/2 मूल बिंदु से रेखा के निकटतम बिंदु का कोण है।
हालांकि, दूरी की गणना r के लिए एक समस्या है। निम्नलिखित में, मैं विश्लेषण की सुविधा के लिए जटिल संकेतन का उपयोग करूंगा: .
के लिए, आपकी दूरी की गणना निम्न से मेल खाती है:
a = 0 के लिए, यह अंकों के औसत के वास्तविक भाग से मेल खाता है, वास्तव में आपके उदाहरण में 1.5। यह वही है जो आपका कार्यक्रम प्रदान करता है।
वास्तविक भाग को काल्पनिक भाग से प्रतिस्थापित करने पर 1 का सही मान प्राप्त होगा, अर्थात cos(.) को sin(.) से प्रतिस्थापित करके।
हालाँकि, मैं गारंटी नहीं दे सकता कि यह सभी मामलों में काम करेगा। मैं आपको इंटरनेट पर या अपने पर्यवेक्षक के साथ सूत्रों की जांच करने के लिए आमंत्रित करता हूं। खेद है कि इस समय बेहतर नहीं कर पा रहा हूँ।
नोट: जटिल अंकन भी गणना को सरल बनाने की अनुमति देता है। यहां एक उदाहरण दिया गया है, भले ही मैं समझता हूं कि इस समय यह आपकी प्राथमिकता नहीं है:
नोट: मैं पहले चरण में टेक्स समीकरणों को सही ढंग से प्रदर्शित करने में सक्षम नहीं था। Bob__ की टिप्पणी के लिए धन्यवाद, मैं इसे सुधारने में सक्षम था। अभी भी मुकम्मल नहीं...
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।