propongo un esericizio/tematica che viene data spesso per "random", ma che in realtà non lo è. Considerata l'approssimazione con differenze finite della derivata prima di una funzione $f$ nel punto $x$, si ha
$$\frac{f(x+h)-f(x-h)}{2h} = f'(x) + \frac{f^{(3)}(x)}{6} h^2 + \mathcal{O}(h^4)$$
dove $h$ è l'ampiezza del passo spaziale della discretizzazione. E' evidente che questa approssimazione è del secondo ordine, tuttavia, plottando in un grafico logaritmico il valore di $h$ contro l'approssimazione della derivata prima di $\cos(x)$ a $x=1$, si vede che per valori molto piccoli di $h$ le cose vanno male (il codice Python usato per produrre il grafico è in spoiler)
Testo nascosto, fai click qui per vederlo
- Codice:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return np.cos(x)
def df(x):
return -np.sin(x)
def FD(f,xbar,h):
return (f(xbar+h) - f(xbar-h))/(2.0*h)
hrange = np.zeros([15])
N = np.size(hrange)
h = 1
for i in range(N):
hrange[i]= h/(10.0)**i
print(hrange)
err = []
xbar = 1.0
for k in range(N):
err.append(np.abs( FD(f,xbar, hrange[k]) - df(xbar)) )
plt.figure(figsize=(10,5))
plt.title('Errore |FD(cos(x),1,h) - (-sin(1))| come funzione di $h$')
plt.loglog(hrange,err,'b-o',markerfacecolor='Orange',linewidth='2')
plt.xlabel('h')
plt.ylabel('error')
Come si vede, da $h<10^{-5}$ in poi si ha che l'accuratezza mano a mano viene persa : si dice, anche nei libri, che ciò è dovuto agli errori di arrotondamento, senza dilungarsi troppo.
La domanda dunque è la seguente: è possibile, invece, dimostrare che $h \approx 10^{-5}$ è il valore dal quale in poi si perde accuratezza, assumendo di lavorare in precisione doppia (cioè con $\mu =2^{-53} \approx 10^{-16}$ unità di roundoff)?
Si può assumere che l'approssimazione di $f(x)$ in aritmetica di macchina soddisfi $$\text{fl}(f(x)) = f(x)(1+\delta) \text{ con }|\delta| \leq \mu$$