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

2024-09-29 02:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我的家庭作业要求我建立牛顿和拉格朗日插值多项式。我对拉格朗日多项式没有任何问题,但牛顿多项式产生了一个问题:虽然拉格朗日插值多项式和原始函数完全匹配,但牛顿插值并没有做到这一点。 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")

Tags: 函数forhereisnpdiffrangenewton
2条回答

我从你的图中推断,你只使用了两个插值点(余弦曲线和两个多项式之间的公共点)

当次数不超过n-1时,n点插值多项式是唯一的(拉格朗日和牛顿重合)。事实上,您应该使用线性模型

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

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])

相关问题 更多 >