두 위도-경도 지점 사이의 거리를 계산할 때 코사인 법칙이 왜 소르 세인보다 선호됩니까?


41

실제로 Sinnott가 haversine 공식을 발표했을 때 계산 정밀도는 제한적이었습니다. 오늘날 JavaScript (및 대부분의 최신 컴퓨터 및 언어)는 15 개의 중요한 정밀도를 제공하는 IEEE 754 64 비트 부동 소수점 숫자를 사용합니다. 이 정밀도로, 코사인 공식 의 간단한 구형 법칙 ( cos c = cos a cos b + sin a sin b cos C)은 약 1m 정도의 거리까지 잘 조절 된 결과를 제공합니다. 이것에 비추어 볼 때, 대부분의 상황에서 더 간단한 코사인 법칙 또는 더 정확한 타원체 빈센트 리 공식을 사용하여 가치가 있습니다! (구형 모델의 정확도 한계에 대해 아래에 유의하십시오).
출처 : http://www.movable-type.co.uk/scripts/latlong.html

코사인 법칙이 더 바람직한 이유는 무엇입니까?

참고 : 인용 된 텍스트는 작성자아래 언급 한대로 업데이트했습니다 .


10
코사인 법칙은 어떻게 "바람직"합니까? 우리는 컴퓨터와 프로그래머를 위해 두 가지 방법으로 대답 할 수 있습니다. 컴퓨터의 경우, haversine 공식은 더 적은 삼각 함수를 사용하지만 2 개의 제곱근이 필요합니다. 계산 효율성을 위해, 그것은 던지기입니다. 프로그래머의 경우, haversine 공식이 조금 더 깁니다. 그러나 코사인 공식의 법칙은 ACos 구현이 필요하며, 이는 ATan 구현보다 약간 덜 빈번하게 보입니다. 또한 방탄 코드를 작성 하려면 ACos가 실패하지 않는지 확인해야합니다. 이런 이유로 홀데 스틴을 선호해야합니다.
whuber

2
방금 파이썬으로 haversine과 cosine을 구현했습니다. 이 컴퓨터에서 hasrsine은 3.3μs가 걸리고 코사인은 2.2μs가 걸리며, 많은 작업을 수행해야 할 경우 상당히 중요합니다.
gnibbler

1
좋은 관찰과 정보를 주신 모든 분들께 감사드립니다. 질문에 인용 된 텍스트를보다 객관적이고 도움이되도록 업데이트했습니다.
ChrisV

@ChrisV, 업데이트 주셔서 감사합니다! 귀하의 훌륭한 사이트 덕분에 질문에 대한 답변이 아니므로 의견으로 옮겼습니다.
scw

답변:


48

문제는 "잘 조절 된"이라는 단어로 표시됩니다. 수학이 아니라 컴퓨터 산술 문제입니다.

고려해야 할 기본 사실은 다음과 같습니다.

  1. 지구상의 한 라디안은 거의 10 ^ 7 미터에 이릅니다.

  2. 0 근처의 인수 x에 대한 코사인 함수 는 대략 1- x ^ 2 / 2와 같습니다.

  3. 배정 밀도 부동 소수점의 자릿수는 약 15 자리입니다.

점 (2)와 (3) 은 x 가 1 미터 정도이거나 10 ^ -7 라디안 (1 점) 인 경우 거의 모든 정밀도가 손실 됨을 의미합니다 . 1-(10 ^ -7) ^ 2 = 1-10 ^- 14는 15 자리 유효 숫자 중 첫 14 자리가 모두 취소되고 결과를 나타내는 자리 하나만 남겨둔 계산입니다. 이것을 뒤집 으면 (역 코사인, "acos"가하는 것) 미터 길이 거리에 해당하는 각도에 대한 acos 계산은 의미있는 정확도로 수행 될 수 없음을 의미합니다. (나쁜 나쁜 경우 정밀도 손실은 acos가 정의되지 않은 값을 제공하므로 코드가 고장 나고 응답이 없거나 무의미한 대답을하거나 기계를 충돌시킵니다.) 비슷한 고려 사항은 역 코사인을 사용하지 않는 것이 좋습니다 잃어 버릴 정도의 정밀도에 따라 수백 미터 미만의 거리가 관련된 경우.

순진한 코사인 공식에서 acos의 역할은 각도를 거리로 변환하는 것입니다. 그 역할은 haversine 공식에서 atan2에 의해 수행됩니다. 작은 각도 x 의 접선 은 대략 x 자체와 같습니다. 결과적으로, 대략 그 숫자 인 숫자의 역 탄젠트는 기본적으로 정밀도 손실없이 계산됩니다. 이것이 코사인 공식의 법칙과 수학적으로 동일하지만, 소르 세인 공식이 작은 거리 (1 미터 이하) 보다 훨씬 우수한 이유 입니다.

다음은 지구상에서 100 개의 임의의 점 쌍을 사용하는 두 공식의 비교입니다 (Mathematica의 배정 밀도 계산 사용).

대체 텍스트

약 0.5 미터 미만의 거리에서 두 공식이 분기됨을 알 수 있습니다. 0.5 미터 이상에서는 동의하는 경향이 있습니다. 그들이 얼마나 밀접하게 동의하는지 보여주기 위해 다음 그림은 코사인 법칙의 비율을 보여줍니다. 위도 및 경도는 무작위로 최대 5 미터까지 다른 100 개의 임의의 점 쌍에 대한 결과를 표시합니다.

대체 텍스트

이것은 거리가 5-10 미터를 초과하면 코사인 공식의 법칙이 소수점 이하 3-4 자리에 적합 함을 보여줍니다. 소수점 이하 자릿수는 2 차적으로 증가합니다. 따라서 50-100 미터 (1 차)에서 5-6dp 정확도 (2 차)를 얻습니다. 500-1000 미터에서 7-8 dp 등을 얻습니다.


delta latitude > .1 || delta longitude > .1를 들어 코사인 (대형) 또는 하세 인 (소 거리) 중 하나를 동적으로 선택 하는 저렴한 테스트가 있습니까? 최고의 성능과 정밀성을 얻기 위해.
Anony-Mousse

@ Anony-Mousse 세계의 1/4 거리에서 두 공식 모두 1/10의 몇 십분의 1을 차지할 수 있으므로 정밀도에 대해 고민하지 않을 것입니다! 따라서 가까운 지점 (수백 미터)과 직경이 거의 반대 인 지점 (약 2 천만 미터)을 구분할 수있는 테스트는 충분해야합니다.
whuber

atan2비해 수치 적 이점을 제공 합니까 asin? 벤치 마크를 보았는데 , ~ atan2보다 2-3 배 더 느 렸고 asin, 우리도 1 초가 필요합니다 sqrt.
Erich Schubert

@Erich 차이점을 연구하지는 않았지만 asin본질적으로 동일한 acos값이므로 특정 값 (이 경우 1과 -1 근처의 인수)에 대해 동일한 정밀도 손실이 발생합니다. 원칙적으로 atan2그 문제는 없습니다.
whuber

아주 먼 거리에 있을까요? 위의 @ Anony-Mousse 제안과 결합하면 흥미로운 것으로 보입니다.
Erich Schubert

6

역사적 각주 :

haversine은 다음과 같은 계산에서 큰 반올림 오류를 피하는 방법이었습니다.

1 - cos(x)

x가 작을 때. 우리가 가진 haversine의 관점에서

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

x가 작은 경우에도 2 * sin (x / 2) ^ 2를 정확하게 계산할 수 있습니다.

예전에는 헤르 세인 공식은 덧셈 (앤티 로그 조회, 덧셈 및 로그 룩업을 수반 함)을 피할 수 있다는 추가적인 이점이있었습니다. 곱셈만을 수반하는 삼각법 (trigonometic formula)은 "대수 형태"라고한다.

요즘, 헤르 세인 공식의 사용은 약간 비 시각적입니다. 이 각도는 X로 표현되는 것일 수 sin(x)cos(x)(X 및 명시 적으로 공지되지 않을 수). 이 경우, 1 - cos(x)haversine 공식을 통한 계산 에는 아크 탄젠트 (각도 x를 얻기 위해), 절반을 얻기 (을 얻기 위해 x/2), 사인 (을 얻기 위해 sin(x/2)), 정사각형 (을 얻기 위해 sin(x/2)^2) 및 마지막으로 두 배가됩니다. 평가를 사용하는 것이 훨씬 낫습니다.

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

삼각 함수에 대한 평가는 수반되지 않습니다. (오른쪽 만 오른쪽을 사용하고 cos(x) > 0그렇지 않으면 1 - cos(x)직접 사용 하는 것이 좋습니다.)


1

코사인 수식은 한 줄로 구현할 수 있습니다.

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

haversine 공식은 여러 줄을 취합니다.

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

수학적으로는 동일하므로 유일한 차이점은 실용성입니다.


원래 Haversine은 컴퓨터 관련 atan2수식을 사용하지 않지만 위의 4 줄을 단일 수식으로 다시 작성하지 못하게하는 것은 없습니다.
Arjan

당신이 계산해야하기 때문에 @Arjan, 사실은 있지만, 비효율적 두 번합니다. 수식 중 Sqrt (a)와 Sqrt (1-a)를 모두 포함하는 것이 중요합니다.이 중 하나는 매우 작거나 먼 거리에서는 수치 적으로 불안정하지만 다른 것은 그렇지 않기 때문입니다. 이것이 바로이 접근 방식이 작동하는 이유입니다.
whuber

사실, @ whuber,하지만 여전히 나는 줄의 수가 내가 하나를 선택하게 만들지 의심합니다. (그리고 당신이 이미 당신의 대답 에서 설명했듯이 , 하나를 선호 해야하는 더 중요한 이유가 있습니다.)
Arjan

3
@Arjan 동의합니다. 우선 순위는 프로그래밍 작업을위한 코드의 적절성입니다. 그 후 나는 명확성, 즉 가독성, 유지 보수성 및 문맹 문서를 배치 할 것입니다. 이러한 맥락이 없으면 코드 줄 수를 세는 것은 의미가 없습니다.
whuber

1
atan2(sqrt(a), sqrt(1-a))과 동일asin(sqrt(a))
user102008
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.