<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <atom:link href="http://kitchingroup.cheme.cmu.edu/blog/feed/index.xml" rel="self" type="application/rss+xml" />
    <title>The Kitchin Research Group</title>
    <link>https://kitchingroup.cheme.cmu.edu/blog</link>
    <description>Chemical Engineering at Carnegie Mellon University</description>
    <pubDate>Sat, 01 Nov 2025 13:47:46 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    
    <item>
      <title>Derivatives by FFT</title>
      <link>https://kitchingroup.cheme.cmu.edu/blog/2013/02/26/Derivatives-by-FFT</link>
      <pubDate>Tue, 26 Feb 2013 09:00:00 EST</pubDate>
      <category><![CDATA[differentiation]]></category>
      <guid isPermaLink="false">qMzOD4NwDGs26017t8ZmcvCkIdg=</guid>
      <description>Derivatives by FFT</description>
      <content:encoded><![CDATA[


&lt;p&gt;

&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #8b0000;"&gt;import&lt;/span&gt; numpy &lt;span style="color: #8b0000;"&gt;as&lt;/span&gt; np
&lt;span style="color: #8b0000;"&gt;import&lt;/span&gt; matplotlib.pyplot &lt;span style="color: #8b0000;"&gt;as&lt;/span&gt; plt

N = 101 &lt;span style="color: #ff0000; font-weight: bold;"&gt;#number of points&lt;/span&gt;
L = 2 * np.pi &lt;span style="color: #ff0000; font-weight: bold;"&gt;#interval of data&lt;/span&gt;

x = np.arange(0.0, L, L/&lt;span style="color: #8b0000;"&gt;float&lt;/span&gt;(N)) &lt;span style="color: #ff0000; font-weight: bold;"&gt;#this does not include the endpoint&lt;/span&gt;

&lt;span style="color: #ff0000; font-weight: bold;"&gt;#add some random noise&lt;/span&gt;
y = np.sin(x) + 0.05 * np.random.random(size=x.shape)
dy_analytical = np.cos(x)

&lt;span style="color: #228b22;"&gt;'''&lt;/span&gt;
&lt;span style="color: #228b22;"&gt;http://sci.tech-archive.net/Archive/sci.math/2008-05/msg00401.html&lt;/span&gt;

&lt;span style="color: #228b22;"&gt;you can use fft to calculate derivatives!&lt;/span&gt;
&lt;span style="color: #228b22;"&gt;'''&lt;/span&gt;

&lt;span style="color: #8b0000;"&gt;if&lt;/span&gt; N % 2 == 0:
    k = np.asarray(&lt;span style="color: #8b0000;"&gt;range&lt;/span&gt;(0, N / 2) + [0] + &lt;span style="color: #8b0000;"&gt;range&lt;/span&gt;(-N / 2 + 1,0))
&lt;span style="color: #8b0000;"&gt;else:&lt;/span&gt;
    k = np.asarray(&lt;span style="color: #8b0000;"&gt;range&lt;/span&gt;(0,(N - 1) / 2) + [0] + &lt;span style="color: #8b0000;"&gt;range&lt;/span&gt;(-(N - 1) / 2, 0))

k *= 2 * np.pi / L

fd = np.real(np.fft.ifft(1.0j * k * np.fft.fft(y)))

plt.plot(x, y, label=&lt;span style="color: #228b22;"&gt;'function'&lt;/span&gt;)
plt.plot(x,dy_analytical,label=&lt;span style="color: #228b22;"&gt;'analytical der'&lt;/span&gt;)
plt.plot(x,fd,label=&lt;span style="color: #228b22;"&gt;'fft der'&lt;/span&gt;)
plt.legend(loc=&lt;span style="color: #228b22;"&gt;'lower left'&lt;/span&gt;)

plt.savefig(&lt;span style="color: #228b22;"&gt;'images/fft-der.png'&lt;/span&gt;)
plt.show()
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;img src="/img/./images/fft-der.png"&gt;&lt;p&gt;
&lt;p&gt;Copyright (C) 2013 by John Kitchin. See the &lt;a href="/copying.html"&gt;License&lt;/a&gt; for information about copying.&lt;p&gt;&lt;p&gt;&lt;a href="/org/2013/02/26/Derivatives-by-FFT.org"&gt;org-mode source&lt;/a&gt;&lt;p&gt;]]></content:encoded>
    </item>
  </channel>
</rss>
