我有一些数据点,我喜欢用三次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"one_answers"coeff"数组看起来很奇怪。谁知道我需要如何解释样条拟合函数的结果?现在我得到
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),它计算来自函数的结点和系数的各个点。
我认为你在开始和结束处有重复结的原因是因为它形成了一个夹紧的样条。在其他数值语言(如Scilab)中创建样条时,这是一个选项。根据数学。Stackexchange重复结是获得固定样条的标准方法,该样条通过样条的端点,其初始和结束斜率近似于第二个点和最后一个点的数据。
上面的注释解释了如何计算b样条。但是,您也可以使用interpolate。PPoly(通过interpolate.PPoly.from_spline)将b样条转换为易于计算的分段多项式样条,正如本答案中所解释的那样。