Tại sao định luật cosin lại thích hợp hơn haversine khi tính khoảng cách giữa hai điểm kinh độ vĩ độ?


41

Trên thực tế, khi Sinnott công bố công thức haversine, độ chính xác tính toán bị hạn chế. Ngày nay, JavaScript (và hầu hết các máy tính & ngôn ngữ hiện đại) sử dụng các số dấu phẩy động 64 bit 64 bit, cung cấp 15 số liệu chính xác. Với độ chính xác này, định luật hình cầu đơn giản của công thức cosin ( cos c = cos a cos b + sin a sin b cos C) cho kết quả được điều hòa tốt xuống khoảng cách nhỏ khoảng 1 mét. Theo quan điểm này, có lẽ đáng giá, trong hầu hết các tình huống, sử dụng định luật cosin đơn giản hơn hoặc công thức Vincenty ellipsoidal chính xác hơn để ưu tiên cho haversine! (ghi chú dưới đây về những hạn chế về độ chính xác của mô hình hình cầu).
Nguồn: http://www.movable-type.co.uk/scripts/latlong.html

Lý do tại sao luật của vũ trụ là thích hợp hơn?

Lưu ý: Văn bản trích dẫn đã được cập nhật bởi tác giả của nó như được đề cập dưới đây .


10
Làm thế nào là luật của cosin "thích hợp"? Chúng ta có thể trả lời điều này theo hai cách: cho máy tính và lập trình viên. Đối với máy tính, công thức haversine sử dụng ít chức năng trig hơn nhưng yêu cầu hai căn bậc hai. Để có hiệu quả tính toán, sau đó, đó là một sự thay đổi. Đối với lập trình viên, công thức haversine dài hơn một chút. Tuy nhiên, luật công thức cosin đòi hỏi phải có triển khai ACos, điều này được thấy ít thường xuyên hơn so với triển khai ATan. Hơn nữa, để viết mã chống đạn, bạn phải kiểm tra xem ACos sẽ không bị lỗi. Vì lý do này một mình chúng ta nên thích haversine.
whuber

2
Tôi vừa mới triển khai haversine và cosine trong Python. Trên máy tính này, haversine mất 3,3 giây và cosin mất 2,2 giây, điều này khá quan trọng nếu bạn cần thực hiện nhiều thao tác đó
gnibbler

1
Cảm ơn tất cả mọi người cho một số quan sát và thông tin tốt. Tôi đã cập nhật văn bản trích dẫn trong câu hỏi, tôi hy vọng, thay vì khách quan và hữu ích hơn.
ChrisV

@ChrisV, cảm ơn đã cập nhật! Tôi đã chuyển nhận xét này sang nhận xét vì đây không phải là câu trả lời trực tiếp cho câu hỏi, cảm ơn vì trang web tuyệt vời của bạn.
scw

Câu trả lời:


48

Vấn đề được chỉ định bởi từ "điều hòa tốt." Đây là một vấn đề của số học máy tính, không phải toán học.

Dưới đây là những sự thật cơ bản cần xem xét:

  1. Một radian trên trái đất kéo dài gần 10 ^ 7 mét.

  2. Hàm cosine cho các đối số x gần 0 xấp xỉ bằng 1 - x ^ 2/2.

  3. Điểm nổi chính xác kép có khoảng 15 chữ số thập phân chính xác.

Điểm (2) và (3) ngụ ý rằng khi x ở khoảng một mét, hoặc 10 ^ -7 radian (điểm 1), gần như tất cả độ chính xác bị mất: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 là một phép tính trong đó 14 chữ số đầu tiên trong số 15 chữ số có nghĩa đều bị hủy, chỉ còn lại một chữ số để biểu thị kết quả. Lật cái này xung quanh (đó là cái mà cosin nghịch đảo, "acos", có nghĩa là) tính toán acos cho các góc tương ứng với khoảng cách chiều dài mét có thể được thực hiện với bất kỳ độ chính xác có ý nghĩa nào. (Trong một số trường hợp xấu nhất định, việc mất độ chính xác mang lại giá trị trong đó acos thậm chí không được xác định, do đó mã sẽ bị hỏng và không có câu trả lời, câu trả lời vô nghĩa hoặc làm hỏng máy.) Các cân nhắc tương tự cho thấy bạn nên tránh sử dụng cosin nghịch đảo nếu khoảng cách dưới vài trăm mét có liên quan, tùy thuộc vào độ chính xác mà bạn sẵn sàng mất.

Vai trò của acos trong công thức định luật cosin ngây thơ là chuyển đổi một góc thành một khoảng cách. Vai trò đó được chơi bởi atan2 trong công thức haversine. Tiếp tuyến của một góc nhỏ x xấp xỉ bằng x chính nó. Do đó, tiếp tuyến nghịch đảo của một số, xấp xỉ số đó, được tính toán cơ bản mà không mất độ chính xác. Đây là lý do tại sao công thức haversine, mặc dù về mặt toán học tương đương với định luật công thức cosin, vượt trội hơn nhiều so với khoảng cách nhỏ (theo thứ tự từ 1 mét trở xuống).

Dưới đây là so sánh hai công thức sử dụng 100 cặp điểm ngẫu nhiên trên toàn cầu (sử dụng phép tính chính xác kép của Mathicala).

văn bản thay thế

Bạn có thể thấy rằng với khoảng cách dưới 0,5 mét, hai công thức phân kỳ. Trên 0,5 mét họ có xu hướng đồng ý. Để cho thấy họ đồng ý chặt chẽ như thế nào, âm mưu tiếp theo cho thấy các tỷ lệ của định luật cosin: kết quả haversine cho 100 cặp điểm ngẫu nhiên khác, với vĩ độ và kinh độ của chúng khác nhau ngẫu nhiên tới 5 mét.

văn bản thay thế

Điều này cho thấy luật công thức cosin tốt đến 3-4 chữ số thập phân một khi khoảng cách vượt quá 5-10 mét. Số lượng vị trí thập phân của độ chính xác tăng bậc hai; do đó ở 50-100 mét (một bậc độ lớn) bạn có được độ chính xác 5-6 dp (hai bậc độ lớn); ở 500-1000 mét bạn nhận được 7-8 dp, v.v.


Có một số thử nghiệm giá rẻ - ví dụ delta latitude > .1 || delta longitude > .1để tự động chọn cosine (cho lớn) hoặc haversine (cho khoảng cách nhỏ)? Để có được hiệu suất tốt nhất và độ chính xác tốt.
Anony-Mousse

@ Anony-Mousse Cả hai công thức có thể bị giảm một phần mười của một phần trăm cho khoảng cách một phần tư trên toàn thế giới, vì vậy sau đó chúng ta sẽ không lo lắng về độ chính xác! Do đó, bất kỳ thử nghiệm nào có thể phân biệt các điểm gần (vài trăm mét) với các điểm gần như đối xứng (khoảng 20 triệu mét) với mọi thứ ở giữa là đủ.
whuber

atan2cung cấp lợi ích số hơn asin? Tôi thấy điểm chuẩn, nơi atan2chậm hơn 2-3 lần asinvà chúng tôi cũng cần một giây sqrt.
Erich Schubert

@Erich Tôi chưa nghiên cứu về sự khác biệt, nhưng lưu ý rằng asinvề cơ bản là giống như acosvậy và do đó bị mất cùng độ chính xác cho các giá trị nhất định - trong trường hợp này, cho các đối số gần 1 và -1. Về nguyên tắc, atan2không có vấn đề đó.
whuber

Đó sẽ là ở khoảng cách rất lớn? Kết hợp điều đó với gợi ý của @ Anony-Mousse ở trên có vẻ thú vị rồi.
Erich Schubert

6

Một chú thích lịch sử:

Các haversine là một cách để tránh các lỗi làm tròn lớn trong các tính toán như

1 - cos(x)

khi x nhỏ. Về mặt haversine chúng ta có

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

và 2 * sin (x / 2) ^ 2 có thể được tính toán chính xác ngay cả khi x nhỏ.

Vào thời xưa, công thức haversine có một lợi thế bổ sung là tránh bổ sung (trong đó đòi hỏi phải tra cứu antimon, bổ sung và tra cứu nhật ký). Một công thức lượng giác chỉ đòi hỏi phép nhân được gọi là "dạng logarit".

Ngày nay, việc sử dụng các công thức haversine là hơi lỗi thời. Có thể là góc x được biểu thị bằng thuật ngữ sin(x)cos(x)(và x có thể không được biết rõ ràng). Trong trường hợp đó, tính toán 1 - cos(x)thông qua công thức haversine đòi hỏi một arctangent (để có được góc x), giảm một nửa (để có được x/2), một sin (để có được sin(x/2)), một hình vuông (để có được sin(x/2)^2) và nhân đôi cuối cùng. Bạn tốt hơn nhiều khi sử dụng đánh giá

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

trong đó đòi hỏi không có đánh giá của các hàm lượng giác. (Rõ ràng chỉ sử dụng phía bên tay phải nếu cos(x) > 0; nếu không, bạn có thể sử dụng 1 - cos(x)trực tiếp.)


1

Công thức cosine có thể được thực hiện trong một dòng:

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

Công thức haversine có nhiều dòng:

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

Về mặt toán học, có sự giống hệt nhau, vì vậy sự khác biệt duy nhất là một trong thực tiễn.


Mặc dù Haversine ban đầu không sử dụng atan2công thức liên quan đến máy tính , nhưng không có gì ngăn người ta viết lại 4 dòng trên thành một công thức.
Arjan

@ Arjan, True, nhưng nó sẽ không hiệu quả vì bạn sẽ cần phải tính toán một hai lần. Điều quan trọng là công thức liên quan đến cả Sqrt (a) và Sqrt (1-a), bởi vì mặc dù một trong số này sẽ không ổn định về số lượng cho khoảng cách rất nhỏ hoặc rất lớn, nhưng cái kia sẽ không: đó là điều làm cho phương pháp này hoạt động.
whuber

Đúng, @whuber, nhưng tôi vẫn nghi ngờ số lượng dòng sẽ khiến tôi chọn cái này hơn cái kia. (Và giống như bạn đã được giải thích trong câu trả lời của mình , có nhiều lý do quan trọng hơn để ủng hộ một.)
Arjan

3
@Arjan Tôi đồng ý. Ưu tiên hàng đầu của một người phải là sự đầy đủ của mã cho nhiệm vụ lập trình. Sau đó tôi sẽ đặt sự rõ ràng: đó là, khả năng đọc, khả năng bảo trì và tài liệu biết chữ. Không có bối cảnh như vậy, đếm số dòng mã là vô nghĩa.
whuber

1
atan2(sqrt(a), sqrt(1-a))giống nhưasin(sqrt(a))
user102008
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.