<title>Fourier Integrals</title>
<link rel="stylesheet" href="../math.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
-<link rel="home" href="../index.html" title="Math Toolkit 2.10.0">
-<link rel="up" href="../quadrature.html" title="Chapter 12. Quadrature and Differentiation">
+<link rel="home" href="../index.html" title="Math Toolkit 2.11.0">
+<link rel="up" href="../quadrature.html" title="Chapter 13. Quadrature and Differentiation">
<link rel="prev" href="double_exponential/de_refes.html" title="References">
<link rel="next" href="naive_monte_carlo.html" title="Naive Monte Carlo Integration">
</head>
<p>
Ooura's method for Fourier integrals computes
</p>
-<p>
-     ∫<sub>0</sub><sup>∞</sup> f(t)sin(ω t) dt
- </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <span class="serif_italic">∫<sub>0</sub><sup>∞</sup> f(t)sin(ω t) dt</span>
+ </p></blockquote></div>
<p>
and
</p>
-<p>
-     ∫<sub>0</sub><sup>∞</sup> f(t)cos(ω t) dt
- </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <span class="serif_italic">∫<sub>0</sub><sup>∞</sup> f(t)cos(ω t) dt</span>
+ </p></blockquote></div>
<p>
by a double exponentially decaying transformation. These integrals arise when
computing continuous Fourier transform of odd and even functions, respectively.
<span class="keyword">auto</span> <span class="identifier">f</span> <span class="special">=</span> <span class="special">[](</span><span class="keyword">double</span> <span class="identifier">x</span><span class="special">)</span>
<span class="special">{</span> <span class="comment">// Simple reciprocal function for sinc.</span>
- <span class="keyword">return</span> <span class="number">1</span> <span class="special">/</span> <span class="identifier">x</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="number">1</span> <span class="special">/</span> <span class="identifier">x</span><span class="special">;</span>
<span class="special">};</span>
<span class="keyword">double</span> <span class="identifier">omega</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
<span class="keyword">auto</span> <span class="identifier">f</span> <span class="special">=</span> <span class="special">[](</span><span class="keyword">double</span> <span class="identifier">x</span><span class="special">)</span>
<span class="special">{</span> <span class="comment">// More complex example function.</span>
- <span class="keyword">return</span> <span class="number">1</span> <span class="special">/</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">*</span> <span class="identifier">x</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="number">1</span> <span class="special">/</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">*</span> <span class="identifier">x</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span>
<span class="special">};</span>
<span class="keyword">double</span> <span class="identifier">omega</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
<p>
The integrator precomputes nodes and weights, and hence can be reused for many
different frequencies with good efficiency. The integrator is pimpl'd and hence
- can be shared between threads without a memcpy of the nodes and weights.
+ can be shared between threads without a <code class="computeroutput"><span class="identifier">memcpy</span></code>
+ of the nodes and weights.
</p>
<p>
Ooura and Mori's paper identifies criteria for rapid convergence based on the
<span class="keyword">auto</span> <span class="identifier">f</span> <span class="special">=</span> <span class="special">[](</span><span class="identifier">Real</span> <span class="identifier">x</span><span class="special">)</span>
<span class="special">{</span> <span class="comment">// More complex example function.</span>
- <span class="keyword">return</span> <span class="number">1</span> <span class="special">/</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">*</span> <span class="identifier">x</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="number">1</span> <span class="special">/</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">*</span> <span class="identifier">x</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span>
<span class="special">};</span>
<span class="keyword">double</span> <span class="identifier">omega</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
For more examples of other functions and tests, see the full test suite at
<a href="../../../test/ooura_fourier_integral_test.cpp" target="_top">ooura_fourier_integral_test.cpp</a>.
</p>
-<h4>
+<p>
+ Ngyen and Nuyens make use of <a href="../../../../../libs/multiprecision/doc/html/index.html" target="_top">Boost.Multiprecision</a>
+ in their extension to multiple dimensions, showing relative errors reducing
+ to ≅ 10<sup>-2000</sup>!
+ </p>
+<h6>
<a name="math_toolkit.fourier_integrals.h3"></a>
+ <span class="phrase"><a name="math_toolkit.fourier_integrals.rationale"></a></span><a class="link" href="fourier_integrals.html#math_toolkit.fourier_integrals.rationale">Rationale</a>
+ </h6>
+<p>
+ This implementation is base on Ooura's 1999 paper rather than the later 2005
+ paper. It does not preclude a second future implementation based on the later
+ work.
+ </p>
+<p>
+ Some of the features of the Ooura's 2005 paper that were less appealing were:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ The advance of that paper is that one can compute <span class="emphasis"><em>both</em></span>
+ the Fourier sine transform and Fourier cosine transform in a single shot.
+ But there are examples, like sinc integral, where the Fourier sine would
+ converge, but the Fourier cosine would diverge.
+ </li>
+<li class="listitem">
+ It would force users to live in the complex plane, when many potential
+ applications only need real.
+ </li>
+</ul></div>
+<h5>
+<a name="math_toolkit.fourier_integrals.h4"></a>
<span class="phrase"><a name="math_toolkit.fourier_integrals.references"></a></span><a class="link" href="fourier_integrals.html#math_toolkit.fourier_integrals.references">References</a>
- </h4>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
+ </h5>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
Ooura, Takuya, and Masatake Mori, <span class="emphasis"><em>A robust double exponential
formula for Fourier-type integrals.</em></span> Journal of computational
- and applied mathematics 112.1-2 (1999): 229-241.
- </li></ul></div>
+ and applied mathematics, 112.1-2 (1999): 229-241.
+ </li>
+<li class="listitem">
+ Ooura, Takuya, <span class="emphasis"><em>A Double Exponential Formula for the Fourier Transforms.</em></span>
+ Publ. RIMS, Kyoto Univ., 41 (2005), 971-977. <a href="https://pdfs.semanticscholar.org/16ec/a5d76fd6b3d7acaaff0b2a6e8a70caa70190.pdf" target="_top">https://pdfs.semanticscholar.org/16ec/a5d76fd6b3d7acaaff0b2a6e8a70caa70190.pdf</a>
+ </li>
+<li class="listitem">
+ Khatibi, Arezoo and Khatibi, Omid,<span class="emphasis"><em>Criteria for the Application
+ of Double Exponential Transformation.</em></span> (2017) <a href="https://arxiv.org/pdf/1704.05752.pdf" target="_top">1704.05752.pdf</a>.
+ </li>
+<li class="listitem">
+ Nguyen, Dong T.P. and Nuyens, Dirk, <span class="emphasis"><em>Multivariate integration
+ over Reals with exponential rate of convergence.</em></span> (2016) <a href="https://core.ac.uk/download/pdf/80799199.pdf" target="_top">https://core.ac.uk/download/pdf/80799199.pdf</a>.
+ </li>
+</ul></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>