为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕婉清6462132 2022-01-11 20:22:35
我正在尝试在 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.288577pts_x = np.gradient(x_c, t)  # first derivativespts_y = np.gradient(y_c, t)pts_xx = np.gradient(pts_x, t)  # second derivativespts_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 pointfor i in range(len(d)):    temp = d.iloc[i]    c_temp = f(temp)    curv.append(c_temp)
查看完整描述

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使用“二阶精确中心差分”,这对于一阶导数非常好,对于二阶导数很差,对于高阶导数毫无价值。


查看完整回答
反对 回复 2022-01-11
?
守着一只汪

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 解决方案与之匹配。


查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号