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

问题描述 投票:0回答:1

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

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]

f = interp1d(xs,ys,"cubic")

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

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

我也尝试使用Matlab,得到13.4583

scipy interpolation spline
1个回答
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为自然样条
© www.soinside.com 2019 - 2024. All rights reserved.