1

我有一些数据点,我喜欢用三次 b 样条拟合来近似。在另一个程序中,我喜欢仅使用拟合的结和系数来插入一些点。这意味着我需要自己编写代码来评估给定节点和系数的点。使用这个 wiki 页面,我已经能够正确评估各个点,结果是

knots,coeff,n=scipy.interpolate.splrep(x,y)

奇怪的是,我需要删除数组中的第一个和最后 3 个条目才能使代码正常工作(注意:前 4 个和最后 4 个节条目是相同的,因此会产生除以 0 的错误)。有人知道为什么会有这些重复的条目吗?除了删除这些条目之外,wiki 页面中的等式也有效。从结果来看

knots=[   15.,    15.,    15.,    15.,    75.,   105., ...,  2895.,  2925., 2985.,  2985.,  2985.,  2985.]
coeffs=[ 1.87979615,  1.54132042,  1.46751212,  1.31223359,  1.34208367,  1.2181689, ..., 0.99327417,0.5866527,   0.,          0.,          0., 0.        ]

我得到了数据点的一个很好的近似值。

但是,当我也想使用权重时,我注意到“结”和“系数”数组看起来很奇怪。谁知道我需要如何解释样条拟合函数的结果?目前我得到

knots=[15.,15.,15.,15.,2985.,2985.,2985.,2985.] 
coeff=[ 1.48725714,0.3513811,0.71970619,0.66119226,0.,0.,0.,0. ]

或者这甚至是一个错误?

理想情况下,我喜欢有一些代码(C/C++,python)在给定函数的节点和系数的情况下评估各个点。

4

1 回答 1

1

我认为你在开始和结束处有重复结的原因是因为它正在形成一个夹紧的样条。这是用其他数字语言(例如Scilab)创建样条曲线时的一个选项。根据Math.stackexchange ,重复结点是获得通过端点的钳位样条曲线的标准方法,该样条曲线的初始和结束斜率将数据近似于第二个和倒数第二个点。

上面的评论解释了如何评估 B 样条。但是,您也可以使用interpolate.PPoly(通过interpolate.PPoly.from_spline)将 B 样条转换为易于评估的分段多项式样条,如本答案中所述。

于 2015-12-28T23:18:01.437 回答