牛顿插值多项式的图必须完全匹配原函数和拉格朗日插值多项式在区间上的图吗?

Must plot of Newton interpolation polynomial match completely the plot of original function and Lagrange interpolation polynomial on the interval?

我有作业要求我构建牛顿和拉格朗日插值多项式。我对拉格朗日多项式没有任何问题,但使用牛顿多项式会出现一个问题:虽然拉格朗日插值多项式和原始函数完全匹配,但牛顿插值不会这样做。 Here is the plot.

如果我没记错的话,牛顿和拉格朗日多项式插值是表示同一个多项式的不同方式,它们应该在插值区间完全匹配原函数。

我以为牛顿系数计算错了,于是又找了一个除差函数。我尝试了函数和 they gave me the same results.

我现在卡住了。我还是觉得计算分差函数有问题,但是看不出错误。

有什么建议吗?

代码如下:

import numpy as np
from scipy.interpolate  import lagrange


# func from https://pythonnumericalmethods.berkeley.edu/notebooks/chapter17.05-Newtons-Polynomial-Interpolation.html
def divided_diff(x, y):
    n = len(y)
    coef = np.zeros([n, n])
    coef[:,0] = y  
    for j in range(1,n):
        for i in range(n-j):
            coef[i][j] = \
           (coef[i+1][j-1] - coef[i][j-1]) / (x[i+j]-x[i])           
    return coef


def coeff(x, y):
    n = len(x)
    arr = y.copy()
    for i in range(1, n):
        arr[i:n] = (arr[i:n] - arr[i - 1]) / (x[i:n] - x[i - 1])
    return arr   


# 1st range
x_values = np.array([0, np.pi/6, np.pi/3, np.pi/2], float)
y_values = np.array([1, np.sqrt(3)/2, 1/2, 0], float)


print(coeff(x_values, y_values))
print(divided_diff(x_values, y_values)[0,:])


# Show polynomials
newton_coefficients = divided_diff(x_values, y_values)[0,:]
newton = np.poly1d(newton_coefficients[::-1])
lagrange_poly = lagrange(x_values, y_values)
print(f"Here is our Lagrange interpolating polynomial:\n{lagrange_poly}\n")
print(f"Here is our Newton interpolating polynomial:\n{newton}\n")

我从你的情节中推断你只是使用了两个插值点(余弦曲线和两个多项式之间共有)。

n点的插值多项​​式是唯一的(拉格朗日和牛顿重合)当且仅当其次数不超过n-1。其实你应该用线性模型。

我认为您正确计算了牛顿系数。然而,这些不是单项式系数,牛顿插值公式是

p(x) = f(x_0) + f[x_0,x_1]*(x-x_0) + f[x_0,x_1,x_2]*(x-x_0)*(x-x_1) + 
          ... + f[x_0,x_1,...,x_{n-1}]*(x-x_0)*(x-x_1)*...*(x-x_{n-2})

你必须像牛顿的霍纳方案那样构造多项式,

newton = 0
for ck,xk in zip(newton_coefficients[::-1],x_values[::-1]):
    newton = newton*np.poly1d([1,-xk]) + np.poly1d([ck])