我的家庭作业要求我建立牛顿和拉格朗日插值多项式。我对拉格朗日多项式没有任何问题,但牛顿多项式产生了一个问题:虽然拉格朗日插值多项式和原始函数完全匹配,但牛顿插值并没有做到这一点。 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-1时,n点插值多项式是唯一的(拉格朗日和牛顿重合)。事实上,您应该使用线性模型
我认为你正确地计算了牛顿系数。但是,这些不是单项系数,牛顿插值公式是
你必须像牛顿和霍纳方案一样构造多项式
相关问题 更多 >
编程相关推荐