我有一些数据点,我喜欢用立方b样条拟合近似。在另一个程序中,我喜欢仅使用拟合的结和系数来插值一些点。这意味着我需要编写代码来自己评估给定结和系数的点。使用this wiki page,我已经能够使用
的结果正确评估各个点knots,coeff,n=scipy.interpolate.splrep(x,y)
奇怪的是,我需要删除数组中的第一个和最后三个条目以使代码生效(注意:前4个和最后4个结条目是相同的,因此会产生除0错误)。有人知道为什么有这些重复的条目?除了删除这些条目之外,维基页面中的等式也可以使用。从结果
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. ]
我得到了很好的数据点近似值。
然而,当我想要使用重量时,我注意到了#34;结..."和" 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)来评估给定函数中的节点和系数的各个点。
答案 0 :(得分:1)
我认为你在开头和结尾都有重复结的原因是因为它正在形成一个钳制的样条曲线。在使用其他数字语言(例如Scilab)创建样条曲线时,这是一个选项。根据{{3}}重复,结是获得一个通过端点的夹紧样条的标准方法,其样条的初始和结束斜率接近第二个和最后一个点的数据。
上面的评论解释了如何评估B样条。但是,您也可以使用Math.stackexchange(通过interpolate.PPoly)将B样条转换为易于评估的分段多项式样条,如interpolate.PPoly.from_spline中所述。