我需要在x-y平面中定义的1D线上拟合由三阶多项式组成的样条曲线。多项式的导数在关节处必须相等。预期的输出是一个三阶多项式列表,由它们的起点(样条结)及其多项式系数定义。
我认为scipy的splrep函数将是理想的选择。但是我很难理解该功能的结果。例如,以下代码将产生以下结果:
x = np.linspace(0, 10, 100)
y = np.sin(x)
sp1 = scipy.interpolate.splrep(x, y, k = 3, t = [2, 6])
结果(来自sp1的“结”和“系数”数组):
knots: [ 0., 0., 0., 0., 2., 6., 10., 10., 10., 10.]
coefficients: [-0.32946251, 1.55647594, 0.19883333, -2.08984459, 2.79531098,
-1.14372454, 0. , 0. , 0. , 0. ]
从文档和我的数学理解上,我希望基础代码适合于这些点上的3条样条线:1条从0到2,1条从2到6,以及1条从6到10。这些样条线的方程是什么?然后?为什么我只有6个系数?我不应该有12(3 * 4)吗?
注意:我知道有诸如splev之类的函数可以评估结果-我不需要。我只需要样条曲线的参数。
答案 0 :(得分:1)
这有点难以理解。
注释
请参见
splev
,以评估样条及其衍生物。维数N必须小于11。c
数组中的系数比k+1
少{ 结len(t)
。这与splrep
(零填充)形成对比 系数数组的长度与的数组的长度相同 结。这些附加系数被评估忽略 例程splev
和BSpline
。
由于这些样条插值函数集围绕FITPACK的子例程splev,因此您必须查看系数的含义。在子例程的文档中:
c t : array,length n, which contains the position of the knots.
c n : integer, giving the total number of knots of s(x).
c c : array,length n, which contains the b-spline coefficients.
将完整的圆圈返回到scipy
。它阐明了BSpline formula,同时还指出了它如何使用系数以及它们的预期长度是多少。
为确保输入正确,将其与BSplines的数学定义相关联以识别给定BSpline顺序所需的打结和控制点始终很重要。