• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Vector-valued Barycentric Rational 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.12.0">
8<link rel="up" href="../interpolation.html" title="Chapter 12. Interpolation">
9<link rel="prev" href="barycentric.html" title="Barycentric Rational Interpolation">
10<link rel="next" href="catmull_rom.html" title="Catmull-Rom Splines">
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="barycentric.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="catmull_rom.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.vector_barycentric"></a><a class="link" href="vector_barycentric.html" title="Vector-valued Barycentric Rational Interpolation">Vector-valued Barycentric
28    Rational Interpolation</a>
29</h2></div></div></div>
30<h4>
31<a name="math_toolkit.vector_barycentric.h0"></a>
32      <span class="phrase"><a name="math_toolkit.vector_barycentric.synopsis"></a></span><a class="link" href="vector_barycentric.html#math_toolkit.vector_barycentric.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">vector_barycentric_rational</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
35
36<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>
37
38<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">TimeContainer</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">SpaceContainer</span><span class="special">&gt;</span>
39<span class="keyword">class</span> <span class="identifier">vector_barycentric_rational</span>
40<span class="special">{</span>
41<span class="keyword">public</span><span class="special">:</span>
42    <span class="keyword">using</span> <span class="identifier">Real</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">TimeContainer</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">;</span>
43    <span class="keyword">using</span> <span class="identifier">Point</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">SpaceContainer</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">;</span>
44    <span class="identifier">vector_barycentric_rational</span><span class="special">(</span><span class="identifier">TimeContainer</span><span class="special">&amp;&amp;</span> <span class="identifier">times</span><span class="special">,</span> <span class="identifier">SpaceContainer</span><span class="special">&amp;&amp;</span> <span class="identifier">points</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">approximation_order</span> <span class="special">=</span> <span class="number">3</span><span class="special">);</span>
45
46    <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Point</span><span class="special">&amp;</span> <span class="identifier">x</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>
47
48    <span class="identifier">Point</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>
49
50    <span class="keyword">void</span> <span class="identifier">prime</span><span class="special">(</span><span class="identifier">Point</span><span class="special">&amp;</span> <span class="identifier">dxdt</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>
51
52    <span class="identifier">Point</span> <span class="identifier">prime</span><span class="special">(</span><span class="identifier">Real</span> <span class="identifier">t</span><span class="special">);</span>
53
54    <span class="keyword">void</span> <span class="identifier">eval_with_prime</span><span class="special">(</span><span class="identifier">Point</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">Point</span><span class="special">&amp;</span> <span class="identifier">dxdt</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
56    <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">Point</span><span class="special">,</span> <span class="identifier">Point</span><span class="special">&gt;</span> <span class="identifier">eval_with_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
59<span class="special">}}</span>
60</pre>
61<h4>
62<a name="math_toolkit.vector_barycentric.h1"></a>
63      <span class="phrase"><a name="math_toolkit.vector_barycentric.description"></a></span><a class="link" href="vector_barycentric.html#math_toolkit.vector_barycentric.description">Description</a>
64    </h4>
65<p>
66      The <span class="emphasis"><em>n</em></span> dimensional vector-valued barycentric rational interpolator
67      is exactly the same as <span class="emphasis"><em>n</em></span> scalar-valued barycentric rational
68      interpolators. This is provided primarily for convenience and a slight improvement
69      in efficiency over using <span class="emphasis"><em>n</em></span> different rational interpolators
70      and combining their results.
71    </p>
72<p>
73      Use of the class requires a <code class="computeroutput"><span class="identifier">Point</span></code>-type
74      which has size known at compile-time. These requirements are satisfied by (for
75      example) <code class="computeroutput"><span class="identifier">Eigen</span><span class="special">::</span><span class="identifier">Vector2d</span></code>s and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span><span class="identifier">Real</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;</span></code> classes. The call to the constructor computes
76      the weights:
77    </p>
78<pre class="programlisting"><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">vector_barycentric_rational</span><span class="special">;</span>
79<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">t</span><span class="special">(</span><span class="number">100</span><span class="special">);</span>
80<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">Eigen</span><span class="special">::</span><span class="identifier">Vector2d</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">(</span><span class="number">100</span><span class="special">);</span>
81<span class="comment">// initialize t and y . . .</span>
82<span class="identifier">vector_barycentric_rational</span><span class="special">&lt;</span><span class="keyword">decltype</span><span class="special">(</span><span class="identifier">t</span><span class="special">),</span> <span class="keyword">decltype</span><span class="special">(</span><span class="identifier">y</span><span class="special">)&gt;</span> <span class="identifier">interpolant</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">t</span><span class="special">),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">y</span><span class="special">));</span>
83</pre>
84<p>
85      To evaluate the interpolant, use
86    </p>
87<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">t</span> <span class="special">=</span> <span class="number">2.3</span><span class="special">;</span>
88<span class="identifier">Eigen</span><span class="special">::</span><span class="identifier">Vector2d</span> <span class="identifier">y</span> <span class="special">=</span> <span class="identifier">interpolant</span><span class="special">(</span><span class="identifier">t</span><span class="special">);</span>
89</pre>
90<p>
91      If you want to populate a vector passed into the interpolant, rather than get
92      it returned, that syntax is supported:
93    </p>
94<pre class="programlisting"><span class="identifier">Eigen</span><span class="special">::</span><span class="identifier">Vector2d</span> <span class="identifier">y</span><span class="special">;</span>
95<span class="identifier">interpolant</span><span class="special">(</span><span class="identifier">y</span><span class="special">,</span> <span class="identifier">t</span><span class="special">);</span>
96</pre>
97<p>
98      We tested this with <code class="computeroutput"><span class="identifier">Eigen</span><span class="special">::</span><span class="identifier">Vector</span></code>s and found no performance benefit,
99      but other <code class="computeroutput"><span class="identifier">Point</span></code>-types might
100      not be the same.
101    </p>
102<p>
103      To evaluate the derivative of the interpolant use
104    </p>
105<pre class="programlisting"><span class="keyword">auto</span> <span class="special">[</span><span class="identifier">y</span><span class="special">,</span> <span class="identifier">y_prime</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">interpolant</span><span class="special">.</span><span class="identifier">eval_with_prime</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
106</pre>
107<p>
108      Computation of the derivative requires evaluation, so if you can try to use
109      both values at once.
110    </p>
111</div>
112<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
113<td align="left"></td>
114<td align="right"><div class="copyright-footer">Copyright © 2006-2019 Nikhar
115      Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
116      Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
117      Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
118      Daryle Walker and Xiaogang Zhang<p>
119        Distributed under the Boost Software License, Version 1.0. (See accompanying
120        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>)
121      </p>
122</div></td>
123</tr></table>
124<hr>
125<div class="spirit-nav">
126<a accesskey="p" href="barycentric.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="catmull_rom.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
127</div>
128</body>
129</html>
130