首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在曲线的起始点和结束点计算曲率的数值,尖锐的不正确的跳跃?

在曲线的起始点和结束点计算曲率的数值,尖锐的不正确的跳跃?
EN

Stack Overflow用户
提问于 2021-10-29 19:24:38
回答 1查看 28关注 0票数 0

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

曲线:

计算出的曲率:

正如你所看到的,在曲率图的开始和结束处有两个非常急剧的过渡,尽管曲线本身在曲率上没有任何这样的急剧变化。有人知道为什么会发生这种情况吗?我已经在多条其他曲线上测试了我的代码,并在结束时看到了类似的行为。

下面是我的代码,我用它来计算x和y点的两个numpy数组的曲率:

代码语言:javascript
复制
# 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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-01 20:51:41

您总是可以预期到这种工件。

如果使用相邻矢量之间的差计算沿矢量的梯度,则估计每个区间中的梯度,并且结果必须比原始矢量少一个值:

代码语言:javascript
复制
>>> 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使用更好的近似值估计每个点的gradient,并考虑每个值的邻居:

代码语言:javascript
复制
>>> (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时,都应该丢弃第一个和最后一个元素,以避免此类边界工件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69773871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档