我使用scipy.interpolate根据以下数据进行样条插值:
Error: Did not find exactly one match for componentType:function UserMenu()
现在f(10)给出13.4589,而我用C(自然样条)中的“数字接收”代码获得13.4525
你能解释一下这个区别吗?
我也尝试使用Matlab,它给出13.4583
答案 0 :(得分:0)
尽管名称很吸引人,但很少使用“天然”立方样条。在三次样条结构中处理两个额外自由度的通常方法是强加“非结”条件,这要求三阶导数在第一个和最后一个内部结处连续;实际上,这些结不再是结,因为多项式系数在这些结处不会改变。
interp1d
返回的三次样条不是一个结,Matlab构造的样条(默认情况下)也是如此。要使用SciPy构造自然样条曲线,请将make_interp_spline
与边界条件[(2, 0)], [(2, 0)]
一起使用,这意味着两端的二阶导数必须为零。例如:
xs=[0.041984,0.374045,0.625954,0.874045,1.374045,1.870229,2.362595,2.862595,3.358778,3.854961,4.354961,5.354961,7.343511,8.835877,9.335877,10.33587]
ys=[14.145,14.235,14.275,14.24,13.91,13.7,13.57,13.52,13.55,13.56,13.45,13.44,13.46,13.44,13.45,13.45]
spl1 = interp1d(xs, ys, "cubic")
l, r = [(2, 0)], [(2, 0)] # natural spline boundary conditions
spl2 = make_interp_spline(xs, ys, k=3, bc_type=(l, r))
t = np.linspace(min(xs), max(xs), 500)
plt.plot(t, spl1(t) - spl2(t))
plt.show()
两个样条曲线差异的图表显示差异仅在插值范围的末端附近可见;这是边界条件的影响最强的地方。
10时的值: