Calcola


13

La funzione ha singolarità vicino a x = 0 . Quella singolarità può essere sollevata, però: per x = 1 , si dovrebbe avere f ( x ) = 1 , poiché e x = k = 0 x kf:x(ex1)/xx=0x=1f(x)=1 e quindi (ex-1)/x=k=1x k - 1

ex=k=0xkk!
Tuttavia, la forma(ex-1)/xnon solo non è definita inx=0, ma è anche numericamente instabile in prossimità di quel punto; per valutaref(x)per molto piccoloxnumericamente, può essere utilizzato uno sviluppo di Taylor, cioè un troncamento della serie di potenze citato.
(ex1)/x=k=1xk1k!
(ex1)/xx=0f(x)x

D : La funzione ha un nome? In altre parole, è un problema comune?f

D : Qualcuno è a conoscenza di una libreria C / C ++ che gestisce bene questa situazione, cioè usa l'espansione di Taylor di un grado appropriato vicino a 0 e l'altra rappresentazione a partire da zero?

Risposte:


19

Forse si potrebbe iniziare con la funzione che fa parte dello standard C99 e calcola e x - 1 con precisione vicino a x = 0 .expm1ex1x=0


17

Questa è un'istanza di errore di annullamento. La libreria standard C (a partire da C99) include una funzione chiamata expm1che evita questo problema. Se si utilizza expm1(x) / xinvece di (exp(x) - 1.0) / x, non si verificherà questo problema (vedere il grafico seguente). <code> fabs (expm1 (x) / x - (exp (x) - 1.0) / x) </code>

I dettagli e la soluzione di questo particolare problema sono discussi a lungo nella Sezione 1.14.1 di Precisione e stabilità degli algoritmi numerici . La stessa soluzione è spiegata anche a pagina 19 del documento di W. Kahan intitolato Quanto sono futili le valutazioni senza cervello di arrotondamento nel calcolo in virgola mobile? . L'implementazione effettiva expm1nella libreria GNU C è diversa dall'approccio descritto nei riferimenti sopra ed è ampiamente documentata nel codice sorgente .


1
Grazie, è proprio quello di cui avevo bisogno! Sfortunatamente, posso accettare solo una risposta ...
anonimo

Ovviamente! Nessun problema :-)
Juan M. Bello-Rivas,

3

Per rispondere alla tua prima domanda, no, la funzione non ha un nome (almeno non uno che è ampiamente noto).

Come altri hanno già detto, il modo migliore per calcolare la funzione è trattare diversi casi speciali. Ecco come qualsiasi libreria calcolerebbe la funzione.

  1. Caso 0: x = 0, ritorno 1.
  2. |x|<δ1+x/2δdouble2e-85e-4
  3. Caso diverso: ritorno expm1(x)/x.

Puoi essere più sofisticato e caso speciale più cose con le serie troncate di Taylor, ma probabilmente non ne vale la pena. In effetti, non è del tutto chiaro che il caso 1 debba essere gestito separatamente, poiché, come sottolineato da k20, la cancellazione è sicura. Tuttavia, gestirlo separatamente mi farebbe sentire più sicuro.


2

Ricordo che questa domanda era stata posta in precedenza su questo sito e, sorprendentemente, la risposta è che devi solo correggere l'uguaglianza di casi speciali a zero. Gli errori si annullano vicino allo zero. Non ho il link.

Sì, questa risposta era completamente sbagliata. Non sono sicuro del motivo per cui è stato votato così tanto, probabilmente perché è stato dichiarato in modo autorevole. Ho trovato il link che avevo in mente. Qui si trovava nello scambio di matematica , non nello scambio di scicomp. La expm1formula di annullamento dell'errore -free viene fornita nella risposta da JM e utilizza una u = exp(x)trasformazione.


xdx(edx1)/dx(1+dx1)/dx1

1
dx1+dx=1

0

Per rispondere alla prima domanda e fornire un metodo (probabilmente numericamente inefficiente) per la seconda, nota che questa è l'inverso della funzione generatrice dei numeri di Bernoulli .


Questa è una connessione interessante, grazie per averlo sottolineato. Sfortunatamente, credo che la tripla somma lo renderà proibitivamente costoso. Inoltre, non è immediatamente chiaro dove troncare ogni somma per ottenere l'accuratezza desiderata.
anonimo il

@anonymous: Quale somma tripla intendi? Non hai bisogno dei polinomi di Bernoulli, solo dei numeri di Bernoulli e puoi elencarli in anticipo. Ma sì, non è ancora meglio della serie Taylor.
Nikolaj-K,

Puoi calcolarli in anticipo se è chiaro che hai bisogno solo di un numero finito fisso per qualsiasi input, però.
anonimo il

@anonymous: Beh sì, proprio come avresti elencato in anticipo i coefficienti di Taylor.
Nikolaj-K,
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.