ROV03_6.MWS

Chapter 3. Interpolation of Functions

> restart:

3.1 Polynomial Interpolation of Functions

Example 1 . Plot over the range x=1..9 and look at its strange behaviour outside of the segment

containing the given nodes.

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

> f:=interp(xx, yy, x); INTERPOL:=plot(f, x=1..9):

> points1:=[seq([xx[j], yy[j]], j=1..nops(xx))]:

> POINTS2:=plot(points1, style=point, symbol=circle):

> plots[display]([POINTS2, INTERPOL]);

Then we plot the graph of on the segment = 1.8..8.2 and look at its oscillations.

Example 2 . [ K. Runge , 1901 ]

> f:=x -> 1/(1+25*x^2): x:=i -> -1+2*i/n: y:=i -> f(x(i)):

> n:=6: g:=interp([seq(x(i), i=0..n)], [seq(y(i),i=0..n)],x);

> plot([f(x), g], x=-1..1);

Example 3. [ S.Bernstein , 1912 ]

> f:=x -> abs(x): x:=i -> -1+2*i/n: y:=i -> f(x(i)):n:=6: g:=interp([seq(x(i), i=0..n)], [seq(y(i),i=0..n)],x);

> plot([f(x), g], x=-1..1);

> xx:=[2,3,4,5,6,7,8]: zz:=[0,0,0,0,0,0,0]: n:=nops(xx)-1:

> yy:=[32,34,36,34,39,40,37]: Points1:=plot([xx, yy], style=point,symbol=circle): delta:=(i,j)->if i=j then 1 else 0 fi:

> for k from 1 to n+1 do L[k]:=unapply(interp(xx,[seq(delta(k,j),j=1..n+1)],x),x); Lx[k]:=unapply(diff(L[k](x),x),x) od:

> HERM:=sum(yy[i]*(1-2*(x-xx[i])*Lx[i](xx[i]))*L[i](x)^2,i=1..n+1)+ sum(zz[i]*(x-xx[i])*L[i](x)^2, i=1..n+1):

> HERMITE:=plot(HERM, x=1.9..8.1):

> plots[display]([Points1, HERMITE],view=[1.9..8.1,25..41]);

3.2 Spline Interpolation of Functions

For example:

Examples.

1 . Plot the " triangular waves " using a linear spline and then smooth them by a cubic spline.

> v:=spline([seq(i, i=0..9)], [seq((-1)^i, i=0..9)], x, linear):

> c:=spline([seq(i, i=0..9)], [seq((-1)^i, i=0..9)], x):

> plot([v, c], x=0..9, scaling=constrained);

3 . Compare the behavior of the Lagrange interpolation polynomial and polynomial splines derived by the "measurements

of air temperature over 10 days" given in Section 1.1.

> Days:=[12,13,14,15,16,17,18,19,20,21]; TT:=[15,17,17.5,19,20,19.5,18,17,17,19];

> f2:=spline(Days, TT, x, quadratic): f3:=spline(Days, TT, x):

> h:=unapply(interp(Days, TT, x), x):

> a:=plot([f2, f3], x=11.8..21.2): b:=plot(h, 11.8..21.2):

> c:=plot([seq([Days[i], TT[i]],i=1..10)], style=point, symbol=diamond):

> plots[display]([a, b, c], view=[11.7..21.2, 12..22]);

3.3 Construction of Curves Using Spline Functions

Example 1 . Try to tie the following knot , well known to sailors.

> tt:=[0,1/3,2/3,1,4/3,3/2,5/3,2,7/3,8/3,3.1]: xx:=[-6,-4,-2,0,4,4.8,4,0,-2,-4,-6]: yy:=[4,2,0,-2,-2,0,2,2,0,-2,-4]: zz:=[1,1,-1,1,-1,0,1,-1,1,-1,-1]:

> tt:=[0,1/3,2/3,1,4/3,3/2,5/3,2,7/3,8/3,3.1]: xx:=[-6,-4,-2,0,4,4.8,4,0,-2,-4,-6]: yy:=[4,2,0,-2,-2,0,2,2,0,-2,-4]: zz:=[1,1,-1,1,-1,0,1,-1,1,-1,-1]:

> readlib(spline): X:=spline(tt, xx, t): Y:=spline(tt, yy, t): Z:=spline(tt, zz, t):

> plots[tubeplot]({[X(t), Y(t), Z(t)], [-X(t), Y(t), -Z(t)]}, t=0..3, radius=.6, tubepoints=30, numpoints=190, orientation=[90, 26], color=[.8, .6, .4], projection=.5, style=patchnogrid, scaling=constrained, ambientlight=[.6, .6, .5], light=[75, 50, 1,.9,.7]);

To understand the key idea, plot the figure in the plane.

> XY:=plot([[X(t), Y(t), t=0..3], [-X(t), Y(t), t=0..3]], color=[red, blue]):

> Points:=plot([seq([op(i, xx), op(i, yy)], i=1..nops(xx)), seq([-op(i, xx), op(i, yy)], i=1..nops(xx))], style=point):

> plots[display](XY, Points, scaling=constrained);

>