Bernstein basis polynomials: Difference between revisions
Content added Content deleted
(Added Go) |
(→{{header|ALGOL 68}}: Simplify a little using features of Algol 68 not in Algol 60) |
||
Line 337: | Line 337: | ||
# Note the "Subrptoghram (n) designations are as specified in the # |
# Note the "Subrptoghram (n) designations are as specified in the # |
||
# task # |
# task # |
||
MODE BERNTWO = STRUCT( STRING label, REAL b0, b1, b2 ); |
|||
MODE BERNTHREE = STRUCT( STRING label, REAL b0, b1, b2, b3 ); |
|||
PRIO EVAL = 5; # set the priority of the dyadic EVAL # |
|||
# Subprogram (1): transform monomial coefficients # |
# Subprogram (1): transform monomial coefficients # |
||
# a0, a1, a2 to Bernstein coefficients b0, b1, b2 # |
# a0, a1, a2 to Bernstein coefficients b0, b1, b2 # |
||
PROC tobern2 = ( REAL a0, a1, a2, REF |
PROC tobern2 = ( REAL a0, a1, a2, REF BERNTWO b )VOID: |
||
BEGIN |
BEGIN |
||
b0 := a0; |
b0 OF b := a0; |
||
b1 := a0 + ((1/2) * a1); |
b1 OF b := a0 + ((1/2) * a1); |
||
b2 := a0 + a1 + a2 |
b2 OF b := a0 + a1 + a2 |
||
END # tobern2 # ; |
END # tobern2 # ; |
||
Line 350: | Line 355: | ||
# Bernstein coefficients b0, b1, b2. Use de Casteljau's # |
# Bernstein coefficients b0, b1, b2. Use de Casteljau's # |
||
# algorithm # |
# algorithm # |
||
OP EVAL = ( BERNTWO b, REAL t )REAL: |
|||
BEGIN |
BEGIN |
||
REAL s = 1 - t; |
REAL s = 1 - t; |
||
REAL b01 = (s * b0) + (t * b1); |
REAL b01 = (s * b0 OF b) + (t * b1 OF b); |
||
REAL b12 = (s * b1) + (t * b2); |
REAL b12 = (s * b1 OF b) + (t * b2 OF b); |
||
(s * b01) + (t * b12) |
(s * b01) + (t * b12) |
||
END # |
END # EVAL # ; |
||
# Subprogram (3): transform monomial coefficients # |
# Subprogram (3): transform monomial coefficients # |
||
# a0, a1, a2, a3 to Bernstein coefficients b0, b1, # |
# a0, a1, a2, a3 to Bernstein coefficients b0, b1, # |
||
# b2, b3 # |
# b2, b3 # |
||
PROC tobern3 = ( REAL a0, a1, a2, a3, REF |
PROC tobern3 = ( REAL a0, a1, a2, a3, REF BERNTHREE b )VOID: |
||
BEGIN |
BEGIN |
||
b0 := a0; |
b0 OF b := a0; |
||
b1 := a0 + ((1/3) * a1); |
b1 OF b := a0 + ((1/3) * a1); |
||
b2 := a0 + ((2/3) * a1) + ((1/3) * a2); |
b2 OF b := a0 + ((2/3) * a1) + ((1/3) * a2); |
||
b3 := a0 + a1 + a2 + a3 |
b3 OF b := a0 + a1 + a2 + a3 |
||
END # tobern3 # ; |
END # tobern3 # ; |
||
Line 372: | Line 377: | ||
# with Bernstein coefficients b0, b1, b2, b3. Use # |
# with Bernstein coefficients b0, b1, b2, b3. Use # |
||
# de Casteljau's algorithm # |
# de Casteljau's algorithm # |
||
OP EVAL = ( BERNTHREE b, REAL t )REAL: |
|||
BEGIN |
BEGIN |
||
REAL s = 1 - t; |
REAL s = 1 - t; |
||
REAL b01 = (s * b0) + (t * b1); |
REAL b01 = (s * b0 OF b) + (t * b1 OF b); |
||
REAL b12 = (s * b1) + (t * b2); |
REAL b12 = (s * b1 OF b) + (t * b2 OF b); |
||
REAL b23 = (s * b2) + (t * b3); |
REAL b23 = (s * b2 OF b) + (t * b3 OF b); |
||
REAL b012 = (s * b01) + (t * b12); |
REAL b012 = (s * b01) + (t * b12); |
||
REAL b123 = (s * b12) + (t * b23); |
REAL b123 = (s * b12) + (t * b23); |
||
(s * b012) + (t * b123) |
(s * b012) + (t * b123) |
||
END # |
END # EVAL #; |
||
# Subprogram (5): transform the quadratic Bernstein # |
# Subprogram (5): transform the quadratic Bernstein # |
||
# coefficients q0, q1, q2 to the cubic Bernstein # |
# coefficients q0, q1, q2 to the cubic Bernstein # |
||
# coefficients c0, c1, c2, c3; # |
# coefficients c0, c1, c2, c3; # |
||
PROC bern2to3 = ( |
PROC bern2to3 = ( BERNTWO q, REF REAL c0, c1, c2, c3 )VOID: |
||
BEGIN |
BEGIN |
||
c0 := |
c0 := b0 OF q; |
||
c1 := ((1/3) * |
c1 := ((1/3) * b0 OF q) + ((2/3) * b1 OF q); |
||
c2 := ((2/3) * |
c2 := ((2/3) * b1 OF q) + ((1/3) * b2 OF q); |
||
c3 := |
c3 := b2 OF q |
||
END # bern2to3 # ; |
END # bern2to3 # ; |
||
Line 414: | Line 419: | ||
END # f # ; |
END # f # ; |
||
PRIO SHOWEVAL = 5; |
|||
# prints the result of evaluating p with x # |
|||
OP SHOWEVAL = ( BERNTWO p, REAL x )VOID: |
|||
print( ( " ", label OF p, " ( ", f( x ), " ) = ", f( p EVAL x ), newline ) ); |
|||
# prints the result of evaluating p with x # |
|||
OP SHOWEVAL = ( BERNTHREE p, REAL x )VOID: |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
BERNTHREE p3 := BERNTHREE( "p", 0, 0, 0, 0 ); |
|||
BERNTHREE q3 := BERNTHREE( "q", 0, 0, 0, 0 ); |
|||
BERNTHREE r3 := BERNTHREE( "r", 0, 0, 0, 0 ); |
|||
REAL pc0 := 0, pc1 := 0, pc2 := 0, pc3 := 0; |
REAL pc0 := 0, pc1 := 0, pc2 := 0, pc3 := 0; |
||
REAL qc0 := 0, qc1 := 0, qc2 := 0, qc3 := 0; |
REAL qc0 := 0, qc1 := 0, qc2 := 0, qc3 := 0; |
||
⚫ | |||
REAL p0m = 1, p1m = 0, p2m = 0; |
REAL p0m = 1, p1m = 0, p2m = 0; |
||
Line 430: | Line 441: | ||
REAL r0m = 1, r1m = 2, r2m = 3, r3m = 4; |
REAL r0m = 1, r1m = 2, r2m = 3, r3m = 4; |
||
tobern2( p0m, p1m, p2m, |
tobern2( p0m, p1m, p2m, p2 ); |
||
tobern2( q0m, q1m, q2m, |
tobern2( q0m, q1m, q2m, q2 ); |
||
print( ( "Subprogram (1) examples:", newline ) ); |
print( ( "Subprogram (1) examples:", newline ) ); |
||
print( ( " mono ( ", f( p0m ), ", ", f( p1m ), ", ", f( p2m ) |
print( ( " mono ( ", f( p0m ), ", ", f( p1m ), ", ", f( p2m ) |
||
, " ) --> bern ( ", f( |
, " ) --> bern ( ", f( b0 OF p2 ), ", ", f( b1 OF p2 ), ", ", f( b2 OF p2 ) |
||
, " )", newline |
, " )", newline |
||
) |
) |
||
); |
); |
||
print( ( " mono ( ", f( q0m ), ", ", f( q1m ), ", ", f( q2m ) |
print( ( " mono ( ", f( q0m ), ", ", f( q1m ), ", ", f( q2m ) |
||
, " ) --> bern ( ", f( |
, " ) --> bern ( ", f( b0 OF q2 ), ", ", f( b1 OF q2 ), ", ", f( b2 OF q2 ) |
||
, " )", newline |
, " )", newline |
||
) |
) |
||
Line 445: | Line 456: | ||
print( ( "Subprogram (2) examples:", newline ) ); |
print( ( "Subprogram (2) examples:", newline ) ); |
||
p2 SHOWEVAL 0.25; |
|||
p2 SHOWEVAL 7.50; |
|||
⚫ | |||
⚫ | |||
q2 SHOWEVAL 7.50; |
|||
⚫ | |||
print( ( " p ( ", f( x ), " ) = ", f( y ), newline ) ); |
|||
⚫ | |||
⚫ | |||
print( ( " q ( ", f( x ), " ) = ", f( y ), newline ) ); |
|||
⚫ | |||
y := evalbern2( q0b2, q1b2, q2b2, x ); |
|||
print( ( " q ( ", f( x ), " ) = ", f( y ), newline ) ); |
|||
tobern3( p0m, p1m, p2m, 0, |
tobern3( p0m, p1m, p2m, 0, p3 ); |
||
tobern3( q0m, q1m, q2m, 0, |
tobern3( q0m, q1m, q2m, 0, q3 ); |
||
tobern3( r0m, r1m, r2m, r3m, |
tobern3( r0m, r1m, r2m, r3m, r3 ); |
||
print( ( "Subprogram (3) examples:", newline ) ); |
print( ( "Subprogram (3) examples:", newline ) ); |
||
print( ( " mono ( ", f( p0m ), ", ", f( p1m ), ", ", f( p2m ), ", ", f( 0 ) |
print( ( " mono ( ", f( p0m ), ", ", f( p1m ), ", ", f( p2m ), ", ", f( 0 ) |
||
, " ) --> bern ( ", f( |
, " ) --> bern ( ", f( b0 OF p3 ), ", ", f( b1 OF p3 ), ", ", f( b2 OF p3 ), ", ", f( b3 OF p3 ) |
||
, " )", newline |
, " )", newline |
||
) |
) |
||
); |
); |
||
print( ( " mono ( ", f( q0m ), ", ", f( q1m ), ", ", f( q2m ), ", ", f( 0 ) |
print( ( " mono ( ", f( q0m ), ", ", f( q1m ), ", ", f( q2m ), ", ", f( 0 ) |
||
, " ) --> bern ( ", f( |
, " ) --> bern ( ", f( b0 OF q3 ), ", ", f( b1 OF q3 ), ", ", f( b2 OF q3 ), ", ", f( b3 OF q3 ) |
||
, " )", newline |
, " )", newline |
||
) |
) |
||
); |
); |
||
print( ( " mono ( ", f( r0m ), ", ", f( r1m ), ", ", f( r2m ), ", ", f( r3m ) |
print( ( " mono ( ", f( r0m ), ", ", f( r1m ), ", ", f( r2m ), ", ", f( r3m ) |
||
, " ) --> bern ( ", f( |
, " ) --> bern ( ", f( b0 OF r3 ), ", ", f( b1 OF r3 ), ", ", f( b2 OF r3 ), ", ", f( b3 OF r3 ) |
||
, " )", newline |
, " )", newline |
||
) |
) |
||
Line 479: | Line 482: | ||
print( ( "Subprogram (4) examples:", newline ) ); |
print( ( "Subprogram (4) examples:", newline ) ); |
||
p3 SHOWEVAL 0.25; |
|||
⚫ | |||
y := evalbern3( p0b3, p1b3, p2b3, p3b3, x ); |
|||
⚫ | |||
print( ( " p ( ", f( x ), " ) = ", f( y ), newline ) ); |
|||
q3 SHOWEVAL 7.50; |
|||
⚫ | |||
y := evalbern3( p0b3, p1b3, p2b3, p3b3, x ); |
|||
⚫ | |||
print( ( " p ( ", f( x ), " ) = ", f( y ), newline ) ); |
|||
⚫ | |||
y := evalbern3( q0b3, q1b3, q2b3, q3b3, x ); |
|||
print( ( " q ( ", f( x ), " ) = ", f( y ), newline ) ); |
|||
⚫ | |||
y := evalbern3( q0b3, q1b3, q2b3, q3b3, x ); |
|||
print( ( " q ( ", f( x ), " ) = ", f( y ), newline ) ); |
|||
⚫ | |||
y := evalbern3( r0b3, r1b3, r2b3, r3b3, x ); |
|||
print( ( " r ( ", f( x ), " ) = ", f( y ), newline ) ); |
|||
x := 7.50; |
|||
y := evalbern3( r0b3, r1b3, r2b3, r3b3, x ); |
|||
print( ( " r ( ", f( x ), " ) = ", f( y ), newline ) ); |
|||
bern2to3( |
bern2to3( p2, pc0, pc1, pc2, pc3 ); |
||
bern2to3( |
bern2to3( q2, qc0, qc1, qc2, qc3 ); |
||
print( ( "Subprogram (5) examples:", newline ) ); |
print( ( "Subprogram (5) examples:", newline ) ); |
||
print( ( " bern ( ", f( |
print( ( " bern ( ", f( b0 OF p2 ), ", ", f( b1 OF p2 ), ", ", f( b2 OF p2 ) |
||
, " ) --> bern ( ", f( pc0 ), ", ", f( pc1 ), ", ", f( pc2 ), ", ", f( pc3 ) |
, " ) --> bern ( ", f( pc0 ), ", ", f( pc1 ), ", ", f( pc2 ), ", ", f( pc3 ) |
||
, " )", newline |
, " )", newline |
||
) |
) |
||
); |
); |
||
print( ( " bern ( ", f( |
print( ( " bern ( ", f( b0 OF q2 ), ", ", f( b1 OF q2 ), ", ", f( b2 OF q2 ) |
||
, " ) --> bern ( ", f( qc0 ), ", ", f( qc1 ), ", ", f( qc2 ), ", ", f( qc3 ) |
, " ) --> bern ( ", f( qc0 ), ", ", f( qc1 ), ", ", f( qc2 ), ", ", f( qc3 ) |
||
, " )", newline |
, " )", newline |