Als Sinnott die Haversin-Formel veröffentlichte, war die rechnerische Genauigkeit begrenzt. Heutzutage verwenden JavaScript (und die meisten modernen Computer und Sprachen) 64-Bit-Gleitkommazahlen nach IEEE 754, die 15 signifikante Präzisionszahlen liefern. Mit dieser Präzision liefert das einfache sphärische Gesetz der Kosinusformel (
cos c = cos a cos b + sin a sin b cos C
) gut konditionierte Ergebnisse bis zu Entfernungen von nur etwa 1 Meter. In Anbetracht dessen lohnt es sich wahrscheinlich, in den meisten Situationen entweder das einfachere Kosinussatzgesetz oder die genauere ellipsoidale Vincenty-Formel anstelle von Haversin zu verwenden! (Beachten Sie die folgenden Hinweise zu den Genauigkeitsbeschränkungen des sphärischen Modells).
Quelle: http://www.movable-type.co.uk/scripts/latlong.html
Was ist der Grund, warum das Kosinusgesetz vorzuziehen ist?
Hinweis: Der zitierte Text wurde von seinem Autor wie unten erwähnt aktualisiert .
quelle
Antworten:
Das Problem wird durch das Wort "gut konditioniert" angezeigt. Es ist eine Frage der Computerarithmetik, nicht der Mathematik.
Hier sind die grundlegenden Fakten zu berücksichtigen:
Ein Bogenmaß auf der Erde überspannt fast 10 ^ 7 Meter.
Die Cosinusfunktion für Argumente x in der Nähe von 0 ist ungefähr gleich 1 - x ^ 2/2.
Gleitkommazahlen mit doppelter Genauigkeit haben eine Genauigkeit von ca. 15 Dezimalstellen.
Die Punkte (2) und (3) implizieren, dass bei x um einen Meter oder 10 ^ -7 Radiant (Punkt 1) fast die gesamte Genauigkeit verloren geht: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 ist eine Berechnung, bei der die ersten 14 der 15 signifikanten Ziffern alle gelöscht werden und nur eine Ziffer übrig bleibt, um das Ergebnis darzustellen. Das Umkehren dieses Wertes (wie es der inverse Cosinus "acos" tut) bedeutet, dass die Berechnung von acos für Winkel, die Entfernungen in Metern Länge entsprechen, nicht mit einer sinnvollen Genauigkeit durchgeführt werden kann. (In bestimmten schlimmen Fällen ergibt der Genauigkeitsverlust einen Wert, bei dem acos nicht einmal definiert ist, sodass der Code zusammenbricht und keine Antwort, keine unsinnige Antwort oder keinen Absturz der Maschine liefert.) Ähnliche Überlegungen legen nahe, dass Sie die Verwendung des inversen Kosinus vermeiden sollten Bei Entfernungen von weniger als ein paar hundert Metern hängt es davon ab, wie viel Präzision Sie verlieren möchten.
Die Rolle, die acos in der naiven Kosinussatzformel spielt, besteht darin, einen Winkel in eine Entfernung umzuwandeln. Diese Rolle spielt atan2 in der Haversin-Formel. Die Tangente eines kleinen Winkels x ist ungefähr gleich x selbst. Folglich wird der inverse Tangens einer Zahl, der ungefähr dieser Zahl entspricht, im wesentlichen ohne Genauigkeitsverlust berechnet. Aus diesem Grund ist die Haversinformel, obwohl sie dem Gesetz der Cosinusformel mathematisch äquivalent ist, für kleine Entfernungen (in der Größenordnung von 1 Meter oder weniger) weit überlegen .
Hier ist ein Vergleich der beiden Formeln unter Verwendung von 100 zufälligen Punktpaaren auf dem Globus (unter Verwendung von Mathematics Berechnungen mit doppelter Genauigkeit).
Sie können sehen, dass die beiden Formeln bei Entfernungen von weniger als 0,5 Metern voneinander abweichen. Oberhalb von 0,5 Metern stimmen sie eher überein. Um zu zeigen, wie eng sie übereinstimmen, werden im nächsten Diagramm die Verhältnisse des Kosinusgesetzes dargestellt: Haversinusergebnisse für weitere 100 zufällige Punktpaare, wobei sich ihre Breiten- und Längengrade zufällig um bis zu 5 Meter unterscheiden.
Dies zeigt, dass das Gesetz der Kosinusformel bis zu 3-4 Dezimalstellen gilt, sobald der Abstand 5-10 Meter überschreitet. Die Anzahl der Dezimalstellen der Genauigkeit nimmt quadratisch zu; bei 50-100 Metern (eine Größenordnung) erhalten Sie also eine Genauigkeit von 5-6 dp (zwei Größenordnungen); Auf 500-1000 Metern erhalten Sie 7-8 dp usw.
quelle
delta latitude > .1 || delta longitude > .1
um dynamisch entweder Cosinus (für große) oder Haversinus (für kleine Entfernungen) zu wählen? Um die beste Leistung und gute Präzision zu erzielen.atan2
numerische Vorteile gegenüberasin
? Ich habe Benchmarks gesehen,atan2
die 2-3x langsamer waren alsasin
, und wir brauchen auch eine Sekundesqrt
.asin
im Wesentlichen dasselbe istacos
und daher für bestimmte Werte den gleichen Genauigkeitsverlust aufweist - in diesem Fall für Argumente in der Nähe von 1 und -1. Im Prinzip hatatan2
das kein Problem.Eine historische Fußnote:
Der Haversinus war eine Möglichkeit, große Rundungsfehler bei Berechnungen wie zu vermeiden
wenn x klein ist. In Bezug auf die Haversine haben wir
und 2 * sin (x / 2) ^ 2 kann genau berechnet werden, selbst wenn x klein ist.
In früheren Zeiten hatte die Haversin-Formel den zusätzlichen Vorteil, dass eine Addition vermieden wurde (was eine Antilog-Suche, eine Addition und eine Protokollsuche nach sich zog). Eine trigonometische Formel, die nur Multiplikationen enthielt, soll in "logarithmischer Form" vorliegen.
Heutzutage ist die Verwendung der Haversinformeln leicht anachronistisch. Es kann sein, dass der Winkel x in Termen
sin(x)
und ausgedrückt wirdcos(x)
(und x möglicherweise nicht explizit bekannt ist). In diesem Fall beinhaltet die Berechnung1 - cos(x)
über die Haversinusformel einen Arkustangens (um den Winkel x zu erhaltenx/2
), eine Halbierung (um zu erhalten ), einen Sinus (um zu erhaltensin(x/2)
), ein Quadrat (um zu erhaltensin(x/2)^2
) und eine endgültige Verdopplung. Mit dem Auswerten sind Sie weit besser dranwas keine Bewertungen der trigonometrischen Funktionen mit sich bringt. (Verwenden Sie die rechte Seite nur, wenn
cos(x) > 0
dies der Fall ist1 - cos(x)
. Andernfalls können Sie sie direkt verwenden.)quelle
Die Kosinusformel kann in einer Zeile implementiert werden:
Die Haversine-Formel besteht aus mehreren Zeilen:
Mathematisch gibt es identische, so dass der einzige Unterschied in der Praktikabilität besteht.
quelle
atan2
Formel nicht verwendet , gibt es nichts, das einen davon abhält, die 4 obigen Zeilen in eine einzige Formel umzuschreiben.atan2(sqrt(a), sqrt(1-a))
ist dasselbe wieasin(sqrt(a))