> 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