自动和数学地计算曲线的"弯头"

Jie*_*Jie 19 math curve

曲线的一个示例如下所示.肘部点可能是x = 3或4.如何自动和数学地计算曲线的肘部?

替代文字

Chr*_*lor 13

您可能希望查找具有最大绝对二阶导数的点,对于一组离散点x[i],您可以使用中心差异来近似:

secondDerivative[i] = x[i+1] + x[i-1] - 2 * x[i]

如上所述,你真正想要的是具有最大曲率的点,但是二阶导数会这样做,并且这个中心差异是二阶导数的良好代理.

  • 提供的数据是嘈杂的。你需要比这更小心。例如,您的建议可能确定 x=12 或 x=19。 (2认同)
  • 你能解释一下这种近似值在什么条件下是一个不错的估计值,在什么条件下会有所改变? (2认同)
  • “您真正想要的是具有最大曲率的点,但是二阶导数可以。” 关于曲率的点似乎是正确的,但是二阶导数将永远不会做(也许永远不会做):考虑一下exp(-x)之类的函数-它有点弯头,但其二阶导数没有任何事件远似人期望肘部位置的最大值。 (2认同)

Kev*_*vin 10

我创建了一个试图实现Kneedle算法的Python .

要重新创建上面的函数并检测最大曲率点:

x = range(1,21)
y = [0.065, 0.039, 0.030, 0.024, 0.023, 0.022, 0.019, 0.0185, 0.0187,
     0.016, 0.015, 0.016, 0.0135, 0.0130, 0.0125, 0.0120, 0.0117, 0.0115, 0.0112, 0.013]

kn = KneeLocator(
    x,
    y,
    curve='convex',
    direction='decreasing',
    interp_method='interp1d',
)

print(kn.knee)
7
Run Code Online (Sandbox Code Playgroud)
import matplotlib.pyplot as plt
plt.xlabel('x')
plt.ylabel('f(x)')
plt.xticks(range(1,21))
plt.plot(x, y, 'bx-')
plt.vlines(kn.knee, plt.ylim()[0], plt.ylim()[1], linestyles='dashed')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述