Scipy样条曲线的峰值曲率

时间:2012-11-27 18:47:40

标签: python scipy

如何使用scipy找到拟合样条曲线的峰值曲率? (实际上,峰值差二分就足够了)

我使用我的1d tckxs向量计算了ys值如下:

tck = splrep(xs, ys, s=0)

我知道我可以在我选择的任何x评估第二个差异:

ddy = splev([x], tck, 2)

所以我可以遍历x的许多值,计算曲率并取最大值。但我更倾向于解释tck中的值来获得各个三次函数的系数,从而直接计算峰值曲率。但是,tck显得相当不透明 - 如何从中提取三次函数系数?

1 个答案:

答案 0 :(得分:0)

只需在der函数上使用splev关键字参数:

ddy = splev(X, tck, der=2)

并且最好不要循环遍历x的许多值,而是创建包含要评估的每个值的Nx1数组X,以便返回值的数组而不是单个值无论如何,你必须加入一个序列。

此外,非常建议将结果作为一种调试方式。如果情节有意义,那么事情最有可能发挥作用(如果没有,它们肯定不起作用)。

编辑:如果使用X的插值只给出一个近似值并且您想要TRUE最大值,则可以使用定义最大值的三个点的抛物线插值(局部插值最大值及其邻域),考虑到样条曲线是本地顺利:

def parabolic_interpolation(p1, p2, p3):
    x1, y1 = p1
    x2, y2 = p2
    x3, y3 = p3

    denom = (x1-x2)*(x1-x3)*(x2-x3);
    a = (x3*(y2-y1)+x2*(y1-y3)+x1*(y3-y2))/denom
    b = (x3*x3*(y1-y2)+x2*x2*(y3-y1)+x1*x1*(y2-y3))/denom
    c = (x2*x3*(x2-x3)*y1+x3*x1*(x3-x1)*y2+x1*x2*(x1-x2)*y3)/denom

    xv = -b/(2*a)
    yv = c-b**2/(4*a)

    return (xv, yv)  # coordinates of the vertex

希望这有帮助!