最小二乘样条插值强制插值通过特定点

时间:2019-06-06 18:27:05

标签: python scipy constraints interpolation spline

在实现一些比平常少的插值问题时遇到了问题。我有一些(x,y)数据点散布在我不知道的先验曲线上,我想尽力重建此曲线,并用最小平方误差对我的点进行插值。我考虑过为此目的使用scipy.interpolate.splrep(但也许您会建议使用更好的选择)。我遇到的另一个困难是,我想限制样条曲线穿过原始数据的某些特定点。我认为打结和权重可以解决问题,但是我不知道该怎么做(除了基本的拟合过程之外,我还拖延避免样条插值理论)。另外,由于某些未公开的原因,当我尝试在splrep中设置结时,会遇到与this post相同的错误,这使事情变得越来越复杂。以下是我的示例代码:

from __future__ import division
import numpy as np
import scipy.interpolate as spi
import matplotlib.pylab as plt

# Some surrogate sample data
f = lambda x : x**2 - x/2.
x = np.arange(0.,20.,0.1)
y = f(4*(x + np.random.normal(size=np.size(x))))

# I want to use spline interpolation with least-square fitting criterion, making sure though that the spline starts
# from the origin (or in general passes through a precise point of my dataset). 
# In my case for example I would like the spline to originate from the point in x=0. So I attempted to include as first knot x=0... 
# but it won't work, nor I am sure this is the right procedure...

fy = spi.splrep(x,y)
fy = spi.splrep(x,y,t=fy[0])
yy = spi.splev(x,fy)

plt.plot(x,y,'-',x,yy,'--')
plt.show()

尽管事实上我什至传递了通过splrep的第一次调用计算出的结,它也会给我:

  File "/usr/lib64/python2.7/site-packages/scipy/interpolate/fitpack.py", line 289, in splrep
    res = _impl.splrep(x, y, w, xb, xe, k, task, s, t, full_output, per, quiet)
  File "/usr/lib64/python2.7/site-packages/scipy/interpolate/_fitpack_impl.py", line 515, in splrep
    raise _iermess[ier][1](_iermess[ier][0])
ValueError: Error on input data

2 个答案:

答案 0 :(得分:1)

您使用splrep的权重参数:可以给这些点提供您需要固定的非常大的权重。当然,这是一种解决方法,因此请注意配合质量和稳定性。

答案 1 :(得分:0)

按照@ ev-br的建议,为特定点设置高权重确实是一种可行的解决方案。另外,由于没有直接的方法可以在曲线的极值处匹配导数,因此在这种情况下也可以应用相同的原理。假设您希望<link href="https://mystorageaccount.blob.core.windows.net/mycontainer/myicon.ico" rel="shortcut icon" type="image/x-icon"> y[0]中的导数与数据点的导数相匹配,然后还为y[-1]y[1]添加大权重,即

y[-2]