<?xml version="1.0" encoding="UTF-8" standalone="yes"?><oembed><version><![CDATA[1.0]]></version><provider_name><![CDATA[The ryg blog]]></provider_name><provider_url><![CDATA[https://fgiesen.wordpress.com]]></provider_url><author_name><![CDATA[fgiesen]]></author_name><author_url><![CDATA[https://fgiesen.wordpress.com/author/fgiesen/]]></author_url><title><![CDATA[Polynomials from repeated linear&nbsp;interpolation]]></title><type><![CDATA[link]]></type><html><![CDATA[<p>It&#8217;s fairly well-known that Bezier curves can be evaluated using repeated linear interpolation &#8211; de Casteljau&#8217;s algorithm. It&#8217;s also fairly well-known that a generalization of this algorithm can be used to evaluate B-Splines: de Boor&#8217;s algorithm. What&#8217;s not as well known is that it&#8217;s easy to construct interpolating polynomials using a very similar approach, leading to an algorithm that is, in a sense, halfway between the two.</p>
<p>In the following, I&#8217;ll write <img src="https://s0.wp.com/latex.php?latex=l%28%5Calpha%2Cx%2Cy%29+%3A%3D+%281+-+%5Calpha%29x+%2B+%5Calpha+y&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=l%28%5Calpha%2Cx%2Cy%29+%3A%3D+%281+-+%5Calpha%29x+%2B+%5Calpha+y&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=l%28%5Calpha%2Cx%2Cy%29+%3A%3D+%281+-+%5Calpha%29x+%2B+%5Calpha+y&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="l(&#92;alpha,x,y) := (1 - &#92;alpha)x + &#92;alpha y" class="latex" /> for linear interpolation. I&#8217;ll stick with quadratic curves since they are the lowest-order curves to show &#8220;interesting&#8221; behavior for the purposes of this article; everything generalizes to higher degrees in the obvious way.</p>
<h3>De Casteljau&#8217;s algorithm</h3>
<p>De Casteljau&#8217;s algorithm is a well-known algorithm to evaluate Bezier Curves. There&#8217;s plenty of material on this elsewhere, so as usual, I&#8217;ll keep it brief. Assume we have three control points <img src="https://s0.wp.com/latex.php?latex=x_0%2C+x_1%2C+x_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=x_0%2C+x_1%2C+x_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=x_0%2C+x_1%2C+x_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="x_0, x_1, x_2" class="latex" />. In the first stage, we construct three constant (degree-0) polynomials for the three control points:</p>
<p><img src="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B0%5D%7D%28t%29+%3D+x_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B0%5D%7D%28t%29+%3D+x_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B0%5D%7D%28t%29+%3D+x_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_0^{[0]}(t) = x_0" class="latex" /><br />
<img src="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B0%5D%7D%28t%29+%3D+x_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B0%5D%7D%28t%29+%3D+x_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B0%5D%7D%28t%29+%3D+x_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_1^{[0]}(t) = x_1" class="latex" /><br />
<img src="https://s0.wp.com/latex.php?latex=p_2%5E%7B%5B0%5D%7D%28t%29+%3D+x_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_2%5E%7B%5B0%5D%7D%28t%29+%3D+x_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_2%5E%7B%5B0%5D%7D%28t%29+%3D+x_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_2^{[0]}(t) = x_2" class="latex" /></p>
<p>These are then linearly interpolated to yield two linear (degree-1) polynomials:</p>
<p><img src="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B1%5D%7D%28t%29+%3D+l%28t%2C+p_0%5E%7B%5B0%5D%7D%28t%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B1%5D%7D%28t%29+%3D+l%28t%2C+p_0%5E%7B%5B0%5D%7D%28t%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B1%5D%7D%28t%29+%3D+l%28t%2C+p_0%5E%7B%5B0%5D%7D%28t%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_0^{[1]}(t) = l(t, p_0^{[0]}(t), p_1^{[0]}(t))" class="latex" /><br />
<img src="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B1%5D%7D%28t%29+%3D+l%28t%2C+p_1%5E%7B%5B0%5D%7D%28t%29%2C+p_2%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B1%5D%7D%28t%29+%3D+l%28t%2C+p_1%5E%7B%5B0%5D%7D%28t%29%2C+p_2%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B1%5D%7D%28t%29+%3D+l%28t%2C+p_1%5E%7B%5B0%5D%7D%28t%29%2C+p_2%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_1^{[1]}(t) = l(t, p_1^{[0]}(t), p_2^{[0]}(t))" class="latex" /></p>
<p>which we then interpolate linearly again to give the final result</p>
<p><img src="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B2%5D%7D%28t%29+%3D+l%28t%2C+p_0%5E%7B%5B1%5D%7D%28t%29%2C+p_1%5E%7B%5B1%5D%7D%28t%29%29+%3D+B%28t%29.&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B2%5D%7D%28t%29+%3D+l%28t%2C+p_0%5E%7B%5B1%5D%7D%28t%29%2C+p_1%5E%7B%5B1%5D%7D%28t%29%29+%3D+B%28t%29.&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B2%5D%7D%28t%29+%3D+l%28t%2C+p_0%5E%7B%5B1%5D%7D%28t%29%2C+p_1%5E%7B%5B1%5D%7D%28t%29%29+%3D+B%28t%29.&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_0^{[2]}(t) = l(t, p_0^{[1]}(t), p_1^{[1]}(t)) = B(t)." class="latex" /></p>
<p>Note I give the construction of the full polynomials here; the actual de Casteljau algorithm gets rid of them immediately by evaluating all of them as soon as they appear (only ever doing linear interpolations). Anyway, the general construction rule we&#8217;ve been following is this:</p>
<p><img src="https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28t%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28t%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28t%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_i^{[d]}(t) = l(t, p_i^{[d-1]}(t), p_{i+1}^{[d-1]}(t))" class="latex" /></p>
<h3>De Boor&#8217;s algorithm</h3>
<p>De Boor&#8217;s algorithm is the equivalent to de Casteljau&#8217;s algorithm for B-Splines. Again, there&#8217;s plenty of material out there on it, so I&#8217;ll keep it brief: We again start with constant functions for our data points. This time, the exact formulas depend on the degree of the spline we&#8217;ll be using. I&#8217;ll be using the degree <img src="https://s0.wp.com/latex.php?latex=k%3D2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=k%3D2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=k%3D2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="k=2" class="latex" /> (quadratic) here. We&#8217;ll also need a <em>knot vector</em> <img src="https://s0.wp.com/latex.php?latex=%28t_i%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=%28t_i%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=%28t_i%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="(t_i)" class="latex" /> which determines where our knots are; knots are (very roughly) the t&#8217;s corresponding to the control points. I&#8217;ll be using slightly different indexing from what&#8217;s normally used to make the similarities more visible, and ignore issues such as picking the right set of control points to interpolate from:</p>
<p><img src="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B0%5D%7D%28t%29+%3D+x_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B0%5D%7D%28t%29+%3D+x_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B0%5D%7D%28t%29+%3D+x_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_0^{[0]}(t) = x_0" class="latex" /><br />
<img src="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B0%5D%7D%28t%29+%3D+x_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B0%5D%7D%28t%29+%3D+x_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B0%5D%7D%28t%29+%3D+x_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_1^{[0]}(t) = x_1" class="latex" /><br />
<img src="https://s0.wp.com/latex.php?latex=p_2%5E%7B%5B0%5D%7D%28t%29+%3D+x_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_2%5E%7B%5B0%5D%7D%28t%29+%3D+x_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_2%5E%7B%5B0%5D%7D%28t%29+%3D+x_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_2^{[0]}(t) = x_2" class="latex" /></p>
<p>Then we linearly interpolate based on the knot vector:</p>
<p><img src="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B1%5D%7D%28t%29+%3D+l%28%28t+-+t_0%29+%2F+%28t_2+-+t_0%29%2C+p_0%5E%7B%5B0%5D%7D%28t%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B1%5D%7D%28t%29+%3D+l%28%28t+-+t_0%29+%2F+%28t_2+-+t_0%29%2C+p_0%5E%7B%5B0%5D%7D%28t%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B1%5D%7D%28t%29+%3D+l%28%28t+-+t_0%29+%2F+%28t_2+-+t_0%29%2C+p_0%5E%7B%5B0%5D%7D%28t%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_0^{[1]}(t) = l((t - t_0) / (t_2 - t_0), p_0^{[0]}(t), p_1^{[0]}(t))" class="latex" /><br />
<img src="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B1%5D%7D%28t%29+%3D+l%28%28t+-+t_1%29+%2F+%28t_3+-+t_1%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%2C+p_2%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B1%5D%7D%28t%29+%3D+l%28%28t+-+t_1%29+%2F+%28t_3+-+t_1%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%2C+p_2%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B1%5D%7D%28t%29+%3D+l%28%28t+-+t_1%29+%2F+%28t_3+-+t_1%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%2C+p_2%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_1^{[1]}(t) = l((t - t_1) / (t_3 - t_1), p_1^{[0]}(t), p_2^{[0]}(t))" class="latex" /></p>
<p>and interpolate again one more time to get the results:</p>
<p><img src="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B2%5D%7D%28t%29+%3D+l%28%28t+-+t_1%29+%2F+%28t_2+-+t_1%29%2C+p_0%5E%7B%5B1%5D%7D%28t%29%2C+p_1%5E%7B%5B1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B2%5D%7D%28t%29+%3D+l%28%28t+-+t_1%29+%2F+%28t_2+-+t_1%29%2C+p_0%5E%7B%5B1%5D%7D%28t%29%2C+p_1%5E%7B%5B1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B2%5D%7D%28t%29+%3D+l%28%28t+-+t_1%29+%2F+%28t_2+-+t_1%29%2C+p_0%5E%7B%5B1%5D%7D%28t%29%2C+p_1%5E%7B%5B1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_0^{[2]}(t) = l((t - t_1) / (t_2 - t_1), p_0^{[1]}(t), p_1^{[1]}(t))" class="latex" /></p>
<p>The general recursion formula for de Boor&#8217;s algorithm (with this indexing convention, which is non-standard, so do <b>not</b> use this for reference!) is this:</p>
<p><img src="https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28%28t+-+t_%7Bi%2Bd-1%7D%29+%2F+%28t_%7Bi%2Bk%7D+-+t_%7Bi%2Bd-1%7D%29%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28%28t+-+t_%7Bi%2Bd-1%7D%29+%2F+%28t_%7Bi%2Bk%7D+-+t_%7Bi%2Bd-1%7D%29%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28%28t+-+t_%7Bi%2Bd-1%7D%29+%2F+%28t_%7Bi%2Bk%7D+-+t_%7Bi%2Bd-1%7D%29%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_i^{[d]}(t) = l((t - t_{i+d-1}) / (t_{i+k} - t_{i+d-1}), p_i^{[d-1]}(t), p_{i+1}^{[d-1]}(t))" class="latex" /></p>
<h3>Interpolating polynomials from linear interpolation</h3>
<p>There&#8217;s multiple constructions for interpolating polynomials; the best-known are probably the <a href="http://en.wikipedia.org/wiki/Lagrange_polynomial">Lagrange polynomials</a> (which form a basis for the interpolating polynomials of degree n for a given set of <em>nodes</em> <img src="https://s0.wp.com/latex.php?latex=t_i&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=t_i&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=t_i&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="t_i" class="latex" />) and the <a href="http://en.wikipedia.org/wiki/Newton_polynomials">Newton polynomials</a> (since polynomial interpolation has unique solutions, these give the same results, but the Newton formulation is more suitable for incremental evaluation).</p>
<p>What&#8217;s less well known is that interpolating polynomials also obey a simple triangular scheme based on repeated linear interpolation: Again, we start the same way with constant polynomials</p>
<p><img src="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B0%5D%7D%28t%29+%3D+x_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B0%5D%7D%28t%29+%3D+x_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B0%5D%7D%28t%29+%3D+x_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_0^{[0]}(t) = x_0" class="latex" /><br />
<img src="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B0%5D%7D%28t%29+%3D+x_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B0%5D%7D%28t%29+%3D+x_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B0%5D%7D%28t%29+%3D+x_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_1^{[0]}(t) = x_1" class="latex" /><br />
<img src="https://s0.wp.com/latex.php?latex=p_2%5E%7B%5B0%5D%7D%28t%29+%3D+x_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_2%5E%7B%5B0%5D%7D%28t%29+%3D+x_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_2%5E%7B%5B0%5D%7D%28t%29+%3D+x_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_2^{[0]}(t) = x_2" class="latex" /></p>
<p>and this time we have associated nodes <img src="https://s0.wp.com/latex.php?latex=t_0%2C+t_1%2C+t_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=t_0%2C+t_1%2C+t_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=t_0%2C+t_1%2C+t_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="t_0, t_1, t_2" class="latex" /> and want to find the interpolating polynomial <img src="https://s0.wp.com/latex.php?latex=I%28t%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=I%28t%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=I%28t%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="I(t)" class="latex" /> such that <img src="https://s0.wp.com/latex.php?latex=I%28t_0%29%3Dx_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=I%28t_0%29%3Dx_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=I%28t_0%29%3Dx_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="I(t_0)=x_0" class="latex" />, <img src="https://s0.wp.com/latex.php?latex=I%28t_1%29%3Dx_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=I%28t_1%29%3Dx_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=I%28t_1%29%3Dx_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="I(t_1)=x_1" class="latex" />, <img src="https://s0.wp.com/latex.php?latex=I%28t_2%29%3Dx_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=I%28t_2%29%3Dx_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=I%28t_2%29%3Dx_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="I(t_2)=x_2" class="latex" />. Same as before, we first try to find linear functions that solve part of the problem. A reasonable choice is:</p>
<p><img src="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B1%5D%7D%28t%29+%3D+l%28%28t+-+t_0%29+%2F+%28t_1+-+t_0%29%2C+p_0%5E%7B%5B0%5D%7D%28t%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B1%5D%7D%28t%29+%3D+l%28%28t+-+t_0%29+%2F+%28t_1+-+t_0%29%2C+p_0%5E%7B%5B0%5D%7D%28t%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B1%5D%7D%28t%29+%3D+l%28%28t+-+t_0%29+%2F+%28t_1+-+t_0%29%2C+p_0%5E%7B%5B0%5D%7D%28t%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_0^{[1]}(t) = l((t - t_0) / (t_1 - t_0), p_0^{[0]}(t), p_1^{[0]}(t))" class="latex" /><br />
<img src="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B1%5D%7D%28t%29+%3D+l%28%28t+-+t_1%29+%2F+%28t_2+-+t_1%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%2C+p_2%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B1%5D%7D%28t%29+%3D+l%28%28t+-+t_1%29+%2F+%28t_2+-+t_1%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%2C+p_2%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B1%5D%7D%28t%29+%3D+l%28%28t+-+t_1%29+%2F+%28t_2+-+t_1%29%2C+p_1%5E%7B%5B0%5D%7D%28t%29%2C+p_2%5E%7B%5B0%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_1^{[1]}(t) = l((t - t_1) / (t_2 - t_1), p_1^{[0]}(t), p_2^{[0]}(t))" class="latex" /></p>
<p>Note the construction here. <img src="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B1%5D%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B1%5D%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B1%5D%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_0^{[1]}" class="latex" /> is a linear polynomial that interpolates the data points <img src="https://s0.wp.com/latex.php?latex=%28t_0%2Cx_0%29%2C+%28t_1%2Cx_1%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=%28t_0%2Cx_0%29%2C+%28t_1%2Cx_1%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=%28t_0%2Cx_0%29%2C+%28t_1%2Cx_1%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="(t_0,x_0), (t_1,x_1)" class="latex" />, and we get it by interpolating between two simpler (degree-0) polynomials that interpolate only <img src="https://s0.wp.com/latex.php?latex=%28t_0%2Cx_0%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=%28t_0%2Cx_0%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=%28t_0%2Cx_0%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="(t_0,x_0)" class="latex" /> and <img src="https://s0.wp.com/latex.php?latex=%28t_1%2Cx_1%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=%28t_1%2Cx_1%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=%28t_1%2Cx_1%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="(t_1,x_1)" class="latex" />, respectively: we simply make sure that at <img src="https://s0.wp.com/latex.php?latex=t%3Dt_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=t%3Dt_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=t%3Dt_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="t=t_0" class="latex" />, we use <img src="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B0%5D%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B0%5D%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B0%5D%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_0^{[0]}" class="latex" />, and at <img src="https://s0.wp.com/latex.php?latex=t%3Dt_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=t%3Dt_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=t%3Dt_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="t=t_1" class="latex" />, we use <img src="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B0%5D%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B0%5D%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B0%5D%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_1^{[0]}" class="latex" />. All of this is easiest to visualize when <img src="https://s0.wp.com/latex.php?latex=t_0+%5Cle+t_1+%5Cle+t_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=t_0+%5Cle+t_1+%5Cle+t_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=t_0+%5Cle+t_1+%5Cle+t_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="t_0 &#92;le t_1 &#92;le t_2" class="latex" />, but it in facts works with them in any order. <img src="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B1%5D%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B1%5D%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_1%5E%7B%5B1%5D%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_1^{[1]}" class="latex" /> is constructed the same way.</p>
<p>To construct our final interpolating polynomial, we use the same trick again:</p>
<p><img src="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B2%5D%7D%28t%29+%3D+l%28%28t+-+t_0%29+%2F+%28t_2+-+t_0%29%2C+p_0%5E%7B%5B1%5D%7D%28t%29%2C+p_1%5E%7B%5B1%5D%7D%28t%29%29+%3D+I%28t%29.&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B2%5D%7D%28t%29+%3D+l%28%28t+-+t_0%29+%2F+%28t_2+-+t_0%29%2C+p_0%5E%7B%5B1%5D%7D%28t%29%2C+p_1%5E%7B%5B1%5D%7D%28t%29%29+%3D+I%28t%29.&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_0%5E%7B%5B2%5D%7D%28t%29+%3D+l%28%28t+-+t_0%29+%2F+%28t_2+-+t_0%29%2C+p_0%5E%7B%5B1%5D%7D%28t%29%2C+p_1%5E%7B%5B1%5D%7D%28t%29%29+%3D+I%28t%29.&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_0^{[2]}(t) = l((t - t_0) / (t_2 - t_0), p_0^{[1]}(t), p_1^{[1]}(t)) = I(t)." class="latex" /></p>
<p>Note this one is a bit subtle. We linearly interpolate between two polynomials that both in turn interpolate <img src="https://s0.wp.com/latex.php?latex=%28t_1%2Cx_1%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=%28t_1%2Cx_1%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=%28t_1%2Cx_1%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="(t_1,x_1)" class="latex" />; this means we already know that the result will also pass through this point. So <img src="https://s0.wp.com/latex.php?latex=t_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=t_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=t_1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="t_1" class="latex" /> is taken care of, and we only need to worry about <img src="https://s0.wp.com/latex.php?latex=t_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=t_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=t_0&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="t_0" class="latex" /> and <img src="https://s0.wp.com/latex.php?latex=t_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=t_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=t_2&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="t_2" class="latex" /> &#8211; and for each of the two, one of our two polynomials does the job, so we can do the linear interpolation trick again. The generalization of this approach to higher degrees requires that we make sure that both of our input polynomials at every step interpolate all of the middle points, so we only need to fix up the ends. But this is easy to arrange &#8211; the general pattern should be clear from the construction above. This gives us our recursive construction rule:</p>
<p><img src="https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28%28t+-+t_i%29+%2F+%28t_%7Bi%2Bd%7D+-+t_i%29%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28%28t+-+t_i%29+%2F+%28t_%7Bi%2Bd%7D+-+t_i%29%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28%28t+-+t_i%29+%2F+%28t_%7Bi%2Bd%7D+-+t_i%29%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_i^{[d]}(t) = l((t - t_i) / (t_{i+d} - t_i), p_i^{[d-1]}(t), p_{i+1}^{[d-1]}(t))" class="latex" /></p>
<p>All of this is, of course, not new; in fact, this is just <a href="http://en.wikipedia.org/wiki/Neville%27s_algorithm">Neville&#8217;s algorithm</a>. But in typical presentations, this is derived purely algebraically from the properties of Newton interpolation and divided differences, and it&#8217;s not pointed out that the linear combination in the recurrence is, in fact, a linear interpolation &#8211; which at least to me makes everything much easier to visualize.</p>
<h3>The punchline</h3>
<p>The really interesting bit to me though is that, starting from the exact same initial conditions, we get three different important interpolation / approximation algorithms that differ only in how they choose their interpolation factors:</p>
<p>de Casteljau: <img src="https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28t%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28t%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28t%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_i^{[d]}(t) = l(t, p_i^{[d-1]}(t), p_{i+1}^{[d-1]}(t))" class="latex" /><br />
Neville: <img src="https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28%28t+-+t_i%29+%2F+%28t_%7Bi%2Bd%7D+-+t_i%29%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28%28t+-+t_i%29+%2F+%28t_%7Bi%2Bd%7D+-+t_i%29%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28%28t+-+t_i%29+%2F+%28t_%7Bi%2Bd%7D+-+t_i%29%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_i^{[d]}(t) = l((t - t_i) / (t_{i+d} - t_i), p_i^{[d-1]}(t), p_{i+1}^{[d-1]}(t))" class="latex" /><br />
de Boor: <img src="https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28%28t+-+t_%7Bi%2Bd-1%7D%29+%2F+%28t_%7Bi%2Bk%7D+-+t_%7Bi%2Bd-1%7D%29%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" srcset="https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28%28t+-+t_%7Bi%2Bd-1%7D%29+%2F+%28t_%7Bi%2Bk%7D+-+t_%7Bi%2Bd-1%7D%29%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002 1x, https://s0.wp.com/latex.php?latex=p_i%5E%7B%5Bd%5D%7D%28t%29+%3D+l%28%28t+-+t_%7Bi%2Bd-1%7D%29+%2F+%28t_%7Bi%2Bk%7D+-+t_%7Bi%2Bd-1%7D%29%2C+p_i%5E%7B%5Bd-1%5D%7D%28t%29%2C+p_%7Bi%2B1%7D%5E%7B%5Bd-1%5D%7D%28t%29%29&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002&#038;zoom=4.5 4x" alt="p_i^{[d]}(t) = l((t - t_{i+d-1}) / (t_{i+k} - t_{i+d-1}), p_i^{[d-1]}(t), p_{i+1}^{[d-1]}(t))" class="latex" /></p>
<p>I think this quite pretty. B-Splines with the right knot vector (e.g. [0,0,0,1,1,1] for the quadratic curves we&#8217;ve been using) are just Bezier Curves, that bit is well known. But what&#8217;s less well known is that Neville&#8217;s Algorithm (and hence regular polynomial interpolation) is just another triangular linear interpolation scheme that fits inbetween the two.</p>
]]></html></oembed>