繁体   English   中英

在曲线的开始和结束处用麻木的、尖锐的不正确的曲率跳跃来计算曲率?

[英]Calculating curvature with numpy, sharp incorrect jumps in curvature at beginning and end of curve?

我正在尝试使用 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)

你总是可以期待这种人工制品。

如果使用相邻向量之间的差异计算沿向量的梯度,则估计每个间隔中的梯度,结果必然比原始向量少一个值:

>>> 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)
7

Numpy 使用更好的近似值估计每个点的梯度,同时考虑到每个值的邻居:

>>> (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 时,都应丢弃第一个和最后一个元素以避免出现此类边界伪影。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM