scipy样条插值与自然和matlab样条的微小差异

时间:2015-08-17 19:00:05

标签: scipy interpolation spline

我使用scipy.interpolate根据以下数据进行样条插值:

Error: Did not find exactly one match for componentType:function UserMenu()

现在f(10)给出13.4589,而我用C(自然样条)中的“数字接收”代码获得13.4525

你能解释一下这个区别吗?

我也尝试使用Matlab,它给出13.4583

1 个答案:

答案 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()

两个样条曲线差异的图表显示差异仅在插值范围的末端附近可见;这是边界条件的影响最强的地方。

difference

10时的值:

  • 13.458277949 for knot-a-not spline
  • 13.4524921744 for natural spline