2 回答

TA贡献1821条经验 获得超5个赞
您没有具体指定参数的结构是什么pts。但它似乎是一个二维数组,其中每一行都有两个值x,y并且行是曲线中的点。这本身就是有问题的,因为文档并不清楚在这种情况下究竟返回了什么。
但是您显然没有得到xor的导数y。如果您只提供一个数组,np.gradient那么 numpy 假定这些点以 1 的距离均匀分布。但情况可能并非如此。的意义x'的式中的导数x 相对于t,对于曲线的参数变量(它是从所述参数到计算机的功能分离)。但是你永远不会提供tnumpy的值。的值t必须是传递给gradient函数的第二个参数。
因此,为了让您的衍生物,在拆分x,y和t值到单独的一维数组-让打电话给他们x,并y和t。然后得到你的一阶和二阶导数
pts_x = np.gradient(x, t) # first derivatives
pts_y = np.gradient(y, t)
pts_xx = np.gradient(pts_x, t) # second derivatives
pts_yy = np.gradient(pts_y, t)
然后从那里继续。您不再需要这些t值来计算曲率,这是您正在使用的公式的要点。请注意,gradient它并不是真正设计用于计算二阶导数,并且绝对不应该用于计算三阶或更高阶导数。这些需要更复杂的公式。Numpygradient使用“二阶精确中心差分”,这对于一阶导数非常好,对于二阶导数很差,对于高阶导数毫无价值。

TA贡献1872条经验 获得超4个赞
我认为您的问题是 x 和 y 是双值数组。
数组 x 是自变量;我希望它按升序排序。如果我评估 y[i],我希望得到 x[i] 处的曲线值。
当您调用该 numpy 函数时,您会得到一个与 (x, y) 数组形状相同的导数数组。如果 (x, y) 中有 n 对,则
y'[i] gives the value of the first derivative of y w.r.t. x at x[i];
y''[i] gives the value of the second derivative of y w.r.t. x at x[i].
曲率 k 也将是一个具有 n 个点的数组:
k[i] = abs(x'[i]*y''[i] -y'[i]*x''[i])/(x'[i]**2 + y'[i]**2)**1.5
将 x 和 y 视为参数 t 的函数。x' = dx/dt 等。这意味着曲率 k 也是该参数 t 的函数。
当我编写解决方案时,我喜欢有一个易于理解的封闭式解决方案。
y(x) = sin(x) for 0 <= x <= pi
y'(x) = cos(x)
y''(x) = -sin(x)
k = sin(x)/(1+(cos(x))**2)**1.5
现在你有了一个很好的曲率公式作为 x 的函数。
如果要参数化它,请使用
x(t) = pi*t for 0 <= t <= 1
x'(t) = pi
x''(t) = 0
看看您是否可以绘制这些图并让您的 Python 解决方案与之匹配。
添加回答
举报