De hecho, cuando Sinnott publicó la fórmula de Haversine, la precisión computacional fue limitada. Hoy en día, JavaScript (y la mayoría de las computadoras e idiomas modernos) usan números de coma flotante IEEE 754 de 64 bits, que proporcionan 15 cifras significativas de precisión. Con esta precisión, la fórmula simple de la ley esférica del coseno (
cos c = cos a cos b + sin a sin b cos C
) brinda resultados bien condicionados a distancias tan pequeñas como alrededor de 1 metro. En vista de esto, probablemente valga la pena, en la mayoría de las situaciones, usar la ley más simple de cosenos o la fórmula de Vincenty elipsoidal más precisa en lugar de la haversina. (teniendo en cuenta las notas a continuación sobre las limitaciones en la precisión del modelo esférico).
Fuente: http://www.movable-type.co.uk/scripts/latlong.html
¿Cuál es la razón por la cual la ley del coseno es más preferible?
Nota: El texto citado ha sido actualizado por su autor como se menciona a continuación .
fuente
Respuestas:
El problema está indicado por la palabra "bien condicionado". Es una cuestión de aritmética informática, no de matemáticas.
Aquí están los hechos básicos a considerar:
Un radián en la tierra abarca casi 10 ^ 7 metros.
La función coseno para argumentos x cerca de 0 es aproximadamente igual a 1 - x ^ 2/2.
El punto flotante de precisión doble tiene aproximadamente 15 dígitos decimales de precisión.
Los puntos (2) y (3) implican que cuando x es alrededor de un metro, o 10 ^ -7 radianes (punto 1), casi toda la precisión se pierde: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 es un cálculo en el que los primeros 14 de los 15 dígitos significativos se cancelan, dejando solo un dígito para representar el resultado. Darle la vuelta a esto (que es lo que hace el coseno inverso, "acos") significa que calcular acos para ángulos que corresponden a distancias de un metro no se puede hacer con una precisión significativa. (En ciertos casos graves, la pérdida de precisión da un valor donde ni siquiera se define acos, por lo que el código se descompondrá y no dará respuesta, una respuesta sin sentido o bloqueará la máquina). Consideraciones similares sugieren que debe evitar usar el coseno inverso si hay distancias de menos de unos cientos de metros, dependiendo de la precisión que esté dispuesto a perder.
El papel que juega acos en la ingenua fórmula de la ley del coseno es convertir un ángulo en una distancia. Atan2 desempeña ese papel en la fórmula de Haversine. La tangente de un ángulo pequeño x es aproximadamente igual a x misma. En consecuencia, la tangente inversa de un número, que es aproximadamente ese número, se calcula esencialmente sin pérdida de precisión. Es por eso que la fórmula de Haversine, aunque matemáticamente equivalente a la fórmula de la ley del coseno, es muy superior para distancias pequeñas (del orden de 1 metro o menos).
Aquí hay una comparación de las dos fórmulas usando 100 pares de puntos aleatorios en el globo (usando los cálculos de doble precisión de Mathematica).
Puede ver que para distancias de menos de aproximadamente 0.5 metros, las dos fórmulas divergen. Por encima de 0,5 metros tienden a estar de acuerdo. Para mostrar qué tan de acuerdo están, la siguiente gráfica muestra las relaciones de la ley de los cosenos: resultados de haversina para otros 100 pares de puntos aleatorios, con sus latitudes y longitudes que difieren aleatoriamente en hasta 5 metros.
Esto muestra que la fórmula de la ley del coseno es buena para 3-4 decimales una vez que la distancia excede los 5-10 metros. El número de lugares decimales de precisión aumenta cuadráticamente; así, a 50-100 metros (un orden de magnitud) obtienes una precisión de 5-6 dp (dos órdenes de magnitud); a 500-1000 metros obtienes 7-8 dp, etc.
fuente
delta latitude > .1 || delta longitude > .1
para elegir dinámicamente coseno (para grandes) o haversina (para pequeñas distancias)? Con el fin de obtener el mejor rendimiento y una buena precisión.atan2
más beneficios numéricosasin
? Vi puntos de referencia, dondeatan2
era 2-3 veces más lento queasin
, y también necesitamos un segundosqrt
.asin
es esencialmente lo mismoacos
y, por lo tanto, sufre la misma pérdida de precisión para ciertos valores, en este caso, para argumentos cercanos a 1 y -1. En principio,atan2
no tiene ese problema.Una nota al pie histórica:
El haversine era una forma de evitar grandes errores de redondeo en cálculos como
cuando x es pequeño. En cuanto a la haversina tenemos
y 2 * sin (x / 2) ^ 2 se puede calcular con precisión incluso cuando x es pequeño.
En los viejos tiempos, la fórmula de haversina tenía una ventaja adicional de evitar una adición (lo que implicaba una búsqueda antilógina, la adición y una búsqueda de registro). Se decía que una fórmula trigonométrica que implicaba solo multiplicaciones estaba en "forma logarítmica".
Hoy en día, el uso de las fórmulas de haversina es ligeramente anacrónico. Puede ser que el ángulo x se exprese en términos
sin(x)
ycos(x)
(y x no se conozca explícitamente). En ese caso, la computación1 - cos(x)
mediante la fórmula de Haversine implica un arcotangente (para obtener el ángulo x), reducir a la mitad (obtenerx/2
), un seno (obtenersin(x/2)
), un cuadrado (obtenersin(x/2)^2
) y una duplicación final. Estás mucho mejor usando la evaluaciónlo que no implica evaluaciones de funciones trigonométricas. (Obviamente, use el lado derecho solo si
cos(x) > 0
; de lo contrario, está bien usarlo1 - cos(x)
directamente).fuente
La fórmula del coseno se puede implementar en una línea:
La fórmula de Haversine toma múltiples líneas:
Matemáticamente, hay idénticos, por lo que la única diferencia es de practicidad.
fuente
atan2
fórmula relacionada con la computadora , no hay nada que impida reescribir las 4 líneas anteriores en una sola fórmula.atan2(sqrt(a), sqrt(1-a))
es lo mismo queasin(sqrt(a))