我正在尝试将一些MatLab代码移植到Scipy,并且尝试了Scipy.interpolate、interp1d和UnivariateSpline中的两个不同函数。interp1d的结果与interp1d的MatLab函数相匹配,但是单变量的pline数是不同的,在某些情况下是非常不同的。
f = interp1d(row1,row2,kind='cubic',bounds_error=False,fill_value=numpy.max(row2))
return f(interp)
f = UnivariateSpline(row1,row2,k=3,s=0)
return f(interp)
有人能提供一些见解吗?我的x值不是等距的,虽然我不知道这有什么关系。
我刚碰到同样的问题。
简短的回答
请改用InterpolatedUnivariateSpline:
冗长的回答
UnivariateSpline是“适合给定数据点集的一维平滑样条曲线”,而InterpolatedUnivariateSpline是“给定数据点集的一维插值样条曲线”。前者平滑数据,而后者是一种更为传统的插值方法,并再现了interp1d中预期的结果。下图说明了区别。
复制该图的代码如下所示。
结果不同(但都可能正确)的原因是
UnivariateSpline
和interp1d
使用的插值例程不同。interp1d
使用作为结给它的x
点构造一个平滑的B样条曲线UnivariateSpline
基于FITPACK,它还构造了一个平滑的B样条曲线。但是,FITPACK尝试为样条曲线选择新的节点,以便更好地拟合数据(可能是为了最小化chi^2加上曲率的一些惩罚,或类似的东西)。您可以通过g.get_knots()
找到它使用的结点。所以得到不同结果的原因是插值算法不同。如果要在数据点处使用节点的B样条曲线,请使用
interp1d
或splmake
。如果您想要FITPACK的功能,请使用UnivariateSpline
。在稠密数据的限制下,两种方法给出的结果相同,但当数据稀疏时,可能得到不同的结果。(我怎么知道这些:我读了代码:-)
对我有用
这给了我
相关问题 更多 >
编程相关推荐