Esiste un software in grado di generare automaticamente routine in virgola mobile a precisione numerica da formule simboliche?


25

Data una funzione reale di variabili reali, è disponibile un software in grado di generare automaticamente un codice numericamente accurato per calcolare la funzione su tutti gli ingressi di una macchina dotata di IEEE 754 aritmetica?

Ad esempio, se la funzione reale da valutare fosse:

f (a, b, c) = \ frac {-b - \ sqrt {b ^ 2 - 4ac}} {2a}

Il software prenderebbe in considerazione la cancellazione catastrofica e, eventualmente, la ricerca di tabelle di output per determinati insiemi di input per evitare una perdita di accuratezza computazionale.

In alternativa, esiste un software in grado di generare una pura routine di ricerca basata su tabella per calcolare una determinata funzione con elevata precisione?


5
Problema difficile in generale.
dmckee,

1
Se il problema fosse stato specifico per il calcolo (o fattorizzazione) dei root dei polinomi, ci sono alcune librerie C (o C ++) là fuori.
Moala,

2
Potresti dare un'occhiata all'eccellente serie di articoli di Richard Harris sulla rivista ACCU Overload su The Floating Point Blues . Li ho indicizzati su Programmers.SX per le persone che potrebbero essere interessate.
Mark Booth,

Risposte:


25

La migliore soluzione che io conosca è programmare le espressioni simboliche in Mathematica , Maple o SymPy ; tutti i collegamenti vanno direttamente alla documentazione di generazione del codice. Tutti i programmi sopra possono generare codice in C o Fortran.

Nessuno dei programmi sopra menziona l'accuratezza nell'aritmetica IEEE 754; in generale, sarebbe difficile prevedere tutte le fonti di cancellazione catastrofica, come osserva @dmckee. È difficile sostituire la competenza umana nell'analisi numerica.

Per fornire un esempio concreto, considerare il calcolo delle funzioni trigonometriche ad alta precisione per input arbitrari in . Ci sono molte strategie per farlo, alcune anche dipendenti dall'hardware, come si vede nell'articolo Wikipedia Tabelle trigonometriche . Tutti gli algoritmi richiedono ingegnosità e analisi numerica, persino algoritmi che dipendono da tabelle di ricerca e serie o interpolazioni di Taylor (vedi l'articolo di Wikipedia The Dilemma del produttore di tavoli ). Per maggiori dettagli, vedere la relativa domanda StackTranslate.it Come funzionano le funzioni trigonometriche? .[0,2π]

Il software che ha generato codice o routine per calcolare funzioni arbitrarie con elevata precisione non solo dovrebbe essere a conoscenza di errori di cancellazione, ma anche approssimatori di serie (Taylor, Padé, Chebyshev, razionale, ecc.) Per il calcolo di funzioni che non sono definite in termini di un numero finito di aggiunte, sottrazioni, moltiplicazioni, divisioni e spostamenti di bit. (Vedi Teoria dell'approssimazione .)


4
"È difficile sostituire la competenza umana nell'analisi numerica". - questo da solo merita un +1.
JM,

"È difficile" non è la stessa cosa di "è impossibile". Esistono "teoremi della piena occupazione" per alcuni lavori (ad esempio autori di compilatori). Ce n'è uno per gli analisti numerici?
Pseudonimo l'


14

Se vuoi avere un'idea di quanto siamo lontani da un tale pacchetto software, guarda la nota di lavoro LAPACK del 2001 sul calcolo delle rotazioni di Givens in modo affidabile ed efficiente . Mi aspetterei che la maggior parte dei non specialisti (e molti specialisti!) Nell'analisi numerica rimarranno sorpresi da quanta analisi è andata a risolvere un problema così apparentemente semplice:

Dato , trova c R e s C tale chef,gCcRsC

,

R(c,s)[fg]=[css¯c][fg]=[r0]

dove è unitario. Bilanciare l'affidabilità con l'efficienza computazionale insieme a problemi più sottili come la continuità è altamente non banale e difficilmente sarà automatizzato nel prossimo futuro.R(c,s)


1
+1 Questo è un ottimo esempio, grazie. Immagino che se esistesse una soluzione per i reali, allora potrebbe essere adattata a numeri complessi.
Daniel Trebbien,

Dovrei probabilmente menzionare che la difficoltà fondamentale non sta nel fatto che s può essere complessa, ma nell'evitare traboccamenti e / o underflow non necessari. È legato alla funzione hypot: en.wikipedia.org/wiki/Hypot
Jack Poulson,

11

La generazione del codice e la precompilazione delle espressioni matematiche sta diventando sempre più popolare.

Mentre i pacchetti simbolici come SymPy, Mathematica e Maple possono includere la generazione di codice, non sono sicuro che nessuno di loro pensi troppo alla numerica.

Ci sono un paio di altri progetti che potrebbero interessare sia in termini simbolici che numerici.

Theano è un tale progetto incentrato sulle operazioni di array. Identificano e sostituiscono alcune operazioni note per essere numericamente mal condizionate. Non sono sicuro che questo includa il tuo caso specifico, ma vale la pena esaminarlo.

Spiral potrebbe anche essere interessante per te. Precompilano inoltre un albero di sintassi astratto e cercano anche problemi numerici. Sono più interessati alle operazioni scalari (come il tuo esempio). Tuttavia sono anche abbastanza specializzati in un determinato dominio.

La crescita in questo campo è comunque incoraggiante. Si può essere ottimisti sul fatto che la tua domanda avrà una risposta migliore in pochi anni.


2
Concordato; forse la mia risposta è arrivata come troppo pessimista, poiché ci sono molte soluzioni specifiche per il dominio, ma il problema generale è ... difficile.
Jack Poulson,

4

Non in generale, posso tranquillamente dire che l'implementatore del generatore di codice in SymPy non ha nemmeno provato = P.

Paolo Bientinesi ha sviluppato un metodo per generare prove di stabilità degli algoritmi di algebra lineare, che sono generati usando la notazione FLAME di Robert van de Geijn.

Vedere questo documento , o un , lavorando versione nota più lunga .


1

Sage ti permette di esprimere formule in Cython (una variante di Python che genera codice C); tuttavia, in risposta alla tua domanda più generale: no. Considera il teorema di Rice .

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.