猿问

如何在python中实现以下导数公式?

我正在尝试在 python 中为 X 和 Y 点实现以下公式

我试过以下方法


def f(c):

    """This function computes the curvature of the leaf."""

    tt = c

    n = (tt[0]*tt[3] - tt[1]*tt[2])

    d = (tt[0]**2 + tt[1]**2)

    k = n/d

    R = 1/k # Radius of Curvature

    return R

有一些不正确的地方,因为它没有给我正确的结果。我认为在前两行计算导数时我犯了一些错误。我该如何解决?


以下是数据框中的一些点:


pts = pd.DataFrame({'x': x, 'y': y})



           x            y

    0.089631    97.710199

    0.089831    97.904541

    0.090030    98.099313

    0.090229    98.294513

    0.090428    98.490142

    0.090627    98.686200

    0.090827    98.882687

    0.091026    99.079602

    0.091225    99.276947

    0.091424    99.474720

    0.091623    99.672922

    0.091822    99.871553

    0.092022    100.070613

    0.092221    100.270102

    0.092420    100.470020

    0.092619    100.670366

    0.092818    100.871142

    0.093017    101.072346

    0.093217    101.273979

    0.093416    101.476041

    0.093615    101.678532

    0.093814    101.881451

    0.094013    102.084800

    0.094213    102.288577



pts_x = np.gradient(x_c, t)  # first derivatives

pts_y = np.gradient(y_c, t)

pts_xx = np.gradient(pts_x, t)  # second derivatives

pts_yy = np.gradient(pts_y, t)

获得导数后,我使用以下代码将导数 x_prim、x_prim_prim、y_prim、y_prim_prim 放入另一个数据帧中:


d = pd.DataFrame({'x_prim': pts_x, 'y_prim': pts_y, 'x_prim_prim': pts_xx, 'y_prim_prim':pts_yy})

在数据框中包含所有内容之后,我正在为数据框的每一行调用函数,以使用以下代码在该点获得曲率:


# Getting the curvature at each point

for i in range(len(d)):

    temp = d.iloc[i]

    c_temp = f(temp)

    curv.append(c_temp)


慕婉清6462132
浏览 208回答 2
2回答

收到一只叮咚

您没有具体指定参数的结构是什么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 derivativespts_y = np.gradient(y, t)pts_xx = np.gradient(pts_x, t)  # second derivativespts_yy = np.gradient(pts_y, t)然后从那里继续。您不再需要这些t值来计算曲率,这是您正在使用的公式的要点。请注意,gradient它并不是真正设计用于计算二阶导数,并且绝对不应该用于计算三阶或更高阶导数。这些需要更复杂的公式。Numpygradient使用“二阶精确中心差分”,这对于一阶导数非常好,对于二阶导数很差,对于高阶导数毫无价值。

守着一只汪

我认为您的问题是 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];&nbsp;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 <= piy'(x) = cos(x)y''(x) = -sin(x)k = sin(x)/(1+(cos(x))**2)**1.5现在你有了一个很好的曲率公式作为 x 的函数。如果要参数化它,请使用x(t) = pi*t for 0 <= t <= 1x'(t) = pix''(t) = 0看看您是否可以绘制这些图并让您的 Python 解决方案与之匹配。
随时随地看视频慕课网APP

相关分类

Python
我要回答