我正在尝试使用Numpy计算曲率值,在大多数情况下,使用标准数学似乎工作得很好。然而,我似乎遇到了一个问题,我的曲线末端的曲率计算不正确。下面是我想说的一个例子:
曲线:

计算出的曲率:

正如你所看到的,在曲率图的开始和结束处有两个非常急剧的过渡,尽管曲线本身在曲率上没有任何这样的急剧变化。有人知道为什么会发生这种情况吗?我已经在多条其他曲线上测试了我的代码,并在结束时看到了类似的行为。
下面是我的代码,我用它来计算x和y点的两个numpy数组的曲率:
# Calculate first derivative of spline
dx = np.gradient(spline_x)
dy = np.gradient(spline_y)
# Calculate the second derivative of spline
d2x = np.gradient(dx)
d2y = np.gradient(dy)
# Calculate curvature
spline_curvature = (dx * d2y - d2x * dy) / ((dx * dx + dy * dy) ** 1.5)发布于 2021-11-01 20:51:41
您总是可以预期到这种工件。
如果使用相邻矢量之间的差计算沿矢量的梯度,则估计每个区间中的梯度,并且结果必须比原始矢量少一个值:
>>> v = np.array([2,1,3,3,4,5,3,4], dtype=float)
>>> len(v)
8
>>> g = np.diff(v)
>>> g
array([-1., 2., 0., 1., 1., -2., 1.])
>>> len(g)
7Numpy使用更好的近似值估计每个点的gradient,并考虑每个值的邻居:
>>> (v[2:] - v[:-2])/2
array([ 0.5, 1. , 0.5, 1. , -0.5, -0.5])
>>> g = np.gradient(v)
>>> g
array([-1. , 0.5, 1. , 0.5, 1. , -0.5, -0.5, 1. ])
>>> len(g)
8但是,正如您所看到的,梯度具有与原始向量相同的元素数量,因此第一个和最后一个值不能以相同的方式计算。事实上,它们与前一种(diff)方法的第一个和最后一个值一致。但这些不是对点数的估计,而是对区间的估计。
因此,每次使用gradient时,都应该丢弃第一个和最后一个元素,以避免此类边界工件。
https://stackoverflow.com/questions/69773871
复制相似问题