Come evitare la cancellazione catastrofica nella funzione python?


13

Sto riscontrando problemi nell'implementazione numerica di una funzione. Soffre del fatto che a valori di input elevati il ​​risultato è un numero molto grande per un numero molto piccolo. Non sono sicuro che la cancellazione catastrofica sia il termine corretto, quindi correggimi se lo è. Prova di qualcosa che non va:

inserisci qui la descrizione dell'immagine

Come posso evitare le oscillazioni e l'assegnazione di 0,0 per ingressi più grandi di 6?

Ecco la mia funzione:

import numpy as np

def func(x):
    t = np.exp(-np.pi*x)
    return 1/t*(1-np.sqrt(1-t**2))

Risposte:


31

t1+1-t2.
1-1-t21+1-t2

inserisci qui la descrizione dell'immagine


Fantastico! Puoi consigliarmi uno di questi libri dove queste tecniche sono state delineate?
Dipole,

2
@Jack "Precisione e stabilità degli algoritmi numerici" è un buon libro di livello superiore. Qualsiasi libro di testo introduttivo discuterà anche di questo.
Kirill

Mi piacerebbe sapere se hai usato Wolfram Mathematica per disegnare questo grafico. THX :)
xyz

Conosci riferimenti che raccolgono e / o discutono trucchi simili per riscrivere espressioni matematiche in modi matematicamente equivalenti che riducono la perdita di significato? Ho letto il libro di Higham, ma la discussione è generale e tutti i capitoli successivi riguardano l'algebra lineare (che al momento non è il mio argomento).
becko,

@becko È abbastanza ad hoc nella mia esperienza. È molto più facile se hai un modo per testare la tua formula con risposte corrette (anche se le generi semplicemente con un'aritmetica di precisione extra), in modo da non cercare l'instabilità numerica senza prima avere casi di test falliti. E se funziona per tutti gli input noti, non c'è alcun problema reale se l'instabilità numerica è presente ovunque o no.
Kirill,
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.