[SciPy-Dev] Differentiate function

Robert Rehammar robert.open at rehammar.se
Thu Nov 3 15:37:07 EDT 2016


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scipy-dev/attachments/20161103/4abea4b8/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: blklkpdhkkdlagef.png
Type: image/png
Size: 51705 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/scipy-dev/attachments/20161103/4abea4b8/attachment.png>


More information about the SciPy-Dev mailing list