Come identificare calcoli in virgola mobile instabili?


15

In campo numerico, è molto importante essere in grado di identificare schemi instabili e migliorarne la stabilità. Come identificare calcoli in virgola mobile instabili?

Sto lavorando a una simulazione molto complessa in cui molti schemi numerici lavorano insieme e sto cercando un metodo per identificare le sue parti deboli. Sto lavorando a un modello fisico che coinvolge equazioni differenziali. Una visione a volo d'uccello del processo complessivo è:

  1. (Fase preliminare) Raccogliere osservazioni fisica P .

  2. Determinare i parametri iniziali della simulazione. Questo utilizza un algoritmo di ottimizzazione, in cui camminiamo nello spazio dei parametri e cerchiamo i parametri C in modo tale che una funzione di errore E (F (C), P) sia minimizzata, dove F è una quantità derivata dei parametri.

  3. Collegare C nel motore di simulazione. Questo è uno schema di Euler dell'EDP, in modo che ad ogni passo, calcoliamo i termini che guidano la dinamica (ognuno di essi è una funzione complessa, potenzialmente soggetta a instabilità) e alimentiamo lo schema di Eulero con questi termini dinamici per calcolare il prossimo stato. Questo continua per migliaia di punti temporali.

  4. Al termine della simulazione, calcoliamo alcune funzioni Proof (S) dello stato finale S e confrontiamo con alcune quantità Require (P) dedotte dalle quantità osservate. Questa non è una prova formale del risultato, più un controllo di plausibilità.

Inoltre, vedo una torre di operazioni complesse (calcolo di termini dinamici, all'interno dello schema di Eulero, all'interno della Prova ). E vorrei riconoscere le "parti difettose" e risolverle.

Ho ipotizzato che l'uso di un'implementazione software di numeri in virgola mobile con precisione ridotta amplificherebbe l'instabilità degli schemi numerici, facilitando così il confronto tra diverse implementazioni. È una tecnica comune per indagare su questa domanda? È possibile utilizzare una macchina virtuale, come Bochs, per raggiungere questo obiettivo senza alterare il programma?

Per affrontare in modo appropriato la questione della stabilità, a volte è accettabile indirizzare l'input tipico della procedura numerica, in modo che possa essere sintonizzato per fare bene su quell'input e forse meno bene su altri input validi, ma improbabili. Dato un campione di input tipici, è possibile curvare alcuni risultati intermedi e preparare un profilo statistico per essi. Ancora una volta, si tratta di una tecnica comune per studiare i problemi di stabilità? Una macchina virtuale è utile per questo?


forse avrai risposte più interessanti su math.stackexchange.com
Simon Bergot,

@Simon Forse hai ragione, ma questa è sicuramente una domanda tra domini. Immagino che le persone in grado di rispondere siano registrate sia in matematica che in programmatori o in nessuna ... Aspettiamo un po 'per vedere se questa domanda trova la sua risposta qui!
user40989

1
Intervallo aritmetico?
SK-logic,


2
Usare Euler per propagare lo stato non è necessariamente malvagio; neanche l'ottimizzazione, ma devi davvero dividere il problema in sottoattività. L'instabilità numerica può essere il minimo dei tuoi guai: la convergenza a un massimo falso e i problemi relativi alla rigidità degli ODE / PDE incombono più di così. E sì, mai e poi mai usare la precisione singola :)
Deer Hunter il

Risposte:


6

Lo studio della stabilità del calcolo in virgola mobile fa parte dell'analisi numerica e se si desidera davvero un risultato sonoro, si desidera che qualcuno esperto in quel dominio esegua l'analisi degli algoritmi utilizzati.

Ci sono alcune cose che possono aiutare a identificare sperimentalmente algoritmi instabili. Esecuzione con arrotondamento impostato su diverse modalità (su / giù / casuale) o con diversa precisione e verificando che il risultato non vari troppo. Rispondere è troppo? non è affatto semplice e anche quando la risposta è no, ciò non significa che l'algoritmo sia stabile, solo che non è stato rilevato instabile sul set di dati che hai usato.

L'aritmetica a intervalli è stata proposta nei commenti. Quando l'ho guardato, anche il più rabbioso sostenitore dell'aritmetica degli intervalli ha ammesso che funzionava bene con gli algoritmi progettati per l'aritmetica degli intervalli ma che passare ad esso senza analizzare l'algoritmo e assicurarsi che non avesse schemi noti per non funzionare bene non sarebbe essere utile (gli avversari sembravano del parere che le precondizioni per l'aritmetica dell'intervallo fossero utili laddove troppo restrittive per essere di interesse pratico)


3

La progettazione di algoritmi a virgola mobile stabile è altamente non banale. Quelli più matematicamente abili di me suggeriscono di usare librerie ben considerate, laddove possibile, piuttosto che tentare di fare il proprio. Il riferimento standard nell'area sembra essere:

NJ Higham. Precisione e stabilità degli algoritmi numerici. Society for Industrial and Applied Mathematics, Filadelfia, Pennsylvania, USA, seconda edizione, 2002. ISBN 0-89871-521-0

Non sapere di più su quali tipi di calcoli, lingue, ecc. Rende difficile dare una risposta molto concreta. C'è una buona lezione qui: http://introcs.cs.princeton.edu/java/91float/ potrebbe essere un po 'di base, ma è una buona introduzione se usi java.


1

Come identificare calcoli in virgola mobile instabili? È una tecnica comune per indagare su questa domanda?

Penso che a meno che non sia necessario mostrare alcune statistiche sugli errori, non è necessario raccogliere campioni. Ciò di cui hai bisogno è l' analisi numerica , che rientra anche nei temi dei metodi numerici, dell'algebra lineare numerica, ecc. E fanno parte dell'informatica, quindi potresti ottenere anche alcune risposte in cs.stackexchange.

Comunque, nella programmazione generale, la maggior parte dei problemi sono facili da individuare, data una comprensione di base su come funziona il virgola mobile e metodi numerici di base. Ma un problema ancora più complesso è "più facile" da risolvere oggi con disponibilità di float a 128 bit, ancora meno motivo per produrre campioni di errore. Ecco alcuni problemi di esempio per mostrare il mio punto:

  1. utilizzando il virgola mobile per il calcolo dei valori monetari.
  2. usando il virgola mobile per grandi numeri.
  3. non fare divisioni prima di altre operazioni quando è possibile farlo. (per rendere il valore più vicino a 0).
  4. lungo calcolo senza trattamento speciale per la propagazione degli errori.

C'è anche un esempio di algoritmo ingenuo e algoritmo compensato per errore qui algoritmo per il calcolo della varianza . Nell'esempio, guardando la versione ingenua, puoi semplicemente sentire che fare calcoli in loop porterà alcuni errori e non verrà compensato.


Grazie per la risposta, cerco comunque informazioni più dettagliate. Ho un calcolo molto ampio e voglio identificarne le parti deboli. Ho modificato la domanda di conseguenza.
user40989

Non sono esattamente sicuro di quale sia la tua situazione quando dici che hai un grande calcolo e vuoi identificare parti deboli. I calcoli numerici presentano intrinsecamente errori, anche una semplice operazione di aggiunta. Quindi, a meno che il tuo calcolo di grandi dimensioni non sia compensato da errori, allora devono essere corretti nel loro insieme. Migliorare i punti deboli potrebbe non essere abbastanza buono. Se ora sei "epsilon" del tuo modello in virgola mobile, una semplice analisi mostrerà quanto può essere grande l'errore mentre si propagano attraverso il calcolo lungo.
imel96,

0

È possibile evitare errori numerici utilizzando tipi di dati appropriati (come, ad esempio, le frazioni continue). Se è necessario o si desidera utilizzare l'aritmetica in virgola mobile, è necessario applicare il know-how numerico per conoscere gli errori.


Non voglio evitare errori numerici, voglio trovare quali parti del calcolo sono instabili. È simile alla localizzazione dei colli di bottiglia della velocità durante l'ottimizzazione della velocità. Quindi voglio ottimizzare la precisione e quindi voglio trovare colli di bottiglia di precisione. (Le frazioni continue non sono utili qui.)
user40989

1
@ user40989, allora hai sicuramente bisogno dell'aritmetica degli intervalli.
SK-logic,
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.