ROV04_6.MWS

Chapter 4. Smoothing of Functions

> restart:

4.1 Method of Least Squares

Example 1. The data from the Example in Section 3.1.

> xx := [2,3,4,5,6,7,8]: yy:=[32,34,36,34,39,40,37]:

> PNTS := plot([xx, yy], style=point, symbol=circle):

> with(stats): P1 := op(2, fit[leastsquare[[x,y]]]([xx,yy]));

> P2 := op(2,fit[leastsquare[[x,y],y=a2*x^2+a1*x+a0]]([xx,yy]));

> P3 := op(2,fit[leastsquare[[x,y],y=a3*x^3+a2*x^2+a1*x+a0]]([xx, yy]));

> PL := plot([P1,P2,P3], x=0..10, color=[blue,green,red]):

> plots[display]([PNTS, PL]);

4.2 Bezier Curves

> xx:=[2,3,4,5,6,7,8]: yy:=[32,34,36,34,39,40,37]:

> PNTS:=plot([seq([xx[i], yy[i]],i=1..7)],style=point,symbol=circle): n:=nops(xx)-1:

> bez:=x->evalm(sum(binomial(n,i)*x^i*(1-x)^(n-i)*[xx[i+1],yy[i+1]],i=0..n)): PBEZ:=plot([bez(x)[1],bez(x)[2],x=0..1]):

> plots[display]([PNTS, PBEZ], axes=framed);

Note that the function bez(x)[1] is linear when the step of its net is constant.

> expand(bez(t)[1]);

Base Bernstein functions are nonnegative with sum equal to 1.

> simplify(sum(binomial(n,i)*x^i*(1-x)^(n-i), i=0..n));

4.3 Rational Bezier Curves

Extend the program for a Bezier curve (for example, = , and other weights are equal to 1).

>

> xx:=[2,3,4,5,6,7,8]: yy:=[32,34,36,34,39,40,37]:

> PNTS:=plot([seq([xx[i], yy[i]],i=1..7)],style=point,symbol=circle): n:=nops(xx)-1:

> w:=[1,1,5,1,5,1,1]: rbez:=x->evalm(sum(binomial(n,i)*x^i*(1-x)^(n-i)*w[i+1]*[xx[i+1], yy[i+1]], i=0..n)/sum(binomial(n,i)*x^i*(1-x)^(n-i)*w[i+1], i=0..n));

> PRBEZ:=plot([rbez(x)[1], rbez(x)[2], x=0..1]):

> plots[display]([PNTS, PRBEZ], axes=framed);

Example 1. Compare the curve PRBEZ given by 8 control points on the perimeter of the square with center

at the origin and the circle CIRC of radius with center at .

> xx:=[0,1,1,1,0,-1,-1,-1,0]: yy:=[-1,-1,0,1,1,1,0,-1,-1]:

> w:=[1,1,1.6,1,1.2,1,1.6,1,1]:

> CIRC:=plot([0.8*cos(t), 0.8*sin(t)-0.2, t=0..2*Pi], scaling=constrained):%;

Solution .

> n:=nops(xx)-1: PNTS:=plot([seq([xx[i], yy[i]],i=1..n+1)],style=point):

> rbez:=x->evalm(sum(binomial(n,i)*x^i*(1-x)^(n-i)*w[i+1]*[xx[i+1], yy[i+1]], i=0..n)/sum(binomial(n,i)*x^i*(1-x)^(n-i)*w[i+1], i=0..n)):

> PRBEZ:=plot([rbez(x)[1], rbez(x)[2], x=0..1]):

> plots[display]([PNTS, PRBEZ,CIRC], axes=framed);