如何使用scipy找到拟合样条曲线的峰值曲率? (实际上,峰值差二分就足够了)
我使用我的1d tck
和xs
向量计算了ys
值如下:
tck = splrep(xs, ys, s=0)
我知道我可以在我选择的任何x
评估第二个差异:
ddy = splev([x], tck, 2)
所以我可以遍历x
的许多值,计算曲率并取最大值。但我更倾向于解释tck
中的值来获得各个三次函数的系数,从而直接计算峰值曲率。但是,tck
显得相当不透明 - 如何从中提取三次函数系数?
答案 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
希望这有帮助!