Math 计算';肘部';自动地和数学地计算曲线

Math 计算';肘部';自动地和数学地计算曲线,math,curve,Math,Curve,曲线的一个示例如下所示。弯头点可能是x=3或4。 如何以数学方式自动计算曲线的弯头 像这样的函数通常是根据其形状调用的。它们出现在通过正则化解决不适定问题时 “弯头”点是曲线上具有最大绝对二阶导数的点。您真正想要的是具有最大绝对二阶导数的点。当斜率远小于1时,可以用二阶导数近似(正如@ebo指出的),但情况并非总是如此。您可能需要寻找具有最大绝对二阶导数的点,对于一组离散点x[i],如您所见,可以用中心差近似表示: 二阶导数[i]=x[i+1]+x[i-1]-2*x[i] 如上所述,您真正想要的

曲线的一个示例如下所示。弯头点可能是x=3或4。 如何以数学方式自动计算曲线的弯头


像这样的函数通常是根据其形状调用的。它们出现在通过正则化解决不适定问题时


“弯头”点是曲线上具有最大绝对二阶导数的点。

您真正想要的是具有最大绝对二阶导数的点。当斜率远小于1时,可以用二阶导数近似(正如@ebo指出的),但情况并非总是如此。

您可能需要寻找具有最大绝对二阶导数的点,对于一组离散点
x[i]
,如您所见,可以用中心差近似表示:

二阶导数[i]=x[i+1]+x[i-1]-2*x[i]


如上所述,您真正想要的是具有最大曲率的点,但是二阶导数就可以了,这个中心差异是二阶导数的一个很好的代理。

我创建了一个Python,它试图实现

要重新创建上述函数并检测最大曲率点,请执行以下操作:

x=范围(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=定位仪(
x,,
Y
曲线“=”凸“,
方向='递减',
interp_方法='interp1d',
)
印花(千牛膝)
7.
导入matplotlib.pyplot作为plt
plt.xlabel('x')
plt.ylabel('f(x)')
plt.xticks(范围(1,21))
plt.绘图(x,y,'bx-')
plt.vlines(kn.knee,plt.ylim()[0],plt.ylim()[1],linestyles='虚线')

更新
Kneed使用改进的样条拟合方法处理局部极小值,使用
interp\u method='polymone'

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')

您可以在此处询问:。但是在任何情况下,你都需要提供一些关于曲线是如何产生的,以及它可能的形状的上下文。这个问题有一个很好的答案。查看我发布的可能重复的链接。在曲线()上找到最佳折衷点的解决方案是一个很好的建议。但是,此解决方案取决于曲线上的点。我接受@ebo和@Chris Taylor的建议,寻找具有最大绝对二阶导数的点,对于一组离散点x[I],如我所见,用中心差近似:二阶导数(I)=x(I+1)+x(I-1)-2*x(I);[max,idx]=max(二阶导数);但m甚至不是1。提示:查看轴刻度。提供的数据有噪音。你需要更加小心。例如,您的建议可能会确定x=12或x=19。谢谢您的建议。我把你的想法作为我的解决方案。嗨,克里斯,你给了我一个很好的答案。你能告诉我这个解决方案是否有参考资料吗?我想起草一篇论文,所以我需要一份这个解决方案的参考资料。你能解释一下在什么条件下这个近似值是一个合理的估计,在什么条件下会有很大的偏差吗?“你真正想要的是曲率最大的点,但是二阶导数可以。”。关于曲率的点似乎是正确的,但二阶导数并不总是这样(也许永远也不会这样):想想像exp(-x)这样的函数——它有点像肘部,但它的二阶导数没有任何事件与我们期望肘部位置的最大值相类似。是的,你的想法和克里斯·泰勒一样。谢谢。另一个问题是为什么“肘点”是曲线上具有最大绝对二阶导数的点?