Perché la legge dei coseni è più preferibile dell'haversine quando si calcola la distanza tra due punti di latitudine e longitudine?


41

In effetti, quando Sinnott pubblicò la formula haversine, la precisione computazionale era limitata. Oggigiorno JavaScript (e la maggior parte dei moderni computer e linguaggi) usano numeri IEEE 754 a virgola mobile a 64 bit, che forniscono 15 cifre significative di precisione. Con questa precisione, la semplice legge sferica della formula dei coseni ( cos c = cos a cos b + sin a sin b cos C) fornisce risultati ben condizionati fino a distanze di circa 1 metro. In considerazione di ciò, probabilmente vale la pena, nella maggior parte dei casi, usare la legge più semplice dei coseni o la formula ellittica di Vincenty più accurata rispetto all'haversine! (tenendo presente le note seguenti sui limiti di accuratezza del modello sferico).
Fonte: http://www.movable-type.co.uk/scripts/latlong.html

Qual è il motivo per cui la legge dei coseni è più preferibile?

Nota: il testo citato è stato aggiornato dal suo autore come indicato di seguito .


10
In che modo è preferibile la legge dei coseni? Possiamo rispondere in due modi: al computer e al programmatore. Per il computer, la formula haversine utilizza meno funzioni di trigger ma richiede due radici quadrate. Per l'efficienza computazionale, quindi, è un gioco da ragazzi. Per il programmatore, la formula haversine è un po 'più lunga. Tuttavia, la formula della legge dei coseni richiede di avere un'implementazione ACos, che è vista un po 'meno frequentemente di un'implementazione ATan. Inoltre, per scrivere un codice a prova di proiettile devi controllare che l'ACos non fallisca. Solo per questo motivo dovremmo preferire l'haversine.
whuber

2
Ho appena implementato haversine e coseno in Python. Su questo computer, l'alversina impiega 3,3 μs e il coseno prende 2,2μs, il che è abbastanza significativo se devi farne molti
gnibbler,

1
Grazie a tutti per alcune buone osservazioni e informazioni. Ho aggiornato il testo citato nella domanda per essere, spero, piuttosto più obiettivo e utile.
ChrisV,

@ChrisV, grazie per l'aggiornamento! Ho spostato questo in un commento in quanto non è direttamente una risposta alla domanda, grazie per il tuo fantastico sito.
scw,

Risposte:


49

Il problema è indicato dalla parola "ben condizionata". È una questione di aritmetica informatica, non matematica.

Ecco i fatti di base da considerare:

  1. Un radiante sulla terra si estende per quasi 10 ^ 7 metri.

  2. La funzione coseno per gli argomenti x vicino a 0 è approssimativamente uguale a 1 - x ^ 2/2.

  3. La virgola mobile a precisione doppia ha circa 15 cifre decimali di precisione.

I punti (2) e (3) implicano che quando x è di circa un metro o 10 ^ -7 radianti (punto 1), quasi tutta la precisione viene persa: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 è un calcolo in cui le prime 14 delle 15 cifre significative si annullano tutte, lasciando solo una cifra per rappresentare il risultato. Capovolgendolo (che è ciò che fa il coseno inverso, "acos"), significa che calcolare acos per angoli che corrispondono a distanze di lunghezza del metro non può essere eseguito con una precisione significativa. (In alcuni casi negativi la perdita di precisione fornisce un valore in cui acos non è nemmeno definito, quindi il codice si romperà e non fornirà risposta, una risposta senza senso o arresterà in modo anomalo la macchina.) Considerazioni simili suggeriscono che è necessario evitare l'uso del coseno inverso se sono coinvolte distanze inferiori a poche centinaia di metri, a seconda di quanta precisione sei disposto a perdere.

Il ruolo svolto dall'acos nella formula ingenua della legge dei coseni è quello di convertire un angolo in una distanza. Questo ruolo è interpretato da atan2 nella formula di haversine. La tangente di un angolo piccolo x è approssimativamente uguale a x stessa. Di conseguenza, la tangente inversa di un numero, essendo approssimativamente tale numero, viene calcolata essenzialmente senza perdita di precisione. Questo è il motivo per cui la formula di haversine, sebbene matematicamente equivalente alla formula della legge dei coseni, è di gran lunga superiore per le piccole distanze (nell'ordine di 1 metro o meno).

Ecco un confronto tra le due formule usando 100 coppie di punti casuali sul globo (usando i calcoli della doppia precisione di Mathematica).

testo alternativo

Potete vedere che per distanze inferiori a circa 0,5 metri, le due formule divergono. Al di sopra di 0,5 metri tendono ad essere d'accordo. Per mostrare quanto siano d'accordo, la trama successiva mostra i rapporti della legge dei coseni: risultati di haversine per altre 100 coppie di punti casuali, con le loro latitudini e lunghezze che differiscono casualmente fino a 5 metri.

testo alternativo

Ciò dimostra che la formula della legge dei coseni è buona con 3-4 decimali una volta che la distanza supera i 5-10 metri. Il numero di cifre decimali di precisione aumenta in modo quadratico; quindi a 50-100 metri (un ordine di grandezza) si ottiene una precisione di 5-6 dp (due ordini di grandezza); a 500-1000 metri ottieni 7-8 dp, ecc.


Esiste un test economico, ad esempio delta latitude > .1 || delta longitude > .1per scegliere dinamicamente il coseno (per grandi) o le haversine (per piccole distanze)? Al fine di ottenere le migliori prestazioni e buona precisione.
Anony-Mousse

@ Anony-Mousse Entrambe le formule possono essere disattivate di alcuni decimi dell'uno percento per le distanze di un quarto in tutto il mondo, quindi a quel punto non ci preoccuperemo della precisione! Pertanto, qualsiasi prova in grado di distinguere i punti vicini (poche centinaia di metri) da punti quasi diametralmente opposti (circa 20 milioni di metri) da tutto ciò che sta nel mezzo dovrebbe essere sufficiente.
whuber

Non atan2offrono vantaggi numerici oltre asin? Ho visto parametri di riferimento, che atan2erano 2-3 volte più lenti di asin, e anche noi abbiamo bisogno di un secondo sqrt.
Erich Schubert,

@Erich Non ho studiato la differenza, ma nota che asinè essenzialmente la stessa cosa acose quindi soffre della stessa perdita di precisione per determinati valori - in questo caso, per argomenti vicini a 1 e -1. In linea di principio, atan2non ha questo problema.
whuber

Sarebbe a grandi distanze? Combinarlo con il suggerimento di @ Anony-Mousse sopra sembra interessante allora.
Erich Schubert,

7

Una nota storica:

L'haversine era un modo per evitare grandi errori di arrotondamento in calcoli come

1 - cos(x)

quando x è piccolo. In termini di haversine che abbiamo

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

e 2 * sin (x / 2) ^ 2 possono essere calcolati accuratamente anche quando x è piccolo.

Ai vecchi tempi, la formula di haversine aveva un ulteriore vantaggio di evitare un'aggiunta (che comportava una ricerca antilogica, l'aggiunta e una ricerca log). Una formula trigonometica che comportava solo moltiplicazioni si diceva che fosse in "forma logaritmica".

Al giorno d'oggi, l'uso delle formule haversine è leggermente anacronistico. È possibile che l'angolo x sia espresso in termini sin(x)e cos(x)(e che x non sia esplicitamente noto). In tal caso, il calcolo 1 - cos(x)tramite la formula haversine comporta un arctangent (per ottenere l'angolo x), un dimezzamento (per ottenere x/2), un seno (per ottenere sin(x/2)), un quadrato (per ottenere sin(x/2)^2) e un raddoppio finale. Stai molto meglio usando la valutazione

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

che non comporta alcuna valutazione delle funzioni trigonometriche. (Ovviamente usa il lato destro solo se cos(x) > 0; altrimenti, va bene usare 1 - cos(x)direttamente.)


1

La formula del coseno può essere implementata in una riga:

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

La formula haversine prende più righe:

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

Matematicamente, ci sono identici, quindi l'unica differenza è quella della praticità.


Mentre l'originale Haversine non utilizza la atan2formula relativa al computer , non c'è nulla che impedisca a uno di riscrivere le 4 righe sopra in un'unica formula.
Arjan,

@ Arjan, vero, ma sarebbe inefficiente, perché si avrebbe bisogno di calcolare un due volte. È essenziale che la formula coinvolga sia Sqrt (a) che Sqrt (1-a), perché sebbene uno di questi sarà numericamente instabile per distanze molto piccole o molto grandi, l'altro non lo sarà: questo è ciò che fa funzionare questo approccio.
whuber

È vero, @whuber, ma dubito ancora che il numero di righe mi farebbe mai scegliere l'una sull'altra. (E come hai già spiegato nella tua risposta, ci sono ragioni molto più importanti per favorirne una.)
Arjan

3
@Arjan sono d'accordo. La prima priorità dovrebbe essere l'adeguatezza del codice per l'attività di programmazione. Dopodiché vorrei chiarire: cioè leggibilità, manutenibilità e documentazione alfabetica. In assenza di tale contesto, il conteggio del numero di righe di codice non ha senso.
whuber

1
atan2(sqrt(a), sqrt(1-a))è uguale aasin(sqrt(a))
user102008 il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.