下面展示了曲线的一个例子。拐点可能是x=3或4。 如何通过自动化和数学方法来计算曲线的拐点?
下面展示了曲线的一个例子。拐点可能是x=3或4。 如何通过自动化和数学方法来计算曲线的拐点?
要重新创建上述函数并检测最大曲率点:
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
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')
更新
Kneed拥有一种更好的样条拟合方法来处理局部极小值,使用interp_method = 'polynomial'
。
kn = KneeLocator(
x,
y,
curve='convex',
direction='decreasing',
interp_method='polynomial',
)
print(kn.knee)
4
还有新的情节:
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')
x[i]
,可以使用中心差分来近似计算:
secondDerivative[i] = x[i+1] + x[i-1] - 2 * x[i]
如上所述,你真正想要的是曲率最大的点,但二阶导数足够,这种中心差分是二阶导数的很好代理。
你真正想要的是曲率最大的点(curvature)。当斜率远小于1时,这可以通过二阶导数来近似(正如@ebo所指出的那样),但并非总是如此。