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.