İki enlem-boylam noktası arasındaki mesafeyi hesaplarken neden kosinüs kanunu, hoversinden daha fazla tercih edilir?


41

Aslında, Sinnott haversine formülünü yayınladığında hesaplama kesinliği sınırlıydı. Günümüzde, JavaScript (ve çoğu modern bilgisayar ve dil), 15 önemli hassasiyet rakamı sağlayan IEEE 754 64 bit kayan noktalı sayıları kullanır. Bu hassasiyetle, kosinüs formülünün basit küresel yasası ( cos c = cos a cos b + sin a sin b cos C), yaklaşık 1 metre kadar küçük mesafelere kadar iyi sonuçlar verir. Bunu göz önüne alındığında, muhtemelen, çoğu durumda, kosinüslerin basit yasalarını veya haversine tercih edildiğinde daha doğru elipsoidal Vincenty formülünü kullanmakta fayda vardır! (Küresel modelin doğruluğundaki sınırlamalar konusunda aşağıdaki notları dikkate alarak).
Kaynak: http://www.movable-type.co.uk/scripts/latlong.html

Kosinüs hukukunun daha çok tercih edilmesinin nedeni nedir?

Not: Alıntılanan metin, yazarı tarafından aşağıda belirtildiği gibi güncellendi .


10
Kosinüs yasası nasıl tercih edilir? Buna iki şekilde cevap verebiliriz: bilgisayar ve programcı için. Bilgisayar için, haversin formülü daha az trig işlevini kullanır, ancak iki kare kök gerektirir. Hesaplama verimliliği için, o zaman, bir atlama. Programcı için, haversin formülü biraz daha uzundur. Bununla birlikte, kosinüs formülünün yasası, bir ATan uygulamasından biraz daha az görülen ACos uygulamasına sahip olmayı gerektirir. Ayrıca, kurşun geçirmez kod yazmak için ACos'un arızalı olup olmadığını kontrol etmeniz gerekir. Bu nedenle tek başına haversine tercih etmeliyiz.
whuber

2
Python’da yeni bir kosinüs kullandım. Bu bilgisayarda haversine 3,3μs alır ve kosinüs 2,2μs alır - ki eğer birçoğu yapmanız gerekiyorsa oldukça önemli
gnibbler

1
Bazı iyi gözlemler ve bilgiler için herkese teşekkürler. Ben soru alıntı alıntı metni, daha objektif ve yararlı, umarım.
ChrisV

@ChrisV, güncelleme için teşekkürler! Bu soruyu doğrudan soruna cevap vermediği için bir yoruma taşıdım, siteniz için teşekkürler.
scw

Yanıtlar:


48

Sorun, "iyi şartlandırılmış" kelimesiyle gösterilir. Bu bir bilgisayar aritmetik sorunudur, matematik değil.

İşte dikkat etmeniz gereken temel bilgiler:

  1. Yeryüzündeki bir radyan neredeyse 10 ^ 7 metredir.

  2. Bağımsız değişkenler için kosinüs fonksiyonu x , 0'a yakın yaklaşık 1 eşit - X ^ 2/2.

  3. Çift duyarlıklı kayan nokta yaklaşık 15 ondalık basamağa sahiptir.

Noktalar (2) ve (3), x'in bir metre civarında veya 10 ^ -7 radyan (nokta 1) civarındayken, neredeyse tüm hassasiyetlerin kaybolduğunu belirtir : 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - Şekil 14, 15 önemli hanenin ilk 14'ünün iptal ettiği ve sonucu temsil etmek için sadece bir rakam bırakan bir hesaplamadır. Bunun tersine çevrilmesi (ters kosinüs, "acos", bunun tersidir) , sayaç uzunluklarına karşılık gelen açılar için hesaplama acos'larının anlamlı bir hassasiyetle yapılamayacağı anlamına gelir . (Bazı kötü durumlarda, hassasiyet kaybı, acos'un tanımlanmadığı yerlerde bile bir değer verir, bu nedenle kod bozulur ve cevap vermez, saçma bir cevap verir veya makineyi kilitler.) Benzer düşünceler, ters kosinüs kullanmaktan kaçınmanız gerektiğini gösterir. Birkaç yüz metreden daha kısa mesafeler söz konusuysa, ne kadar hassasiyeti kaybetmek istediğinize bağlı olarak.

Acos'un naif-kosinüs formülünde oynadığı rol, açıyı bir mesafeye dönüştürmektir. Bu rol, haversin formülünde atan2 tarafından oynanır. Küçük bir açının x tanjantı yaklaşık olarak x'in kendisine eşittir . Sonuç olarak, bir sayının ters tanjantı, yaklaşık olarak bu sayıdır, esasen hassasiyette bir kayıp olmadan hesaplanır. Bu nedenle, haversin formülünün matematiksel olarak kosinüs formül yasasına eşdeğer olmasına rağmen, küçük mesafeler için (1 metre veya daha az bir sıra ile) çok daha üstündür .

İşte dünyadaki 100 rastgele nokta çifti kullanan iki formülü karşılaştırmak (Mathematica'nın çift hassasiyetli hesaplamaları kullanarak).

alt metin

Yaklaşık 0,5 metreden daha kısa mesafeler için iki formülün ayrıldığını görebilirsiniz. 0,5 metrenin üzerinde anlaşmaya varırlar. Ne kadar yakın bir şekilde anlaştıklarını göstermek için, bir sonraki komplo kosinüs kanununun oranlarını gösterir: enlemler ve boylamlar rastgele olarak 5 metreye kadar değişen 100 rastgele nokta çifti için.

alt metin

Bu, kosinüs formülünün yasasının mesafe 5-10 metreyi aştığında 3-4 ondalık basamağa kadar iyi olduğunu gösterir. Ondalık doğruluk yeri sayısı karesel olarak artar; Böylece 50-100 metrede (bir büyüklük sırası) 5-6 dp hassasiyet elde edersiniz (iki büyüklük sırası); 500-1000 metrede 7-8 dp, vb.


Bazı ucuz testler var mı - örneğin delta latitude > .1 || delta longitude > .1dinamik olarak kosinüs (büyükler için) veya haversinler (küçük mesafeler için) seçmek için? En iyi performansı ve hassasiyeti elde etmek için.
Anony-Mousse

@ Anony-Mousse Her iki formül de, dünyanın dörtte üçündeki mesafeler için yüzde onda bir oranında kapalı olabilir, o yüzden o zamana kadar hassasiyetten korkmayacağız! Bu nedenle, yakın noktaları (birkaç yüz metre) neredeyse tamamen zıt noktalardan (yaklaşık 20 milyon metre) aralarındaki her şeyden ayırabilecek herhangi bir test yeterli olmalıdır.
whuber

atan2Sayısal faydalar sunuyor mu asin? Kriterleri gördüm, burada atan22-3 kat daha yavaştı asinve bizim de bir saniyeye ihtiyacımız var sqrt.
Erich Schubert,

@Erich, farkı çalışmadım, ancak asinasıl olarak aynı olan acosve bu nedenle bazı değerler için aynı hassasiyet kaybına maruz kaldığına dikkat edin - bu durumda, 1 ve -1'e yakın argümanlar için. Prensip olarak, atan2bu sorun yok.
whuber

Çok uzak mesafelerde olur mu? Bunu yukarıdaki Anony-Mousse'nin önerisiyle birleştirmek o zaman ilginç görünmektedir.
Erich Schubert,

6

Tarihsel bir dipnot:

Hageine, hesaplamalar gibi büyük yuvarlama hatalarından kaçınmanın bir yoluydu.

1 - cos(x)

x küçük olduğunda. Haversine açısından biz

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

ve 2 * sin (x / 2) ^ 2, x küçük olduğunda bile doğru bir şekilde hesaplanabilir.

Eski günlerde, haversin formülü bir ilaveden kaçınma (ek olarak bir antilog araması, ilavesi ve bir kayıt defteri taraması gerektiren) konusunda ek bir avantaja sahipti. Sadece çarpma içeren bir trigonometik formülün "logaritmik formda" olduğu söylenir.

Günümüzde, haversin formüllerinin kullanımı hafif yanlıştır. Bu açı x cinsinden ifade edilebilir sin(x)ve cos(x)(ve x açıkça bilinmeyebilir) olabilir. Bu durumda, 1 - cos(x)haversin formülü üzerinden hesaplamak , bir arktantan (x açısını almak için), yarıya almak (almak için x/2), bir sinüs (almak için sin(x/2)), bir kare (almak için sin(x/2)^2) ve son iki katlamayı gerektirir. Değerlendirmeyi kullanarak çok daha iyisin

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

hangi trigonometrik fonksiyonların hiçbir değerlendirme gerektirmez. (Açıkçası, yalnızca sağ tarafını kullanın cos(x) > 0; aksi halde 1 - cos(x)doğrudan kullanmak uygun olur .)


1

Kosinüs formülü bir satırda uygulanabilir:

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

Hversine formülü birden fazla satır alır:

  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))

Matematiksel olarak, özdeş var, bu yüzden tek fark pratikten biri.


Orijinal Haversine bilgisayarla ilgili atan2formülü kullanmasa da , yukarıdaki 4 satırın tek bir formüle yeniden yazılmasını engelleyen hiçbir şey yoktur.
Arjan

Eğer hesaplamak gerekir çünkü @Arjan, Doğru, ama verimsiz olurdu bir iki kere. Formülün hem Sqrt (a) hem de Sqrt (1-a) içermesi esastır, çünkü bunlardan biri çok küçük veya çok büyük mesafeler için sayısal olarak dengesiz olsa da, diğeri olmayacaktır: bu yaklaşımı işe yaratan şey budur.
whuber

Doğru, @whuber, ama yine de satır sayısının diğerini seçmeme neden olacağından şüpheliyim. (Zaten açıklandığı gibisin Ve senin cevabın, bir tane lehine çok daha önemli nedenleri vardır.)
Arjan

3
@Arjan Katılıyorum. Birinin birinci önceliği programlama görevi kodunun yeterliliği olmalıdır. Ondan sonra netlik verirdim: yani okunabilirlik, bakım kolaylığı ve okuma yazma belgeler. Böyle bir içerik yoksa, kod satırlarının sayısını sayarak anlamsızdır.
whuber

1
atan2(sqrt(a), sqrt(1-a))aynıasin(sqrt(a))
user102008
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.