chebyshev.html 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Chebyshev Polynomials</title>
  5. <link rel="stylesheet" href="../../math.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../../index.html" title="Math Toolkit 2.11.0">
  8. <link rel="up" href="../sf_poly.html" title="Polynomials">
  9. <link rel="prev" href="hermite.html" title="Hermite Polynomials">
  10. <link rel="next" href="sph_harm.html" title="Spherical Harmonics">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
  15. <td align="center"><a href="../../../../../../index.html">Home</a></td>
  16. <td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
  17. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  18. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  19. <td align="center"><a href="../../../../../../more/index.htm">More</a></td>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="hermite.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../sf_poly.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="sph_harm.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h3 class="title">
  27. <a name="math_toolkit.sf_poly.chebyshev"></a><a class="link" href="chebyshev.html" title="Chebyshev Polynomials">Chebyshev Polynomials</a>
  28. </h3></div></div></div>
  29. <h5>
  30. <a name="math_toolkit.sf_poly.chebyshev.h0"></a>
  31. <span class="phrase"><a name="math_toolkit.sf_poly.chebyshev.synopsis"></a></span><a class="link" href="chebyshev.html#math_toolkit.sf_poly.chebyshev.synopsis">Synopsis</a>
  32. </h5>
  33. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">special_functions</span><span class="special">/</span><span class="identifier">chebyshev</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  34. </pre>
  35. <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">math</span><span class="special">{</span>
  36. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Real1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Real2</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Real3</span><span class="special">&gt;</span>
  37. <a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">chebyshev_next</span><span class="special">(</span><span class="identifier">Real1</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">Real2</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">Tn</span><span class="special">,</span> <span class="identifier">Real3</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">Tn_1</span><span class="special">);</span>
  38. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Real</span><span class="special">&gt;</span>
  39. <a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">chebyshev_t</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">Real</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">x</span><span class="special">);</span>
  40. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Real</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter&#160;20.&#160;Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
  41. <a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">chebyshev_t</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">Real</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter&#160;20.&#160;Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>
  42. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Real</span><span class="special">&gt;</span>
  43. <a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">chebyshev_u</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">Real</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">x</span><span class="special">);</span>
  44. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Real</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Chapter&#160;20.&#160;Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&gt;</span>
  45. <a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">chebyshev_u</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">Real</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Chapter&#160;20.&#160;Policies: Controlling Precision, Error Handling etc">Policy</a><span class="special">&amp;);</span>
  46. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Real</span><span class="special">&gt;</span>
  47. <a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">chebyshev_t_prime</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">Real</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">x</span><span class="special">);</span>
  48. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Real1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Real2</span><span class="special">&gt;</span>
  49. <a class="link" href="../result_type.html" title="Calculation of the Type of the Result"><span class="emphasis"><em>calculated-result-type</em></span></a> <span class="identifier">chebyshev_clenshaw_recurrence</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Real</span><span class="special">*</span> <span class="keyword">const</span> <span class="identifier">c</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">length</span><span class="special">,</span> <span class="identifier">Real2</span> <span class="identifier">x</span><span class="special">);</span>
  50. <span class="special">}}</span> <span class="comment">// namespaces</span>
  51. </pre>
  52. <p>
  53. <span class="emphasis"><em>"Real analysts cannot do without Fourier, complex analysts
  54. cannot do without Laurent, and numerical analysts cannot do without Chebyshev"</em></span>
  55. --Lloyd N. Trefethen
  56. </p>
  57. <p>
  58. The Chebyshev polynomials of the first kind are defined by the recurrence
  59. <span class="emphasis"><em>T</em></span><sub>n+1</sub>(<span class="emphasis"><em>x</em></span>) := <span class="emphasis"><em>2xT</em></span><sub>n</sub>(<span class="emphasis"><em>x</em></span>)
  60. - <span class="emphasis"><em>T</em></span><sub>n-1</sub>(<span class="emphasis"><em>x</em></span>), <span class="emphasis"><em>n &gt; 0</em></span>,
  61. where <span class="emphasis"><em>T</em></span><sub>0</sub>(<span class="emphasis"><em>x</em></span>) := 1 and <span class="emphasis"><em>T</em></span><sub>1</sub>(<span class="emphasis"><em>x</em></span>)
  62. := <span class="emphasis"><em>x</em></span>. These can be calculated in Boost using the following
  63. simple code
  64. </p>
  65. <pre class="programlisting"><span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">0.5</span><span class="special">;</span>
  66. <span class="keyword">double</span> <span class="identifier">T12</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">chebyshev_t</span><span class="special">(</span><span class="number">12</span><span class="special">,</span> <span class="identifier">x</span><span class="special">);</span>
  67. </pre>
  68. <p>
  69. Calculation of derivatives is also straightforward:
  70. </p>
  71. <pre class="programlisting"><span class="keyword">double</span> <span class="identifier">T12_prime</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">chebyshev_t_prime</span><span class="special">(</span><span class="number">12</span><span class="special">,</span> <span class="identifier">x</span><span class="special">);</span>
  72. </pre>
  73. <p>
  74. The complexity of evaluation of the <span class="emphasis"><em>n</em></span>-th Chebyshev polynomial
  75. by these functions is linear. So they are unsuitable for use in calculation
  76. of (say) a Chebyshev series, as a sum of linear scaling functions scales
  77. quadratically. Though there are very sophisticated algorithms for the evaluation
  78. of Chebyshev series, a linear time algorithm is presented below:
  79. </p>
  80. <pre class="programlisting"><span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">0.5</span><span class="special">;</span>
  81. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">c</span><span class="special">{</span><span class="number">14.2</span><span class="special">,</span> <span class="special">-</span><span class="number">13.7</span><span class="special">,</span> <span class="number">82.3</span><span class="special">,</span> <span class="number">96</span><span class="special">};</span>
  82. <span class="keyword">double</span> <span class="identifier">T0</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
  83. <span class="keyword">double</span> <span class="identifier">T1</span> <span class="special">=</span> <span class="identifier">x</span><span class="special">;</span>
  84. <span class="keyword">double</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">c</span><span class="special">[</span><span class="number">0</span><span class="special">]*</span><span class="identifier">T0</span><span class="special">/</span><span class="number">2</span><span class="special">;</span>
  85. <span class="keyword">unsigned</span> <span class="identifier">l</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
  86. <span class="keyword">while</span><span class="special">(</span><span class="identifier">l</span> <span class="special">&lt;</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">size</span><span class="special">())</span>
  87. <span class="special">{</span>
  88. <span class="identifier">f</span> <span class="special">+=</span> <span class="identifier">c</span><span class="special">[</span><span class="identifier">l</span><span class="special">]*</span><span class="identifier">T1</span><span class="special">;</span>
  89. <span class="identifier">std</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">T0</span><span class="special">,</span> <span class="identifier">T1</span><span class="special">);</span>
  90. <span class="identifier">T1</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">chebyshev_next</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">T0</span><span class="special">,</span> <span class="identifier">T1</span><span class="special">);</span>
  91. <span class="special">++</span><span class="identifier">l</span><span class="special">;</span>
  92. <span class="special">}</span>
  93. </pre>
  94. <p>
  95. This uses the <code class="computeroutput"><span class="identifier">chebyshev_next</span></code>
  96. function to evaluate each term of the Chebyshev series in constant time.
  97. However, this naive algorithm has a catastrophic loss of precision as <span class="emphasis"><em>x</em></span>
  98. approaches 1. A method to mitigate this way given by <a href="http://www.ams.org/journals/mcom/1955-09-051/S0025-5718-1955-0071856-0/S0025-5718-1955-0071856-0.pdf" target="_top">Clenshaw</a>,
  99. and is implemented in boost as
  100. </p>
  101. <pre class="programlisting"><span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">0.5</span><span class="special">;</span>
  102. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">c</span><span class="special">{</span><span class="number">14.2</span><span class="special">,</span> <span class="special">-</span><span class="number">13.7</span><span class="special">,</span> <span class="number">82.3</span><span class="special">,</span> <span class="number">96</span><span class="special">};</span>
  103. <span class="keyword">double</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">chebyshev_clenshaw_recurrence</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">size</span><span class="special">(),</span> <span class="identifier">Real</span> <span class="identifier">x</span><span class="special">);</span>
  104. </pre>
  105. <p>
  106. N.B.: There is factor of <span class="emphasis"><em>2</em></span> difference in our definition
  107. of the first coefficient in the Chebyshev series from Clenshaw's original
  108. work. This is because two traditions exist in notation for the Chebyshev
  109. series expansion,
  110. </p>
  111. <div class="blockquote"><blockquote class="blockquote"><p>
  112. <span class="emphasis"><em>f</em></span>(<span class="emphasis"><em>x</em></span>) &#8776; &#8721;<sub>n=0</sub><sup>N-1</sup> <span class="emphasis"><em>a</em></span><sub>n</sub><span class="emphasis"><em>T</em></span><sub>n</sub>(<span class="emphasis"><em>x</em></span>)
  113. </p></blockquote></div>
  114. <p>
  115. and
  116. </p>
  117. <div class="blockquote"><blockquote class="blockquote"><p>
  118. <span class="emphasis"><em>f</em></span>(<span class="emphasis"><em>x</em></span>) &#8776; <span class="emphasis"><em>c</em></span><sub>0</sub>/2
  119. + &#8721;<sub>n=1</sub><sup>N-1</sup> <span class="emphasis"><em>c</em></span><sub>n</sub><span class="emphasis"><em>T</em></span><sub>n</sub>(<span class="emphasis"><em>x</em></span>)
  120. </p></blockquote></div>
  121. <p>
  122. <span class="emphasis"><em><span class="bold"><strong>boost math always uses the second convention,
  123. with the factor of 1/2 on the first coefficient.</strong></span></em></span>
  124. </p>
  125. <p>
  126. Chebyshev polynomials of the second kind can be evaluated via <code class="computeroutput"><span class="identifier">chebyshev_u</span></code>:
  127. </p>
  128. <pre class="programlisting"><span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="special">-</span><span class="number">0.23</span><span class="special">;</span>
  129. <span class="keyword">double</span> <span class="identifier">U1</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">chebyshev_u</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="identifier">x</span><span class="special">);</span>
  130. </pre>
  131. <p>
  132. The evaluation of Chebyshev polynomials by a three-term recurrence is known
  133. to be <a href="https://link.springer.com/article/10.1007/s11075-014-9925-x" target="_top">mixed
  134. forward-backward stable</a> for <span class="emphasis"><em>x</em></span> &#8714; [-1,
  135. 1]. However, the author does not know of a similar result for <span class="emphasis"><em>x</em></span>
  136. outside [-1, 1]. For this reason, evaluation of Chebyshev polynomials outside
  137. of [-1, 1] is strongly discouraged. That said, small rounding errors in the
  138. course of a computation will often lead to this situation, and termination
  139. of the computation due to these small problems is very discouraging. For
  140. this reason, <code class="computeroutput"><span class="identifier">chebyshev_t</span></code>
  141. and <code class="computeroutput"><span class="identifier">chebyshev_u</span></code> have code
  142. paths for <span class="emphasis"><em>x &gt; 1</em></span> and <span class="emphasis"><em>x &lt; -1</em></span>
  143. which do not use three-term recurrences. These code paths are <span class="emphasis"><em>much
  144. slower</em></span>, and should be avoided if at all possible.
  145. </p>
  146. <p>
  147. Evaluation of a Chebyshev series is relatively simple. The real challenge
  148. is <span class="emphasis"><em>generation</em></span> of the Chebyshev series. For this purpose,
  149. boost provides a <span class="emphasis"><em>Chebyshev transform</em></span>, a projection operator
  150. which projects a function onto a finite-dimensional span of Chebyshev polynomials.
  151. But before we discuss the API, let's analyze why we might want to project
  152. a function onto a span of Chebyshev polynomials.
  153. </p>
  154. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  155. <li class="listitem">
  156. We want a numerically stable way to evaluate the function's derivative.
  157. </li>
  158. <li class="listitem">
  159. Our function is expensive to evaluate, and we wish to find a less expensive
  160. way to estimate its value. An example are the standard library transcendental
  161. functions: These functions are guaranteed to evaluate to within 1 ulp
  162. of the exact value, but often this accuracy is not needed. A projection
  163. onto the Chebyshev polynomials with a low accuracy requirement can vastly
  164. accelerate the computation of these functions.
  165. </li>
  166. <li class="listitem">
  167. We wish to numerically integrate the function.
  168. </li>
  169. </ul></div>
  170. <p>
  171. The API is given below.
  172. </p>
  173. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">special_functions</span><span class="special">/</span><span class="identifier">chebyshev_transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  174. </pre>
  175. <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">math</span><span class="special">{</span>
  176. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Real</span><span class="special">&gt;</span>
  177. <span class="keyword">class</span> <span class="identifier">chebyshev_transform</span>
  178. <span class="special">{</span>
  179. <span class="keyword">public</span><span class="special">:</span>
  180. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span>
  181. <span class="identifier">chebyshev_transform</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">F</span><span class="special">&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Real</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">Real</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">Real</span> <span class="identifier">tol</span><span class="special">=</span><span class="number">500</span><span class="special">*</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">&gt;::</span><span class="identifier">epsilon</span><span class="special">());</span>
  182. <span class="identifier">Real</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Real</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">const</span>
  183. <span class="identifier">Real</span> <span class="identifier">integrate</span><span class="special">()</span> <span class="keyword">const</span>
  184. <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">&gt;&amp;</span> <span class="identifier">coefficients</span><span class="special">()</span> <span class="keyword">const</span>
  185. <span class="identifier">Real</span> <span class="identifier">prime</span><span class="special">(</span><span class="identifier">Real</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">const</span>
  186. <span class="special">};</span>
  187. <span class="special">}}//</span> <span class="identifier">end</span> <span class="identifier">namespaces</span>
  188. </pre>
  189. <p>
  190. The Chebyshev transform takes a function <span class="emphasis"><em>f</em></span> and returns
  191. a <span class="emphasis"><em>near-minimax</em></span> approximation to <span class="emphasis"><em>f</em></span>
  192. in terms of Chebyshev polynomials. By <span class="emphasis"><em>near-minimax</em></span>,
  193. we mean that the resulting Chebyshev polynomial is "very close"
  194. the polynomial <span class="emphasis"><em>p</em></span><sub>n</sub> which minimizes the uniform norm of
  195. <span class="emphasis"><em>f</em></span> - <span class="emphasis"><em>p</em></span><sub>n</sub>. The notion of "very
  196. close" can be made rigorous; see Trefethen's "Approximation Theory
  197. and Approximation Practice" for details.
  198. </p>
  199. <p>
  200. The Chebyshev transform works by creating a vector of values by evaluating
  201. the input function at the Chebyshev points, and then performing a discrete
  202. cosine transform on the resulting vector. In order to do this efficiently,
  203. we have used <a href="http://www.fftw.org/" target="_top">FFTW3</a>. So to compile,
  204. you must have <code class="computeroutput"><span class="identifier">FFTW3</span></code> installed,
  205. and link with <code class="computeroutput"><span class="special">-</span><span class="identifier">lfftw3</span></code>
  206. for double precision, <code class="computeroutput"><span class="special">-</span><span class="identifier">lfftw3f</span></code>
  207. for float precision, <code class="computeroutput"><span class="special">-</span><span class="identifier">lfftw3l</span></code>
  208. for long double precision, and -lfftwq for quad (<code class="computeroutput"><span class="identifier">__float128</span></code>)
  209. precision. After the coefficients of the Chebyshev series are known, the
  210. routine goes back through them and filters out all the coefficients whose
  211. absolute ratio to the largest coefficient are less than the tolerance requested
  212. in the constructor.
  213. </p>
  214. </div>
  215. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  216. <td align="left"></td>
  217. <td align="right"><div class="copyright-footer">Copyright &#169; 2006-2019 Nikhar
  218. Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
  219. Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
  220. R&#229;de, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
  221. Daryle Walker and Xiaogang Zhang<p>
  222. Distributed under the Boost Software License, Version 1.0. (See accompanying
  223. file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
  224. </p>
  225. </div></td>
  226. </tr></table>
  227. <hr>
  228. <div class="spirit-nav">
  229. <a accesskey="p" href="hermite.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../sf_poly.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="sph_harm.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  230. </div>
  231. </body>
  232. </html>