Faktanya, ketika Sinnott menerbitkan formula haversine, ketepatan komputasi terbatas. Saat ini, JavaScript (dan sebagian besar komputer & bahasa modern) menggunakan nomor floating-point IEEE 754 64-bit, yang memberikan 15 angka presisi yang signifikan. Dengan presisi ini, hukum bola sederhana rumus cosinus (
cos c = cos a cos b + sin a sin b cos C
) memberikan hasil yang terkondisi dengan baik hingga jarak sekecil 1 meter. Mengingat hal ini, dalam sebagian besar situasi, mungkin layak menggunakan hukum cosinus yang lebih sederhana atau formula Vincenty ellipsoidal yang lebih akurat daripada haversine! (dengan mengingat catatan di bawah ini tentang keterbatasan dalam akurasi model bola).
Sumber: http://www.movable-type.co.uk/scripts/latlong.html
Apa alasan mengapa hukum cosinus lebih disukai?
Catatan: Teks yang dikutip telah diperbarui oleh penulisnya sebagaimana disebutkan di bawah ini .
sumber
Jawaban:
Masalahnya ditunjukkan oleh kata "terkondisi dengan baik." Ini masalah aritmatika komputer, bukan matematika.
Berikut adalah fakta dasar yang perlu dipertimbangkan:
Satu radian di bumi membentang hampir 10 ^ 7 meter.
Fungsi cosinus untuk argumen x dekat 0 kira-kira sama dengan 1 - x ^ 2/2.
Titik apung presisi ganda memiliki sekitar 15 digit desimal presisi.
Poin (2) dan (3) menyiratkan bahwa ketika x sekitar satu meter, atau 10 ^ -7 radian (poin 1), hampir semua presisi hilang: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 adalah perhitungan di mana 14 dari 15 digit signifikan pertama dibatalkan, hanya menyisakan satu digit untuk mewakili hasilnya. Membalik-balik ini (yang artinya cosinus terbalik, "acos", artinya) menghitung komputasi untuk sudut yang sesuai dengan jarak meteran panjang tidak dapat dilakukan dengan akurasi yang berarti. (Dalam kasus-kasus buruk tertentu kehilangan presisi memberikan nilai di mana AC bahkan tidak didefinisikan, sehingga kode akan rusak dan tidak memberikan jawaban, jawaban omong kosong, atau crash mesin.) Pertimbangan serupa menyarankan Anda harus menghindari menggunakan cosinus terbalik jika jarak kurang dari beberapa ratus meter terlibat, tergantung pada seberapa presisi Anda bersedia kehilangan.
Peran yang dimainkan oleh ACOS dalam rumus law-of-cosines naif adalah untuk mengubah sudut ke jarak. Peran itu dimainkan oleh atan2 dalam formula haversine. Garis singgung dari sudut kecil x kira-kira sama dengan x itu sendiri. Akibatnya, garis singgung terbalik dari suatu bilangan, yaitu kira-kira bilangan itu, dihitung secara esensial tanpa kehilangan presisi. Inilah sebabnya mengapa rumus haversine, meskipun secara matematis setara dengan rumus hukum cosinus, jauh lebih unggul untuk jarak kecil (pada urutan 1 meter atau kurang).
Berikut ini adalah perbandingan dari dua rumus menggunakan 100 pasangan titik acak di dunia (menggunakan perhitungan presisi ganda Mathematica).
Anda dapat melihat bahwa untuk jarak kurang dari 0,5 meter, kedua formula berbeda. Di atas 0,5 meter mereka cenderung setuju. Untuk menunjukkan seberapa dekat mereka sepakat, plot berikutnya menunjukkan rasio hukum cosinus: hasil haversine untuk 100 pasangan titik acak lainnya, dengan garis lintang dan bujur mereka secara acak berbeda hingga 5 meter.
Ini menunjukkan bahwa rumus hukum cosinus baik untuk 3-4 tempat desimal setelah jarak melebihi 5-10 meter. Jumlah tempat desimal akurasi meningkat secara kuadrat; jadi pada 50-100 meter (satu urutan magnitudo) Anda mendapatkan akurasi 5-6 dp (dua orde magnitudo); pada 500-1000 meter Anda mendapatkan 7-8 dp, dll.
sumber
delta latitude > .1 || delta longitude > .1
untuk secara dinamis memilih cosinus (untuk besar) atau haversine (untuk jarak kecil)? Untuk mendapatkan kinerja terbaik dan presisi yang baik.atan2
menawarkan manfaat numerik lebihasin
? Saya melihat tolok ukur, di manaatan2
2-3x lebih lambat daripadaasin
, dan kami juga membutuhkan yang keduasqrt
.asin
pada dasarnya hal yang samaacos
dan karenanya menderita kehilangan presisi yang sama untuk nilai-nilai tertentu - dalam hal ini, untuk argumen dekat 1 dan -1. Pada prinsipnya,atan2
tidak ada masalah itu.Catatan sejarah:
The haversine adalah cara untuk menghindari kesalahan pembulatan besar dalam perhitungan seperti
ketika x kecil. Dalam hal haversine yang kita miliki
dan 2 * sin (x / 2) ^ 2 dapat dihitung secara akurat bahkan ketika x kecil.
Di masa lalu, formula haversine memiliki keuntungan tambahan untuk menghindari penambahan (yang memerlukan pencarian antilog, penambahan, dan pencarian log). Rumus trigonometik yang hanya memerlukan multiplikasi dikatakan dalam "bentuk logaritmik".
Saat ini, penggunaan formula haversine sedikit ketinggalan zaman. Mungkin saja sudut x diekspresikan dalam istilah
sin(x)
dancos(x)
(dan x mungkin tidak diketahui secara eksplisit). Dalam hal itu, komputasi1 - cos(x)
melalui rumus haversine memerlukan arctangent (untuk mendapatkan sudut x), membagi dua (untuk mendapatkanx/2
), sinus (untuk mendapatkansin(x/2)
), kuadrat (untuk mendapatkansin(x/2)^2
) dan penggandaan akhir. Anda jauh lebih baik menggunakan evaluasiyang tidak memerlukan evaluasi fungsi trigonometri. (Tentunya gunakan sisi kanan hanya jika
cos(x) > 0
; jika tidak, boleh digunakan1 - cos(x)
secara langsung.)sumber
Formula cosine dapat diimplementasikan dalam satu baris:
Formula haversine mengambil banyak baris:
Secara matematis, ada yang identik, jadi satu-satunya perbedaan adalah kepraktisan.
sumber
atan2
formula yang berhubungan dengan komputer , tidak ada yang mencegah seseorang untuk menulis ulang 4 baris di atas menjadi satu formula.atan2(sqrt(a), sqrt(1-a))
sama denganasin(sqrt(a))