Bernstein basis polynomials: Difference between revisions
m
→{{header|Phix}}: rationalised, reordered, renamed
(Added ATS.) |
m (→{{header|Phix}}: rationalised, reordered, renamed) |
||
Line 1,220:
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">
<span style="color: #004080;">atom</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">a0</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">
<span style="color: #
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">
<span style="color: #004080;">atom</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">
<span style="color: #000080;font-style:italic;">-- de Casteljau’s algorithm.</span>▼
<span style="color: #
<span style="color: #000000;">
<span style="color: #000000;">b012</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">s</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">b01</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">b12</span><span style="color: #0000FF;">)</span>▼
<span style="color: #008080;">return</span> <span style="color: #000000;">b012</span>▼
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">
<span style="color: #004080;">atom</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">
<span style="color: #
<span style="color: #008080;">return</span> <span style="color:
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">
<span style="color: #004080;">atom</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">b0</span><span style="color: #0000FF;">,</span>
<span style="color: #000080;font-style:italic;">// de Casteljau’s algorithm.</span>▼
<span style="color: #000000;">b01</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">s</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">b0</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">b1</span><span style="color: #0000FF;">),</span>▼
<span style="color: #000000;">
<span style="color: #000000;">
<span style="color: #000080;font-style:italic;">
<span style="color: #000000;">b012</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">s</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">b01</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">b12</span><span style="color: #0000FF;">),</span>▼
<span style="color: #000000;">
▲ <span style="color: #008080;">return</span> <span style="color: #000000;">b012</span>
<span style="color: #000000;">b0123</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">s</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">b012</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">b123</span><span style="color: #0000FF;">)</span>▼
<span style="color: #008080;">return</span> <span style="color: #000000;">b0123</span>▼
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">
▲ <span style="color: #004080;">atom</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">b0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b2</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">bernstein_coefficients</span>
<span style="color: #
<span style="color: #000080;font-style:italic;">// first mid-points</span>
<span style="color: #000000;">b01</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">*</span><span style="color: #000000;">b0</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">*</span><span style="color: #000000;">b1</span><span style="color: #0000FF;">,</span>
<span style="color: #000080;font-style:italic;">// second mid-points</span>
▲ <span style="color: #000000;">
<span style="color: #000080;font-style:italic;">// third mid-point is on the curve</span>
▲ <span style="color: #008080;">return</span> <span style="color: #000000;">b0123</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">
<span style="color: #004080;">atom</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">a0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a2</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">monomial_coefficients</span>
▲
▲ <span style="color: #000080;font-style:italic;">/* Horner’s rule. */</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">a0</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">a1</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">a2</span><span style="color: #0000FF;">)))</span>▼
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">
<span style="color: #004080;">atom</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">a0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a3</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">monomial_coefficients</span>
▲ <span style="color: #008080;">return</span> <span style="color: #000000;">a0</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">*(</span><span style="color: #000000;">
▲ <span style="color: #000080;font-style:italic;">--/* Horner’s rule. --*/</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">a0</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">a1</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">a2</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">a3</span><span style="color: #0000FF;">)))))</span>▼
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">
<span style="color: #000000;">
<span style="color: #000000;">
<span style="color: #000000;">
<span style="color: #000000;">
<span style="color: #000000;">
<span style="color: #000000;">
▲
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" m_to_bern3(%v) --> %v\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">pm3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pb3</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" m_to_bern3(%v) --> %v\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">qm3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">qb3</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" m_to_bern3(%v) --> %v\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">rm3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rb3</span><span style="color: #0000FF;">})</span>
▲
▲
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"
<span style="color: #008080;">for</span> <span style="color: #000000;">x</span> <span style="color: #008080;">in</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">0.25</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">7.50</span><span style="color: #0000FF;">}</span> <span style="color: #008080;">do</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" p(%
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" q(%.2f) = %8g (mono: %g)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">eval_bern2</span><span style="color: #0000FF;">(</span><span style="color: #000000;">qb2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x</span><span style="color:
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #
▲ <span style="color: #000000;">qmono3</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- q(x) = 1 + 2x + 3x²</span>
▲ <span style="color: #000000;">pbern3</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">monomial_to_bernstein_degree3</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pmono3</span><span style="color: #0000FF;">),</span>
▲ <span style="color: #000000;">qbern3</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">monomial_to_bernstein_degree3</span><span style="color: #0000FF;">(</span><span style="color: #000000;">qmono3</span><span style="color: #0000FF;">),</span>
▲ <span style="color: #000000;">rbern3</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">monomial_to_bernstein_degree3</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rmono3</span><span style="color: #0000FF;">)</span>
▲ <span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" mono %v --> bern %v\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">pmono3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pbern3</span><span style="color: #0000FF;">})</span>
▲ <span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" mono %v --> bern %v\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">qmono3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">qbern3</span><span style="color: #0000FF;">})</span>
▲ <span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" mono %v --> bern %v\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">rmono3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rbern3</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">x</span> <span style="color: #008080;">in</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">0.25</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">7.50</span><span style="color: #0000FF;">}</span> <span style="color: #008080;">do</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" p(%
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" q(%.2f) = %8g (mono: %g)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">eval_bern3</span><span style="color: #0000FF;">(</span><span style="color: #000000;">qb3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x</span><span style="color:
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
▲ <span style="color: #008080;">constant</span> <span style="color: #000000;">pbern3a</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">bernstein_degree2_to_degree3</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pbern2</span><span style="color: #0000FF;">),</span>
▲ <span style="color: #000000;">qbern3a</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">bernstein_degree2_to_degree3</span><span style="color: #0000FF;">(</span><span style="color: #000000;">qbern2</span><span style="color: #0000FF;">)</span>
▲ <span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" bern %v --> bern %v\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">pbern2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pbern3a</span><span style="color: #0000FF;">})</span>
▲ <span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" bern %v --> bern %v\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">qbern2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">qbern3a</span><span style="color: #0000FF;">})</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
p(0.25) = 1 (mono 1)▼
q(0.25) = 1.6875 (mono 1.6875)▼
p(7.5) = 1 (mono 1)▼
Evaluating bernstein degree 2 examples:
q(7.5) = 184.75 (mono 184.75)▼
▲ p(0.25) = 1 (mono: 1)
▲ q(0.25) = 1.6875 (mono: 1.6875)
▲ mono {1,0,0,0} --> bern {1,1,1,1}
▲ mono {1,2,3,0} --> bern {1,1.666666667,3.333333333,6}
▲ mono {1,2,3,4} --> bern {1,1.666666667,3.333333333,10}
p(0.25) = 1 (mono: 1)
q(0.25) = 1.6875 (mono: 1.6875)
r(0.25) = 1.75 (mono: 1.75)
p(7.
q(7.
r(7.
▲ bern {1,1,1} --> bern {1,1,1,1}
▲ bern {1,2,6} --> bern {1,1.666666667,3.333333333,6}
</pre>
|