दो अक्षांश-देशांतर बिंदुओं के बीच की दूरी की गणना करते समय कोसाइन का नियम हवेर्सिन से अधिक बेहतर क्यों है?


41

वास्तव में, जब सिनोट ने हावरसाइन सूत्र प्रकाशित किया, तो कम्प्यूटेशनल परिशुद्धता सीमित थी। आजकल, जावास्क्रिप्ट (और अधिकांश आधुनिक कंप्यूटर और भाषाएं) IEEE 754 64-बिट फ्लोटिंग-पॉइंट संख्याओं का उपयोग करते हैं, जो सटीकता के 15 महत्वपूर्ण आंकड़े प्रदान करते हैं। इस परिशुद्धता के साथ, कोजाइन फॉर्मूला ( cos c = cos a cos b + sin a sin b cos C) का सरल गोलाकार कानून लगभग 1 मीटर के रूप में छोटी दूरी के लिए अच्छी तरह से वातानुकूलित परिणाम देता है। इसे देखते हुए, यह संभवतया, अधिकांश स्थितियों में, कोसाइन के सरल नियम या हवेर्सिन के लिए वरीयता में अधिक सटीक दीर्घवृत्त विन्सेन्टी फॉर्मूला का उपयोग करके है! (गोलाकार मॉडल की सटीकता में सीमाओं के नीचे मन नोट्स पर असर)।
स्रोत: http://www.movable-type.co.uk/scripts/latlong.html

क्या कारण है कि ब्रह्मांड के कानून अधिक बेहतर हैं?

नोट: उद्धृत पाठ को इसके लेखक द्वारा अद्यतन किया गया है जैसा कि नीचे उल्लेख किया गया है


10
कोसाइन का कानून "बेहतर" कैसे है? हम इसका दो तरीकों से जवाब दे सकते हैं: कंप्यूटर और प्रोग्रामर के लिए। कंप्यूटर के लिए, हावरसाइन सूत्र कम ट्रिगर कार्यों का उपयोग करता है, लेकिन इसके लिए दो वर्गमूलों की आवश्यकता होती है। कम्प्यूटेशनल दक्षता के लिए, फिर, यह एक टॉस-अप है। प्रोग्रामर के लिए, हावरसाइन सूत्र थोड़ा लंबा है। हालांकि, कॉशन फॉर्मूले के कानून में एसीओएस कार्यान्वयन की आवश्यकता होती है, जिसे एटीएएन कार्यान्वयन की तुलना में कम बार देखा जाता है। इसके अलावा, बुलेटप्रूफ कोड लिखने के लिए आपको यह देखना होगा कि एसीओ विफल नहीं होंगे। केवल इसी कारण से हमें हावरसाइन को प्राथमिकता देनी चाहिए।
whuber

2
मैंने पाइथन में हैवरसाइन और कोसाइन को लागू किया है। इस कंप्यूटर पर हैवरसाइन 3.3μs लेता है और कोसाइन 2.2μs लेता है जो काफी महत्वपूर्ण है यदि आपको उनमें से बहुत कुछ करने की आवश्यकता है
gnibbler

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

@ क्रिस, अपडेट के लिए धन्यवाद! मैंने इसे एक टिप्पणी पर स्थानांतरित कर दिया है क्योंकि यह सीधे सवाल का जवाब नहीं है, आपकी महान साइट के लिए धन्यवाद।
SCW

जवाबों:


48

समस्या शब्द "अच्छी तरह से वातानुकूलित" द्वारा इंगित किया गया है। यह कंप्यूटर अंकगणित का मुद्दा है, गणित का नहीं।

यहाँ पर विचार करने के लिए मूल तथ्य हैं:

  1. पृथ्वी पर एक रेडियन लगभग 10 ^ 7 मीटर तक फैला है।

  2. 0 के पास तर्क x के लिए कोजाइन फ़ंक्शन लगभग 1 - x ^ 2/2 के बराबर है ।

  3. डबल-सटीक फ़्लोटिंग पॉइंट में सटीक के लगभग 15 दशमलव अंक होते हैं।

अंक (2) और (3) का अर्थ है कि जब x एक मीटर के आसपास होता है, या 10 ^ -7 रेडियन (बिंदु 1) होता है, तो लगभग सभी सटीकता खो जाती है: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 एक गणना है जिसमें 15 महत्वपूर्ण अंकों में से पहले 14 सभी रद्द करते हैं, जिससे परिणाम का प्रतिनिधित्व करने के लिए केवल एक अंक होता है। इसके चारों ओर फ़्लिप करना (जो कि उलटा कोसाइन, "एसीओस", करता है) का अर्थ है कि मीटर-लंबाई की दूरी के अनुरूप कोणों के लिए एकिंग कंप्यूटिंग किसी भी सार्थक सटीकता के साथ नहीं किया जा सकता है। (कुछ ख़राब मामलों में परिशुद्धता का नुकसान एक मूल्य देता है जहाँ एको को परिभाषित भी नहीं किया जाता है, इसलिए कोड टूट जाएगा और कोई जवाब नहीं देगा, एक बकवास जवाब देगा, या मशीन को क्रैश कर देगा।) इसी तरह के विचार बताते हैं कि आपको उलटा कोसाइन का उपयोग करने से बचना चाहिए। अगर कुछ सौ मीटर से कम की दूरी शामिल है, तो आप कितना सटीक खोने के लिए तैयार हैं पर निर्भर करता है।

भोले-भाले कानून में एकोस द्वारा निभाई गई भूमिका एक कोण को दूरी में परिवर्तित करना है। यह भूमिका हवन के सूत्र में atan2 द्वारा निभाई जाती है। एक छोटे कोण x की स्पर्शरेखा लगभग x के बराबर है। नतीजतन, किसी संख्या का व्युत्क्रम स्पर्शरेखा, उस संख्या के लगभग होने पर, अनिवार्य रूप से सटीकता में कोई नुकसान नहीं होने के साथ गणना की जाती है। यही कारण है कि हैवरसाइन फॉर्मूला, हालांकि गणितीय रूप से कॉशन फॉर्मूला के कानून के बराबर है, छोटी दूरी (1 मीटर या उससे कम के आदेश पर) के लिए बहुत बेहतर है

यहाँ विश्व पर 100 यादृच्छिक बिंदु-युग्मों का उपयोग करते हुए दो सूत्रों की तुलना की गई है (गणितज्ञ के दोहरे-सटीक गणनाओं का उपयोग करके)।

वैकल्पिक शब्द

आप देख सकते हैं कि लगभग 0.5 मीटर से कम दूरी के लिए, दो सूत्र विचलन करते हैं। 0.5 मीटर से ऊपर वे सहमत हैं। यह दिखाने के लिए कि वे कितनी निकटता से सहमत हैं, अगला प्लॉट कॉज़न्स के कानून के अनुपात को दर्शाता है: एक और 100 यादृच्छिक बिंदु जोड़े के लिए हैवेरिन परिणाम, उनके अक्षांश और देशांतर के साथ यादृच्छिक रूप से 5 मीटर तक भिन्न होते हैं।

वैकल्पिक शब्द

इससे पता चलता है कि एक बार दूरी 5-10 मीटर से अधिक हो जाने पर कोसाइन सूत्र का नियम 3-4 दशमलव स्थानों के लिए अच्छा है। सटीकता के दशमलव स्थानों की संख्या चौगुनी बढ़ जाती है; इस प्रकार 50-100 मीटर (परिमाण का एक क्रम) पर आपको 5-6 डीपी सटीकता (परिमाण के दो आदेश) मिलते हैं; 500-1000 मीटर पर आपको 7-8 डीपी आदि मिलते हैं।


क्या कोई सस्ता परीक्षण है - उदाहरण के delta latitude > .1 || delta longitude > .1लिए गतिशील रूप से या तो कोसाइन (बड़े के लिए) या हैवरसाइन (छोटी दूरी के लिए)? ताकि सबसे अच्छा प्रदर्शन और अच्छी परिशुद्धता प्राप्त हो सके।
ऐनी-मूस

@ Anony-Mousse दोनों सूत्र दुनिया भर में एक-चौथाई की दूरी के लिए एक प्रतिशत के कुछ दसवें भाग से दूर हो सकते हैं, इसलिए तब तक हम सटीक के बारे में उपद्रव नहीं करेंगे! इसलिए कोई भी परीक्षा जो बीच में सब कुछ से पर्याप्त रूप से विपरीत बिंदुओं (लगभग 20 मिलियन मीटर) से करीब बिंदुओं (कुछ सौ मीटर) को अलग कर सकती है, पर्याप्त होना चाहिए।
whuber

क्या atan2संख्यात्मक लाभ प्रदान करता है asin? मैंने बेंचमार्क देखा, जहां atan22-3x की तुलना में धीमी थी asin, और हमें दूसरी sqrtभी चाहिए।
एरिक Schubert

@ जब मैंने अंतर का अध्ययन नहीं किया है, लेकिन ध्यान दें कि asinअनिवार्य रूप से एक ही चीज़ है acosऔर इसलिए कुछ मूल्यों के लिए सटीक के समान नुकसान से ग्रस्त है - इस मामले में, 1 और -1 के पास तर्कों के लिए। सिद्धांत रूप में, atan2यह समस्या नहीं है।
whuber

यह बहुत बड़ी दूरी पर होगा? @ Anony-Mousse के सुझाव के साथ संयोजन करना तब दिलचस्प लगता है।
एरच Schubert

6

एक ऐतिहासिक फुटनोट:

हैवेराइन कम्प्यूटेशन जैसे बड़े दौर की त्रुटियों से बचने का एक तरीका था

1 - cos(x)

जब x छोटा होता है। हैवरसाइन के संदर्भ में हमारे पास है

1 - cos(x) = 2*sin(x/2)^2
           = 2*haversin(x)

और 2 * पाप (x / 2) ^ 2 की गणना x सही होने पर भी की जा सकती है।

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

आजकल, ह्वरसाइन सूत्र का उपयोग थोड़ा अभिमानी है। यह हो सकता है कि कोण एक्स संदर्भ में व्यक्त किया जाता है sin(x)और cos(x)(और एक्स स्पष्ट रूप से ज्ञात नहीं हो सकता है)। उस स्थिति में, 1 - cos(x)हावरसाइन सूत्र के माध्यम से गणना करने से एक आर्कण्टेंट (कोण x प्राप्त करने के लिए), रुकना (प्राप्त करना x/2), एक साइन (प्राप्त करना sin(x/2)), एक वर्ग (प्राप्त करना sin(x/2)^2) और एक अंतिम दोहरीकरण होता है। आप मूल्यांकन का उपयोग करके बहुत बेहतर हैं

1 - cos(x) = sin(x)^2/(1 + cos(x))

जो त्रिकोणमितीय कार्यों का कोई मूल्यांकन नहीं करता है। (स्पष्ट रूप से दाएं हाथ की ओर का उपयोग केवल तभी करें cos(x) > 0; अन्यथा, 1 - cos(x)सीधे उपयोग करना ठीक है ।)


1

कोसाइन सूत्र को एक पंक्ति में लागू किया जा सकता है:

  Distance = acos(SIN(lat1)*SIN(lat2)+COS(lat1)*COS(lat2)*COS(lon2-lon1))*6371

Haversine सूत्र कई लाइनें लेता है:

  dLat = (lat2-lat1)
  dLon = (lon2-lon1)
  a = sin(dLat/2) * sin(dLat/2) + cos(lat1) * cos(lat2) * sin(dLon/2) * sin(dLon/2)
  distance = 6371 * 2 * atan2(sqrt(a), sqrt(1-a))

गणितीय रूप से, समान हैं, इसलिए एकमात्र अंतर व्यावहारिकता में से एक है।


हालांकि मूल हॅवरसाइन कंप्यूटर से संबंधित atan2सूत्र का उपयोग नहीं करता है, लेकिन ऐसा कुछ भी नहीं है जो किसी एक सूत्र में 4 पंक्तियों को ऊपर फिर से लिखने से रखता हो।
अर्जन

@Arjan, यह सच है, लेकिन यह अक्षम हो क्योंकि आप गणना करने के लिए की आवश्यकता होगी चाहते हैं एक दो बार। यह आवश्यक है कि सूत्र Sqrt (a) और Sqrt (1-a) दोनों को सम्मिलित करता है, क्योंकि इनमें से एक बहुत छोटी या बहुत बड़ी दूरी के लिए संख्यात्मक रूप से अस्थिर होगा, दूसरा नहीं होगा: यह वही है जो इस दृष्टिकोण को बनाता है।
whuber

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

3
@ अर्जन मैं सहमत हूँ। प्रोग्रामिंग कार्य के लिए किसी की पहली प्राथमिकता कोड की पर्याप्तता होनी चाहिए। उसके बाद मैं स्पष्टता रखूंगा: यानी पठनीयता, स्थिरता और साक्षरता। इस तरह के संदर्भ को अनुपस्थित करना, कोड की लाइनों की संख्या को गिनना व्यर्थ है।
whuber

1
atan2(sqrt(a), sqrt(1-a))के रूप में ही हैasin(sqrt(a))
2:10 पर user102008
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.