Dear all,
I implemented a simple function to differentiate an array which
seems other people might like to have. It looks like:
def diff(f, x, retval = 'same'):
"""
Differentiate f w.r.t. x and return the diff with same
samples, or different depending on retval.
retval can be:
same: return data for same data points as the indata. This is
done through interpolation at internal points and extrapolation at
endpoint
simple: just return the scaled diff
samesimple: return with same size vector, just shifted. Last
data point is repeated.
new: return at new datapoints and length - 1
"""
df = f[1:] - f[:-1]
dx = x[1:] - x[:-1]
dfodx = df/dx
if retval == 'new':
return dfodx, x[:-1] + dx/2
elif retval == 'same':
cdfodx = np.zeros(len(f))
cdfodx[1:-1] = (dfodx[:-1] + dfodx[1:])/2
cdfodx[0] = dfodx[0]-0.5*(dfodx[1] - dfodx[0])/dx[0]
cdfodx[-1] = dfodx[-1]+0.5*(dfodx[-1] - dfodx[-2])/dx[-1]
return cdfodx, x
elif retval == 'simple':
return dfodx, x[:-1]
elif retval == 'samesimple':
cdfodx = np.zeros(len(f))
cdfodx[:-1] = dfodx
cdfodx[-1] = dfodx[-1]
return cdfodx, x
And generates the following results (top plot original function,
bottom different differentiates) from the code blow:

x = np.linspace(0,2*np.pi,10)
f = np.sin(x)
plt.subplot(211)
plt.plot(x, f, marker="*")
plt.ylabel('$\sin(y)$')
plt.grid(True)
plt.subplot(212)
df,xp = diff(f, x, 'simple')
plt.plot(xp, df, marker="*", label='simple', linewidth=4)
df,xp = diff(f, x, 'new')
plt.plot(xp, df, marker="*", label='new')
df,xp = diff(f, x, 'same')
plt.plot(xp, df, marker="*", label='same')
df,xp = diff(f, x, 'samesimple')
plt.plot(xp, df, marker="*", label='samesimple')
plt.ylabel('$d\sin(x)/dx$')
plt.xlabel('$x$')
plt.grid(True)
plt.legend(loc='lower right')
What do you think about adding it to scipy?
Best,
Robert