【问题标题】:Finding the Inflection Point寻找拐点
【发布时间】:2013-06-23 19:49:36
【问题描述】:

我目前有两组数据,一个 x 轴和一个 y 轴,我需要找到它从正斜率变为负斜率的点。有没有在 VBA 中找到该数据或在 excel 中找到函数?

【问题讨论】:

  • 如果数据本身不是连续的,则不能将斜率描述为平滑函数。此外,拐点不是斜率从正变为负,而是曲率从上升变为下降。您在问题中描述的基本上是局部最小值/最大值。
  • 对不起,我的措辞有点不对劲。我确实想找到曲率从上升到下降的拐点。抱歉,我的数学有点生疏
  • 只需找到单元格之间的变化(y 的变化除以 x 的变化),然后找到变化之间的变化(再次除以 x 的变化)来得到你的曲率。当它为 0 时,它接近拐点(考虑到数据是离散的,而不是连续的)
  • 不是拐点,而是局部极值(最小值或最大值)。拐点是曲率转换符号时,而不是斜率。
  • 这一切都取决于数据的样子。有噪音吗?它可以适合模型吗?最通用的方法是生成三次样条插值并找到二阶导数切换符号的位置。

标签: excel vba math


【解决方案1】:

您可以 - 作为近似值 - 计算每对后续线的 DeltaY / DeltaX 并检查其符号的变化。

示例(从 [A1] 开始 - 将所有公式从其起始单元格复制下来)

[B2] =A2^3-A2
[C3] =(B3-B2)/(A3-A2)
[D3] =SIGN(C3)
[E4] =IF(D4<>D3;"beep";"")

X       X^3-x   DY/DX  SIGN(F'(x))  change
-1      0           
-0,9    0,171    1,71   1   
-0,8    0,288    1,17   1   
-0,7    0,357    0,69   1   
-0,6    0,384    0,27   1   
-0,5    0,375   -0,09   -1      beep
-0,4    0,336   -0,39   -1  
-0,3    0,273   -0,63   -1  
-0,2    0,192   -0,81   -1  
-0,1    0,099   -0,93   -1  
0       0       -0,99   -1  
0,1     -0,099  -0,99   -1  
0,2     -0,192  -0,93   -1  
0,3     -0,273  -0,81   -1  
0,4     -0,336  -0,63   -1  
0,5     -0,375  -0,39   -1  
0,6     -0,384  -0,09   -1  
0,7     -0,357  0,27     1      beep
0,8     -0,288  0,69     1  
0,9     -0,171  1,17     1  
1       0   1,71     1  
1,1     0,231   2,31     1  

斜率的变化发生在相对最大值或最小值(第一微商等于 0)

【讨论】:

  • 这仅在斜率从正变为负时才有效。
  • 为什么? E 列检测到 dy/dx 的任何符号变化...即两个数据点之间的任何奇数相对极端值...对于(离散)“数据集”具有所有限制...查看 x=- 0.5 和 x=0.7
【解决方案2】:

如果数据中有任何噪音,计算差异会放大噪音,因此找到虚假拐点的机会更大。降低噪声的一种方法是对数据拟合曲线,然后计算该曲线的拐点。例如。将三次多项式拟合到数据中,并找到它的拐点。

【讨论】:

    【解决方案3】:

    我可以建议通过使用回归来做到这一点。不是线性的,而是典型的多阶回归,AKA 多项式回归 (y = a_0 + a_1*x + a_2*x^2 + ... + a_n*x^n)。 See this thread for more details on how to do it. 这可以直接在 Excel 中完成,无需在 VBA 中编写任何代码。但是,您可能需要处理数组公式(也称为 CTRL+ Enter 公式)。

    然后,一旦您找到了适合您的分布的回归(r² > 0.9 或适合您的),您可以简单地对该等式进行导数。因为这是一个多项式方程,所以方程很简单:y' = a_1 + 2*a_2*x + ... + n*a_n+1

    有趣的部分现在开始了!我们需要找出x 的哪些值构成y = 0。如果您的回归低于 4 阶,则可能存在解析解(即,有一个方程可以为您提供 x 值,因为您的导数将是 3 阶)。如果你超过 4 阶,那么,你需要使用数值方法。是的,您可以使用 VBA 进行二分算法,但您知道 Excel has a numerical solver integrated 吗?使用它来获取您正在寻找的值(假设至少一个值是真实的)。

    由于您没有提供数据集的示例,这虽然可以理解,但如果我们使用 MikeD 示例,我们会得到这个!

    使用值,而不是公式:

    【讨论】:

      【解决方案4】:

      一般而言,您可以做的最好的事情是使用有限差分来逼近二阶导数并找到符号变化的位置。

      给定两列XY,使用以下公式估计远离末端的二阶导数Ypp。假设 x 值以固定值 h

      递增

      X Y ≈Ypp
      x_1 y_1
      x_2 y_2 =(y_3-2*y_2+y_1)/(h*h)
      x_3 y_3

      拐点是二阶导数转换符号的地方。您可以简单地找到两个连续值与负值相乘的位置ypp_2*ypp_1 &lt;= 0

      如果您想要更高的精度,那么您需要为数据拟合模型,或者使用三次样条。

      请注意,如果 X 数据的间隔不相等,则必须使用下面更复杂的公式

      【讨论】:

        猜你喜欢
        • 2012-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 2015-03-21
        • 2021-11-22
        相关资源
        最近更新 更多