W rzeczywistości, kiedy Sinnott opublikował formułę haverine, precyzja obliczeniowa była ograniczona. Obecnie JavaScript (i większość współczesnych komputerów i języków) używa 64-bitowych liczb zmiennoprzecinkowych IEEE 754, które zapewniają 15 znaczących liczb precyzji. Z tą precyzją proste sferyczne prawo cosinusów (
cos c = cos a cos b + sin a sin b cos C
) daje dobrze uwarunkowane wyniki aż do odległości tak małych, jak około 1 metra. W związku z tym w większości przypadków prawdopodobnie warto zastosować prostsze prawo cosinusów lub dokładniejszą elipsoidalną formułę Vincenty'ego zamiast haverine! (mając na uwadze poniższe uwagi dotyczące ograniczeń dokładności modelu sferycznego).
Źródło: http://www.movable-type.co.uk/scripts/latlong.html
Jaki jest powód, dla którego prawo cosinusów jest bardziej preferowane?
Uwaga: cytowany tekst został zaktualizowany przez autora, jak wspomniano poniżej .
źródło
Odpowiedzi:
Problem wskazuje słowo „dobrze uwarunkowane”. To kwestia arytmetyki komputerowej, a nie matematyki.
Oto podstawowe fakty do rozważenia:
Jeden radian na ziemi ma prawie 10 ^ 7 metrów.
Funkcja cosinus dla argumentów x w pobliżu 0 jest w przybliżeniu równa 1 - x ^ 2/2.
Zmienna zmiennoprzecinkowa podwójnej precyzji ma około 15 cyfr dziesiętnych precyzji.
Punkty (2) i (3) oznaczają, że gdy x wynosi około jednego metra lub 10 ^ -7 radianów (punkt 1), prawie cała precyzja jest tracona: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 jest obliczeniem, w którym pierwsze 14 z 15 cyfr znaczących wszystkie są anulowane, pozostawiając tylko jedną cyfrę reprezentującą wynik. Odwracanie tego (co robi odwrotny cosinus „acos”) oznacza, że obliczanie acos dla kątów odpowiadających odległościom metra nie może być wykonane z żadną znaczącą dokładnością. (W niektórych złych przypadkach utrata precyzji daje wartość, w której acos nie jest nawet zdefiniowany, więc kod się zepsuje i nie da odpowiedzi, bezsensownej odpowiedzi lub zawiesi maszynę.) Podobne uwagi sugerują, że należy unikać używania odwrotnego cosinusa jeśli występują odległości mniejsze niż kilkaset metrów, w zależności od tego, ile precyzji jesteś gotów stracić.
Rolą acos w naiwnej formule prawa cosinusów jest konwersja kąta na odległość. Tę rolę odgrywa atan2 w formule haverine. Styczna małego kąta x jest w przybliżeniu równa samemu x . W konsekwencji odwrotna styczna liczby, która jest w przybliżeniu tą liczbą, jest obliczana zasadniczo bez utraty precyzji. Właśnie dlatego formuła haversine, choć matematycznie równoważna zasadzie formuły cosinus, jest znacznie lepsza dla małych odległości (rzędu 1 metra lub mniejszej).
Oto porównanie dwóch formuł wykorzystujących 100 losowych par punktowych na kuli ziemskiej (przy użyciu obliczeń podwójnej precyzji Mathematica).
Widać, że dla odległości mniejszych niż około 0,5 metra obie formuły się różnią. Powyżej 0,5 metra zwykle się zgadzają. Aby pokazać, jak ściśle się ze sobą zgadzają, następny wykres pokazuje stosunki prawa cosinusów: wyniki haverine dla kolejnych 100 losowych par punktowych, przy czym ich szerokości i długości geograficzne różnią się losowo o maksymalnie 5 metrów.
To pokazuje, że prawo formuły cosinus jest dobre do 3-4 miejsc po przecinku, gdy odległość przekroczy 5-10 metrów. Liczba miejsc dziesiętnych dokładności rośnie kwadratowo; tak więc przy 50-100 metrach (jeden rząd wielkości) otrzymujesz dokładność 5-6 dp (dwa rzędy wielkości); na 500-1000 metrów dostajesz 7-8 dp itp.
źródło
delta latitude > .1 || delta longitude > .1
Aby dynamicznie wybrać cosinus (dla dużych) lub haversine (dla małych odległości)? Aby uzyskać najlepszą wydajność i dobrą precyzję.atan2
oferuje przewagę liczbowąasin
? Widziałem testy porównawcze, gdzieatan2
były 2-3 razy wolniejsze niżasin
i potrzebujemy też drugiegosqrt
.asin
jest to w zasadzie to samoacos
i dlatego cierpi z powodu tej samej utraty precyzji dla niektórych wartości - w tym przypadku dla argumentów w pobliżu 1 i -1. Zasadniczoatan2
nie ma tego problemu.Historyczny przypis:
Hversine był sposobem na uniknięcie dużych błędów zaokrągleń w obliczeniach takich jak
gdy x jest małe. Jeśli chodzi o haverine mamy
i 2 * sin (x / 2) ^ 2 można dokładnie obliczyć, nawet gdy x jest małe.
W dawnych czasach formuła haverine miała dodatkową zaletę polegającą na unikaniu dodawania (co wiązało się z wyszukiwaniem antylogicznym, dodawaniem i przeglądaniem logów). Mówi się, że wzór trygonometryczny, który obejmował tylko mnożenia, ma „postać logarytmiczną”.
W dzisiejszych czasach stosowanie formuł haverine jest nieco anachroniczne. Możliwe, że kąt x jest wyrażony w kategoriach
sin(x)
icos(x)
(i x może nie być wyraźnie znany). W takim przypadku obliczanie1 - cos(x)
za pomocą formuły haversine wymaga arcus tangens (aby uzyskać kąt x), zmniejszenie o połowę (aby uzyskaćx/2
), sinus (aby uzyskaćsin(x/2)
), kwadrat (aby uzyskaćsin(x/2)^2
) i ostateczne podwojenie. O wiele lepiej jest używać ocenianiaco nie wymaga oceny funkcji trygonometrycznych. (Oczywiście używaj prawej strony tylko wtedy
cos(x) > 0
, gdy ; w przeciwnym razie możesz używać1 - cos(x)
bezpośrednio.)źródło
Formułę cosinus można zaimplementować w jednym wierszu:
Formuła haverine ma wiele linii:
Matematycznie są identyczne, więc jedyną różnicą jest praktyczność.
źródło
atan2
formuły związanej z komputerem , nic nie stoi na przeszkodzie , aby przepisać 4 linie powyżej w jedną formułę.atan2(sqrt(a), sqrt(1-a))
jest taki sam, jakasin(sqrt(a))