En fait, lorsque Sinnott a publié la formule de haversine, la précision des calculs était limitée. De nos jours, JavaScript (et la plupart des ordinateurs et langages modernes) utilise des nombres à virgule flottante IEEE 754 64 bits, qui fournissent 15 chiffres de précision significatifs. Avec cette précision, la loi sphérique simple de la formule des cosinus (
cos c = cos a cos b + sin a sin b cos C
) donne des résultats bien conditionnés jusqu'à des distances aussi petites que 1 mètre environ. Compte tenu de cela, il vaut probablement la peine, dans la plupart des cas, d’utiliser la loi plus simple des cosinus ou la formule ellipsoïdale plus précise de Vincenty, de préférence à la haversine! (en gardant à l’esprit les remarques ci-dessous sur les limites de précision du modèle sphérique).
Source: http://www.movable-type.co.uk/scripts/latlong.html
Quelle est la raison pour laquelle la loi des cosinus est plus préférable?
Remarque: le texte cité a été mis à jour par son auteur comme indiqué ci - dessous .
la source
Réponses:
Le problème est indiqué par le mot "bien conditionné". C'est une question d'arithmétique informatique, pas de mathématiques.
Voici les faits de base à considérer:
Un radian sur la terre couvre près de 10 ^ 7 mètres.
La fonction cosinus pour les arguments x proches de 0 est approximativement égale à 1 - x ^ 2/2.
La virgule flottante double précision a environ 15 chiffres décimaux de précision.
Les points (2) et (3) impliquent que lorsque x mesure environ un mètre ou 10 ^ -7 radians (point 1), la quasi-totalité de la précision est perdue: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 est un calcul dans lequel les 14 premiers des 15 chiffres significatifs sont tous annulés, ne laissant qu'un chiffre pour représenter le résultat. En inversant la situation (ce que fait le cosinus inverse, "acos") signifie que le calcul des acos pour des angles correspondant à des distances d'un mètre ne peut pas être effectué avec une précision significative. (Dans certains mauvais cas, la perte de précision donne une valeur où acos n'est même pas défini, ainsi le code s'effondrera sans donner de réponse, une réponse absurde ou un crash de la machine.) Des considérations similaires suggèrent que vous évitiez l'utilisation du cosinus inverse. si des distances inférieures à quelques centaines de mètres sont impliquées, cela dépend de la précision que vous êtes prêt à perdre.
Le rôle joué par acos dans la formule naïve du droit des cosinus est de convertir un angle en distance. Ce rôle est joué par atan2 dans la formule de haversine. La tangente d'un petit angle x est approximativement égale à x elle-même. Par conséquent, la tangente inverse d'un nombre, qui est approximativement ce nombre, est calculée essentiellement sans perte de précision. C'est pourquoi la formule haversine, bien que mathématiquement équivalente à la formule de la loi des cosinus, est de loin supérieure pour les petites distances (de l'ordre de 1 mètre ou moins).
Voici une comparaison des deux formules utilisant 100 paires de points aléatoires sur le globe (en utilisant les calculs à double précision de Mathematica).
Vous pouvez voir que pour des distances inférieures à environ 0,5 mètre, les deux formules divergent. Au-dessus de 0,5 mètre, ils ont tendance à être d'accord. Pour montrer à quel point ils sont d’accord, le graphique suivant présente les ratios de la loi des cosinus: résultats de la régression rapide pour 100 autres paires de points aléatoires, avec leurs latitudes et longitudes différant de manière aléatoire jusqu’à 5 mètres.
Cela montre que la formule de la loi des cosinus est bonne à 3 ou 4 décimales une fois que la distance dépasse 5 à 10 mètres. Le nombre de décimales de précision augmente de façon quadratique; ainsi, à 50-100 mètres (un ordre de grandeur), vous obtenez une précision de 5 à 6 dp (deux ordres de grandeur); à 500-1000 mètres, vous obtenez 7-8 dp, etc.
la source
delta latitude > .1 || delta longitude > .1
choisir de manière dynamique un cosinus (pour les grandes tailles) ou une formule inverse (pour les petites distances)? Afin d'obtenir les meilleures performances et une bonne précision.atan2
Offre- t-il des avantages numériquesasin
? J'ai vu des repères, oùatan2
était 2-3x plus lent queasin
, et nous avons besoin d'une secondesqrt
aussi.asin
s'agit essentiellement de la même choseacos
et que , par conséquent, de la même perte de précision pour certaines valeurs - dans ce cas, pour les arguments proches de 1 et -1. En principe,atan2
n'a pas ce problème.Une note de bas de page historique:
La haversine était un moyen d’éviter de grosses erreurs d’arrondi dans les calculs tels que
quand x est petit. En termes de haversine nous avons
et 2 * sin (x / 2) ^ 2 peuvent être calculés avec précision même lorsque x est petit.
Auparavant, la formule haversine présentait l'avantage supplémentaire d'éviter une addition (ce qui impliquait une recherche d'antilog, une addition et une recherche de journal). Une formule trigonométique qui ne comportait que des multiplications était dite "sous forme logarithmique".
De nos jours, l'utilisation des formules de haversine est légèrement anachronique. Il se peut que l'angle x soit exprimé en termes
sin(x)
etcos(x)
(et que x ne soit pas explicitement connu). Dans ce cas, le calcul1 - cos(x)
via la formule de haversine implique une arctangente (pour obtenir l'angle x), une réduction de moitié (pour obtenirx/2
), un sinus (pour obtenirsin(x/2)
), un carré (pour obtenirsin(x/2)^2
) et un doublement final. Vous êtes bien mieux en utilisant l'évaluationce qui n'implique aucune évaluation des fonctions trigonométriques. (Évidemment, utilisez le côté droit uniquement si
cos(x) > 0
; sinon, vous pouvez utiliser1 - cos(x)
directement.)la source
La formule cosinus peut être implémentée sur une seule ligne:
La formule haversine prend plusieurs lignes:
Mathématiquement, ils sont identiques, la seule différence est donc pratique.
la source
atan2
formule informatique, rien n’empêche de réécrire les 4 lignes ci-dessus dans une seule formule.atan2(sqrt(a), sqrt(1-a))
est le même queasin(sqrt(a))