> restart;
HermiteHorner := proc(N,X,F,DF)
local
i,j,x,HX,HD,value;
printf("Specify [f(x1)...f(xn)] and
[f'(x1)...f'(xn)] (2*n conditions),\n");
printf(" find Hermite interpolating polynomial,\n");
printf(" and evaluate it at a given point.\n");
HX := array(1..2*N);
HD := array(1..2*N);
for i from 1 to N do
HX[2*i-1] := X[i];
HX[2*i] := X[i];
HD[2*i] := DF[i];
od;
HD[1]:= F[1];
# 1st Divided Differences
for i from N to 2 by -1 do
HD[2*i-1]:=(F[i]-F[i-1])/(X[i]-X[i-1]);
od;
# 2nd,..., (2*N)-th Divided Differences
for j from 3 to 2*N do
for i from 2*N to j by -1 do
HD[i]:=(HD[i]-HD[i-1])/(HX[i]-HX[i-j+1]);
od;
od;
printf("\nNewton Divided
differences:\n ");
for i from 1 to 2*N do printf("%f
",HD[i]); od;
printf("\n");
# Horner's
scheme:
value := HD[2*N];
printf("\nEnter x to evaluate
interpolating polynomial:\n");
x := scanf("%f")[1];
for i from 2*N-1 to 1 by -1 do
value := HD[i]+(x-HX[i])*value;
od;
printf("p(%f)=%f\n",x,value);
end:
> N:=2: X:=array([1,2]):
F:=array([3,4]): DF:=array([5,6]):
HermiteHorner(N,X,F,DF);
Specify [f(x1)...f(xn)] and
[f'(x1)...f'(xn)] (2*n conditions),
find Hermite interpolating polynomial,
and evaluate it at a given point.
Newton Divided differences:
3.000000 5.000000 -4.000000 9.000000
Enter x to evaluate interpolating
polynomial:
> 3
p(3.000000)=33.000000