NewtonInterpolation
NewtonInterpolation
1 Introduction
We continue with an alternative approach to find the interpolation polynomial.
ω0 (x) = 1,
ω1 (x) = (x − x0 ),
ω2 (x) = (x − x0 )(x − x1 ),
...
ωn (x) = (x − x0 )(x − x1 ) · · · (x − xn−1 ),
or more explicitly
In the light of this form of writing a polynomial, the polynomial interpolation problem leads to the
following observations. Let us start with a single node x0 , then f (x0 ) = p(x0 ) = c0 . Going one step further
and consider two nodes x0 , x1 . Then we see that f (x0 ) = p(x0 ) = c0 and f (x1 ) = p(x1 ) = c0 + c1 (x1 − x0 ).
The latter implies that the coefficient
f (x1 ) − f (x0 )
c1 = .
x1 − x0
Given three nodes x0 , x1 , x2 yields the coefficients c0 , c1 as defined above, and from
Playing with this quotient gives the much more structured expression
This procedure can be continued and yields a so-called triangular systems that permits to define the
remaining coefficients c3 , . . . , cn . One sees quickly that the coefficient ck only depends on the interpolation
points (x0 , y0 ), . . . , (xk , yk ), where yi := f (xi ), i = 0, . . . , n.
We introduce the folllwing so-called finite difference notation for a function f . The 0th order finite
difference is defined to be f [x0 ] := f (x0 ). The 1st order finite difference is
f (x1 ) − f (x0 )
f [x0 , x1 ] := .
x1 − x0
f [x1 , x2 ] − f [x0 , x1 ]
f [x0 , x1 , x2 ] := .
x2 − x0
In general, the nth order finite difference of the function f , also called the nth Newton divided
difference, is defined recursively by
f [x1 , . . . , xn ] − f [x0 , . . . , xn−1 ]
f [x0 , . . . , xn ] := .
xn − x0
Newton’s method to solve the polynomial interpolation problem can be summarized as follows. Given
n + 1 interpolation points (x0 , y0 ), . . . , (xn , yn ), yi := f (xi ). If the order n interpolation polynomial is
expressed in Newton’s form
ck = f [x0 , . . . , xk ]
It is common to write the finite differences in a table, which for n = 3 will look like:
x0 f [x0 ]
f [x0 , x1 ]
x1 f [x1 ] f [x0 , x1 , x2 ]
f [x1 , x2 ] f [x0 , x1 , x2 , x3 ]
x2 f [x2 ] f [x1 , x2 , x3 ]
f [x2 , x3 ]
x3 f [x3 ]
2
Example 1 again: Given the points in Example 1. The corresponding table of divided differences
becomes:
0 1
−3/4
2/3 1/2 −3/4
−3/2
1 0
3 3 2 1 3
p2 (x) = 1 − (x − 0) − (x − 0)(x − ) = 1 − x − x2 .
4 4 3 4 4
1.2 Implementation
The method above is implemented as two functions:
• divdiff(xdata, ydata): Create the table of divided differences
• newtonInterpolation(F, xdata, x): Evaluate the interpolation polynomial.
Here, xdata and ydata are arrays with the interpolation points, and x is an array of values in which the
polynomial is evaluated.
def divdiff(xdata,ydata):
# Create the table of divided differences based
# on the data in the arrays x_data and y_data.
n = len(xdata)
F = np.zeros((n,n))
F[:,0] = ydata # Array for the divided differences
for j in range(n):
for i in range(n-j-1):
F[i,j+1] = (F[i+1,j]-F[i,j])/(xdata[i+j+1]-xdata[i])
return F # Return all of F for inspection.
# Only the first row is necessary for the
# polynomial.