cardinal_quintic_b.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Cardinal Quintic B-spline interpolation</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="../interpolation.html" title="Chapter&#160;12.&#160;Interpolation">
  9. <link rel="prev" href="cardinal_quadratic_b.html" title="Cardinal Quadratic B-spline interpolation">
  10. <link rel="next" href="whittaker_shannon.html" title="Whittaker-Shannon interpolation">
  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="cardinal_quadratic_b.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../interpolation.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="whittaker_shannon.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  27. <a name="math_toolkit.cardinal_quintic_b"></a><a class="link" href="cardinal_quintic_b.html" title="Cardinal Quintic B-spline interpolation">Cardinal Quintic B-spline
  28. interpolation</a>
  29. </h2></div></div></div>
  30. <h4>
  31. <a name="math_toolkit.cardinal_quintic_b.h0"></a>
  32. <span class="phrase"><a name="math_toolkit.cardinal_quintic_b.synopsis"></a></span><a class="link" href="cardinal_quintic_b.html#math_toolkit.cardinal_quintic_b.synopsis">Synopsis</a>
  33. </h4>
  34. <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">interpolators</span><span class="special">/</span><span class="identifier">cardinal_quintic_b_spline</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  35. </pre>
  36. <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> <span class="keyword">namespace</span> <span class="identifier">interpolators</span> <span class="special">{</span>
  37. <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>
  38. <span class="keyword">class</span> <span class="identifier">cardinal_quintic_b_spline</span>
  39. <span class="special">{</span>
  40. <span class="keyword">public</span><span class="special">:</span>
  41. <span class="comment">// If you don't know the value of the derivative at the endpoints, leave them as NaNs and the routine will estimate them.</span>
  42. <span class="comment">// y[0] = y(a), y[n - 1] = y(b), step_size = (b - a)/(n -1).</span>
  43. <span class="identifier">cardinal_quintic_b_spline</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">y</span><span class="special">,</span>
  44. <span class="identifier">size_t</span> <span class="identifier">n</span><span class="special">,</span>
  45. <span class="identifier">Real</span> <span class="identifier">t0</span> <span class="comment">/* initial time, left endpoint */</span><span class="special">,</span>
  46. <span class="identifier">Real</span> <span class="identifier">h</span> <span class="comment">/*spacing, stepsize*/</span><span class="special">,</span>
  47. <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">,</span> <span class="identifier">Real</span><span class="special">&gt;</span> <span class="identifier">left_endpoint_derivatives</span> <span class="special">=</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">quiet_NaN</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limit</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">&gt;::</span><span class="identifier">quiet_NaN</span><span class="special">()},</span>
  48. <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">,</span> <span class="identifier">Real</span><span class="special">&gt;</span> <span class="identifier">right_endpoint_derivatives</span> <span class="special">=</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">quiet_NaN</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limit</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">&gt;::</span><span class="identifier">quiet_NaN</span><span class="special">()})</span>
  49. <span class="identifier">cardinal_quintic_b_spline</span><span class="special">(</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;</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">y</span><span class="special">,</span>
  50. <span class="identifier">Real</span> <span class="identifier">t0</span> <span class="comment">/* initial time, left endpoint */</span><span class="special">,</span>
  51. <span class="identifier">Real</span> <span class="identifier">h</span> <span class="comment">/*spacing, stepsize*/</span><span class="special">,</span>
  52. <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">,</span> <span class="identifier">Real</span><span class="special">&gt;</span> <span class="identifier">left_endpoint_derivatives</span> <span class="special">=</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">quiet_NaN</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limit</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">&gt;::</span><span class="identifier">quiet_NaN</span><span class="special">()},</span>
  53. <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">,</span> <span class="identifier">Real</span><span class="special">&gt;</span> <span class="identifier">right_endpoint_derivatives</span> <span class="special">=</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">quiet_NaN</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limit</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">&gt;::</span><span class="identifier">quiet_NaN</span><span class="special">()})</span>
  54. <span class="identifier">Real</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Real</span> <span class="identifier">t</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  55. <span class="identifier">Real</span> <span class="identifier">prime</span><span class="special">(</span><span class="identifier">Real</span> <span class="identifier">t</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  56. <span class="identifier">Real</span> <span class="identifier">double_prime</span><span class="special">(</span><span class="identifier">Real</span> <span class="identifier">t</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  57. <span class="special">};</span>
  58. <span class="special">}}}</span>
  59. </pre>
  60. <h4>
  61. <a name="math_toolkit.cardinal_quintic_b.h1"></a>
  62. <span class="phrase"><a name="math_toolkit.cardinal_quintic_b.cardinal_quintic_b_spline_interp"></a></span><a class="link" href="cardinal_quintic_b.html#math_toolkit.cardinal_quintic_b.cardinal_quintic_b_spline_interp">Cardinal
  63. Quintic B-Spline Interpolation</a>
  64. </h4>
  65. <p>
  66. The cardinal quintic B-spline interpolator is very nearly the same as the cubic
  67. B-spline interpolator, with the modification that the basis functions are constructed
  68. by convolving a box function with itself five times, rather than three times
  69. as is done with the cubic B-spline.
  70. </p>
  71. <p>
  72. The basis functions of the quintic B-spline interpolator are more smooth than
  73. the cubic <span class="emphasis"><em>B</em></span>-spline interpolator, and hence this is very
  74. useful for computing second derivatives. For example, the second derivative
  75. of the cubic spline interpolator is a piecewise linear function, whereas the
  76. second derivative of the quintic <span class="emphasis"><em>B</em></span>-spline is a cubic spline.
  77. The graph of the second derivative of the quintic <span class="emphasis"><em>B</em></span>-spline
  78. is therefore more visually appealing, though whether it is in fact more accurate
  79. depends on the smoothness of your data.
  80. </p>
  81. <p>
  82. And example usage is as follows:
  83. </p>
  84. <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">interpolators</span><span class="special">/</span><span class="identifier">cardinal_quintic_b_spline</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  85. <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">interpolators</span><span class="special">::</span><span class="identifier">cardinal_quintic_b_spline</span><span class="special">;</span>
  86. <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">v</span><span class="special">(</span><span class="number">512</span><span class="special">);</span>
  87. <span class="comment">// fill v with data . . .</span>
  88. <span class="keyword">double</span> <span class="identifier">t0</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// initial time</span>
  89. <span class="keyword">double</span> <span class="identifier">h</span> <span class="special">=</span> <span class="number">0.125</span><span class="special">;</span> <span class="comment">// spacing</span>
  90. <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">left_endpoint_derivatives</span><span class="special">{</span><span class="identifier">first_derivative_at_t0</span><span class="special">,</span> <span class="identifier">second_derivative_at_t0</span><span class="special">};</span>
  91. <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">right_endpoint_derivatives</span><span class="special">{</span><span class="identifier">first_derivative_at_tf</span><span class="special">,</span> <span class="identifier">second_derivative_at_tf</span><span class="special">};</span>
  92. <span class="keyword">auto</span> <span class="identifier">qs</span> <span class="special">=</span> <span class="identifier">cardinal_quintic_b_spline</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">t0</span><span class="special">,</span> <span class="identifier">h</span><span class="special">,</span> <span class="identifier">left_endpoint_derivatives</span><span class="special">,</span> <span class="identifier">right_endpoint_derivatives</span><span class="special">);</span>
  93. <span class="comment">// Evaluate the interpolant at a point:</span>
  94. <span class="keyword">double</span> <span class="identifier">y</span> <span class="special">=</span> <span class="identifier">qs</span><span class="special">(</span><span class="number">0.1</span><span class="special">);</span>
  95. <span class="comment">// Evaluate the derivative of the interpolant:</span>
  96. <span class="keyword">double</span> <span class="identifier">yp</span> <span class="special">=</span> <span class="identifier">qs</span><span class="special">.</span><span class="identifier">prime</span><span class="special">(</span><span class="number">0.1</span><span class="special">);</span>
  97. <span class="comment">// Evaluate the second derivative of the interpolant:</span>
  98. <span class="keyword">double</span> <span class="identifier">ypp</span> <span class="special">=</span> <span class="identifier">qs</span><span class="special">.</span><span class="identifier">double_prime</span><span class="special">(</span><span class="number">0.1</span><span class="special">);</span>
  99. </pre>
  100. <p>
  101. This routine will estimate the endpoint derivatives if they are not provided.
  102. <span class="emphasis"><em>Try to avoid this if possible.</em></span> The endpoint derivatives
  103. must be evaluated by finite differences and this is not robust again perturbations
  104. in the data. So if you have some way of knowing the endpoint derivatives, make
  105. sure to provide them.
  106. </p>
  107. <h4>
  108. <a name="math_toolkit.cardinal_quintic_b.h2"></a>
  109. <span class="phrase"><a name="math_toolkit.cardinal_quintic_b.references"></a></span><a class="link" href="cardinal_quintic_b.html#math_toolkit.cardinal_quintic_b.references">References</a>
  110. </h4>
  111. <p>
  112. Cox, Maurice G. <span class="emphasis"><em>Numerical methods for the interpolation and approximation
  113. of data by spline functions.</em></span> Diss. City, University of London, 1975.
  114. </p>
  115. </div>
  116. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  117. <td align="left"></td>
  118. <td align="right"><div class="copyright-footer">Copyright &#169; 2006-2019 Nikhar
  119. Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
  120. Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
  121. R&#229;de, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
  122. Daryle Walker and Xiaogang Zhang<p>
  123. Distributed under the Boost Software License, Version 1.0. (See accompanying
  124. 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>)
  125. </p>
  126. </div></td>
  127. </tr></table>
  128. <hr>
  129. <div class="spirit-nav">
  130. <a accesskey="p" href="cardinal_quadratic_b.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../interpolation.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="whittaker_shannon.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
  131. </div>
  132. </body>
  133. </html>