Math 确定直线坡度更改的位置(算法)

Math 确定直线坡度更改的位置(算法),math,Math,如果你把下面的数字画出来,你会得到一个“波动微笑”:这个 数字跟随一个线性坡度(左坡度),然后更改为 遵循另一个线性坡度(右坡度) 我有几组这样的数据,想知道坡度在哪里 变化。注: 坡度变化通常发生在点之间 我不知道有多少点具有左斜率,有多少点具有左斜率 正确的坡度 对于坡度或坡度的符号/大小没有任何保证 斜坡之间的关系。每个坡度可能为负或负 肯定的,两个都可能比另一个大 如果坡度相同,程序应将其报告为 特例 0.1613 0.1596 0.1579 0.1561 0.1544 0.1528

如果你把下面的数字画出来,你会得到一个“波动微笑”:这个 数字跟随一个线性坡度(左坡度),然后更改为 遵循另一个线性坡度(右坡度)

我有几组这样的数据,想知道坡度在哪里 变化。注:

  • 坡度变化通常发生在点之间

  • 我不知道有多少点具有左斜率,有多少点具有左斜率 正确的坡度

  • 对于坡度或坡度的符号/大小没有任何保证 斜坡之间的关系。每个坡度可能为负或负 肯定的,两个都可能比另一个大

  • 如果坡度相同,程序应将其报告为 特例

0.1613 0.1596 0.1579 0.1561 0.1544 0.1528 0.1511 0.1495 0.1478 0.1462 0.1446 0.1431 0.1415 0.1416 0.1418 0.1419 0.1421 0.1422 0.1424 0.1425 0.1426 0.1428 0.1429 0.1431
创建一个新的数字列表,它是该列表中连续对的差值。这些差异是从一点到下一点的“斜率”。对于恒定坡度,这些数字都是相同的。这将问题从检测坡度变化更改为检测标高变化

Slope(X) = f(x) - f(x-1)
Slope2(x) = Slope(x) - Slope(x-1)
你需要第二个。它显示坡度本身的变化速度。(物理学方面的加速) 我在excel中绘制了这两个图,并检查了我的数据:


你看到斜坡的顶峰了吗?这是一个指标,很容易找到。

当数据被舍入/截断时,您应该定义相同斜率的含义。差异程度是否太大

如果只有一个实际坡度变化,则点之间可能发生这种变化,则有三种情况:

  • 坡度连续两次发生显著变化。例如,如果数据为6、5、4、3、3、4、5、6、7,则坡度将变为-1、-1、-1、0、1、1、1、1、1、1。这意味着实际坡度变化在中间坡度点、示例中的零或3之间。要获取坡度真正发生变化的点,需要获取最后两点(示例中为4,3)定义的直线与下两点(示例中为3,4)定义的直线相交的点。该示例给出了解决方案[4.5,2.5]

  • 坡度仅发生一次显著变化。例如,如果数据为7、6、5、4、3、4、5、6、7,则坡度将变为-1、-1、-1、1、1、1、1、1。这意味着实际坡度变化位于两个坡度的坐标点(示例中为3)

  • 坡度变化不大。这就是你提到的特例


  • 衍生品再次出现。以防你或其他人没有意识到这一点

    微积分的基础文本应该可以帮助你分析你的函数

    导数产生函数切线的斜率

    积分产生线下的面积

    正如前面的答案所暗示的,如果f(x)是“位置”,那么f[f'(x)]的导数就是速度,而[f'(x)]的导数就是加速度


    您还可以从表示f''(x)的数据向后计算速度和相对于时间的位置。

    问题有两个部分:

  • 将数据点分为两组;那些在左边的,那些在右边的
  • 在两组中的每一组中安装一条线
  • 第二个问题很简单,并且有一个标准的解决方案:使用线性最小二乘法拟合直线

    如何解决第一个问题将取决于应用程序的具体情况。这里有一个非常简单的算法,如果数据点的数量n不太大,它可以很好地工作:只需对第一个i点和最后的n-i点进行线性最小二乘,使i从2到n-2,并保持残差平方和最小的一个

    如果n非常大,而上面的方法效率很低,那么您必须查看离散二阶导数,正如其他已发布的答案所建议的那样。请注意,与最小二乘拟合不同,导数的近似值对即使少量的噪声也非常敏感


    一旦有了两条拟合线,就可以使用一些启发式方法(即斜率差小于某个公差)来确定是否有单线特例。

    您真的想要交换两个点吗?类似于:斜率(x)=f(x)-f(x-1)和计算斜率2的相同调整?你可以从图表中了解到这一点;当蓝色坡度图上升时,红色坡度2下降。@Dan您是100%正确的,但对于坡度2,我们得到的是相同的图形,因此这不是非常严重的错误:)
    Slope(X) = f(x) - f(x-1)
    Slope2(x) = Slope(x) - Slope(x-1)