Nell'aritmetica in virgola mobile, perché l'imprecisione numerica deriva dall'aggiunta di un termine piccolo a una differenza di termini grandi?


13

Ho letto il libro Computer Simulation of Liquids di Allen e Tildesley. A partire da pagina 71, gli autori discutono i vari algoritmi utilizzati per integrare le equazioni del moto di Newton nelle simulazioni di dinamica molecolare (MD). A partire da pagina 78, gli autori discutono dell'algoritmo Verlet, che è forse l'algoritmo di integrazione canonica in MD. Dichiarano:

Forse il metodo più ampiamente usato per integrare le equazioni del moto è quello inizialmente adottato da Verlet (1967) e attribuito a Stormer (Gear 1971). Questo metodo è una soluzione diretta dell'equazione del secondo ordine mir¨i=fi . Il metodo si basa sulle posizioni , sulle accelerazioni e sulle posizioni del passaggio precedente. L'equazione per l'avanzamento delle posizioni è la seguente:a ( t ) r ( t - δ t )r(t)a(t)r(tδt)

(3.14)r(t+δt)=2r(t)r(tδt)+δt2a(t).

Ci sono diversi punti da notare su eqn (3.14). Si vedrà che le velocità non appaiono affatto. Sono stati eliminati aggiungendo le equazioni ottenute dall'espansione di Taylor su :r(t)

r(t+δt)=r(t)+δtv(t)+(1/2)δt2a(t)+...

(3.15)r(tδt)=r(t)δtv(t)+(1/2)δt2a(t)....

Quindi, in seguito (a pagina 80), gli autori dichiarano:

Contro l'algoritmo Verlet, ... la forma dell'algoritmo potrebbe inutilmente introdurre alcune imprecisioni numeriche. Ciò deriva dal fatto che, in eqn (3.14), un piccolo termine ( ) viene aggiunto a una differenza di termini grandi ( ), per generare la traiettoria. O ( δ t 0 )O(δt2)O(δt0)

Immagino che il "piccolo termine" sia , e la "differenza di termini grandi" sia .δt2a(t)2r(t)r(tδt)

La mia domanda è: perché l'imprecisione numerica deriva dall'aggiunta di un termine piccolo a una differenza di termini grandi?

Sono interessato a una ragione piuttosto basilare e concettuale, dal momento che non conosco affatto i dettagli dell'aritmetica in virgola mobile. Inoltre, conosci qualche riferimento di tipo "panoramica" (libri, articoli o siti Web) che mi introdurrebbe a idee di base sull'aritmetica in virgola mobile relative a questa domanda? Grazie per il tuo tempo.

Risposte:


9

La loro osservazione "la forma dell'algoritmo potrebbe inutilmente introdurre qualche imprecisione numerica" ​​è corretta. Ma la loro spiegazione '' Ciò deriva dal fatto che, in eqn (3.14), un piccolo termine ( ) viene aggiunto a una differenza di termini grandi ( ), al fine di generare la traiettoria. '' è falso.O(δt2)O(δt0)

La vera ragione della leggera instabilità numerica dell'algoritmo di Verlet è che è solo marginalmente stabile, perché l'equazione della differenza (essenzialmente il caso in cui si trascura in Verlet) ha una soluzione parassita proporzionale a , che fa sì che gli errori introdotti crescano linearmente in mentre per un metodo multistep completamente stabile applicato a un'equazione differenziale dissipativa, la crescita dell'errore è limitata.xk+1=2xkxk1akk

Edit: Si noti che il libro parla di simulazione numerica di dinamica molecolare, e per ottenere una ragionevole accuratezza delle attese risultanti uno ha bisogno di un enorme numero di passaggi, come la bilancia di precisione con solo . (Spesso il passo temporale è nei picosecondi per seguire la scala di oscillazione intrinseca. Ma le scale temporali biologicamente rilevanti sono nei millisecondi o più grandi ( ), sebbene di solito non si calcoli così lontano.)O ( N - 1 / 2 ) N ~ 10 9NO(N1/2)N109

Per maggiori dettagli, vedi http://en.wikipedia.org/wiki/Linear_multistep_method#Stability_and_convergence


10

Se stai cercando una buona introduzione, suggerirei quello che ogni scienziato informatico dovrebbe sapere sull'aritmetica in virgola mobile . Potrebbe essere un po 'troppo dettagliato, ma è disponibile online gratuitamente.

Se hai una buona biblioteca, suggerirei il calcolo numerico di Michael Overton con l'aritmetica in virgola mobile IEEE , o i primi capitoli della precisione e stabilità degli algoritmi numerici di Nick Higham .

Ciò a cui Allen e Tildesley si riferiscono specificamente è la cancellazione numerica . Il corto di esso è che se si hanno, per esempio, solo tre cifre e si sottrae 100dalla 101, si ottiene 1.00(a tre cifre). Il numero sembra preciso a tre cifre, ma in realtà solo la prima cifra è vera e il trailing .00è immondizia. Perché? Bene, 100e 101sono solo rappresentazioni inesatte di, diciamo 100.12345e 101.4321, ma potresti memorizzarle solo come numeri a tre cifre.


-1: Dov'è la cancellazione che attribuisci alla formula Verlet? Tipicamente è piccolo, il che rende r ( \ t - δ t ) r ( t ) , senza conseguenti cancellazioni. Prova r ( t ) = 1 ! δtr(\tδt)r(t)r(t)=1
Arnold Neumaier,

@ArnoldNeumaier: Sì, l'esempio di Allen e Tildesley non sembra avere molto senso, volevo solo fornire qualche riferimento per i problemi che sorgono quando "un piccolo termine [..] viene aggiunto a una differenza di termini di grandi dimensioni", che è ciò che l'OP ha chiesto, non se si tratta di un problema nel caso dato.
Pedro,

Ma l'aggiunta di un termine piccolo a un termine ampio è solo un errore di arrotondamento, nulla di assolutamente pericoloso. La cancellazione avviene quando vengono sottratti due termini quasi uguali per ottenere un termine minimo. Questo diventa un problema solo quando gli intermedi sottratti sono molto più grandi del risultato finale di un calcolo o quando il piccolo risultato intermedio interessato dalla cancellazione è diviso per un altro piccolo elemento.
Arnold Neumaier,

@ArnoldNeumaier: Poiché, penso, è abbastanza ovvio dalla mia risposta, mi riferivo al problema del calcolo della differenza, non della somma.
Pedro,

1
@ArnoldNeumaier: punto preso, ma spero che tu capisca che lo considero abbastanza meschino per un "-1".
Pedro,

5

Per applicare l'esempio di Pedro all'equazione , supponi che le tue variabili siano memorizzate con i seguenti valori:(3.14)

r ( t - δ t ) = 100 δ t 2 a ( t ) = 1.49

r(t)=101
r(t-δt)=100
δt2un'(t)=1.49

Da dovrebbe seguire questo(3.14)

r(t+δt)=103.49

ma, poiché possiamo usare solo tre cifre, il risultato viene troncato

r(t+δt)=103

Questo errore si propaga, in modo che dopo 20 passaggi, supponendo che rimanga invariata, si ottiene r ( t + 20 δ t ) = 331 anziché 433,90 ,un'(t)r(t+20δt)=331433,90


Ma l'effetto è così grande solo nell'aritmetica decimale a 3 cifre.
Arnold Neumaier,

3

Pedro dà già il fatto importante, vale a dire la cancellazione. Il punto è che ogni numero calcolato con un'accuratezza associata; per esempio, un singolo numero in virgola mobile di precisione può rappresentare solo cose con un'accuratezza di circa 8 cifre. Se hai due numeri che sono quasi esattamente uguali ma differiscono nella settima cifra, la differenza sarà di nuovo un numero in virgola mobile a precisione singola a 8 cifre e sembra che sia preciso a 8 cifre, ma in realtà solo la prima 1 o 2 cifre sono accurate perché le quantità da cui l'hai calcolato non sono accurate oltre queste prime 1 o 2 cifre della differenza.

Ora, il libro che citi è del 1989. All'epoca, i calcoli venivano spesso eseguiti con una sola precisione e arrotondamento e cancellazione erano seri problemi. Oggi, la maggior parte dei calcoli viene eseguita utilizzando la doppia precisione con 16 cifre di precisione, e questo è oggi un problema di gran lunga inferiore rispetto al passato. Penso che valga la pena leggere i paragrafi che citi con un granello di sale e prenderli nel contesto del loro tempo.


la cancellazione nell'aritmetica a doppia precisione può essere un problema tanto grave quanto nella precisione singola. Un esempio è l'eliminazione gaussiana senza rotazione, che spesso dà risultati molto scarsi a causa della cancellazione, anche in doppia precisione.
Arnold Neumaier,

-1: la formula di Verlet mantiene in genere tutte le cifre dell'accuratezza, non solo 1 o 2 di 8 in precisione singola.
Arnold Neumaier,

@ArnoldNeumaier: Certo, puoi avere lo stesso tipo di problemi in doppia precisione. Tutto quello che ho detto è che non si incontrano altrettanto frequentemente.
Wolfgang Bangerth,

Se perdi 6 cifre tre volte in una catena di calcoli, hai perso tutte le cifre anche in doppia precisione. Gli algoritmi che soffrono di cancellazione di solito saranno scarsi anche in doppia precisione. L'algoritmo di Verlet è diverso poiché non vi è alcuna cancellazione ma una leggera crescita lineare di errori. Pertanto la perdita di precisione non può moltiplicarsi, rendendola adatta per tempi di integrazione molto più lunghi. Questo era sicuramente noto ad Allen & Tildesley.
Arnold Neumaier,

Giusto. Ma ciò che intendo è che se si dispone di un algoritmo senza annullamento si incorre ancora in un errore dell'ordine di 1e-8 in singola precisione e se si eseguono passi temporali 1e8, si potrebbe avere un problema anche se tutto il resto è esatto. I passi temporali 1e8 sono un ordine di grandezza che potresti avere per ODE. D'altra parte, in doppia precisione, la tua inesattezza in ogni passaggio è 1e-16 e richiederebbe 1e16 passaggi temporali per ottenere una completa perdita di precisione. Questo è un numero di passaggi che non incontrerai nella pratica.
Wolfgang Bangerth,
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.