Newton Divided Difference
Newton’s Divided Difference Interpolation is a method for constructing interpolating polynomials using recursively computed divided differences.
Divided Differences
First Divided Difference
The first divided difference between two points is simply the slope:
This is equivalent to Linear Interpolation.
Higher-Order Divided Differences
Higher-order divided differences are defined recursively:
For example, the second divided difference is:
Newton’s Interpolating Polynomial
The interpolating polynomial using Newton’s form is:
More generally:
Divided Difference Table
Divided differences are typically organized in a table:
| … | ||||
|---|---|---|---|---|
| … | ||||
| … | ||||
Each entry is computed from the two entries to its left and upper-left.
Properties
- Incremental construction: Can add new points without recomputing entire polynomial
- Truncation: Polynomial can be truncated at any term
- Error estimation: Next term provides error estimate
- Symmetry: is independent of the order of arguments
- Connection to derivatives: Related to higher-order terms in Taylor Series
Relationship to Taylor Series
The divided differences are related to derivatives:
for some in the interval .
Advantages
- Efficient: Easy to compute recursively
- Flexible: Can add new data points incrementally
- Stable: Generally numerically stable
- Error estimation: Built-in error estimates
Limitations
- Runge phenomenon: High-degree polynomials can oscillate wildly
- Equispaced points: Particularly prone to oscillations with equispaced data
- Extrapolation: Poor for extrapolation beyond data range
Comparison to Lagrange Interpolation
Newton’s and Lagrange Interpolation produce identical polynomials but:
- Newton’s form is more efficient for computation
- Newton’s form is more flexible (incremental updates)
- Lagrange form is more symmetric and conceptually simpler
Python Implementation
def compute_divided_differences(x_values, y_values):
"""
Compute the divided difference table.
Parameters
----------
x_values : numpy.ndarray
Array of x-coordinates
y_values : numpy.ndarray
Array of y-coordinates
Returns
-------
numpy.ndarray
2D array containing divided difference table
"""
num_points = len(x_values)
table = np.zeros((num_points, num_points))
table[:, 0] = y_values
for column in range(1, num_points):
for row in range(num_points - column):
numerator = table[row + 1, column - 1] - table[row, column - 1]
denominator = x_values[row + column] - x_values[row]
table[row, column] = numerator / denominator
return table
def newton_polynomial(x_value, x_data, divided_diff_table):
"""
Evaluate Newton's polynomial at a point.
Parameters
----------
x_value : float
Point at which to evaluate
x_data : numpy.ndarray
Array of x-coordinates
divided_diff_table : numpy.ndarray
Divided difference table
Returns
-------
float
Value of polynomial at x_value
"""
num_points = len(x_data)
result = divided_diff_table[0, 0]
product_term = 1.0
for index in range(1, num_points):
product_term *= (x_value - x_data[index - 1])
result += divided_diff_table[0, index] * product_term
return resultApplications
- Function approximation
- Numerical differentiation
- Numerical integration
- Data smoothing
Related Methods
- Lagrange Interpolation: Alternative polynomial form
- Spline Interpolation: Piecewise alternative
- Taylor Series: Local polynomial approximation