寻找拐点

时间:2013-06-26 15:16:07

标签: excel vba math

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

4 个答案:

答案 0 :(得分:0)

您可以 - 作为近似值 - 计算每对后续行的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)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我可以建议通过回归来做到这一点。不是线性的,而是典型的多阶回归,即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 +输入公式)。

然后,一旦找到适合您的分布的回归(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的示例,我们会得到的!

用值代替公式:

答案 3 :(得分:0)

一般来说,您能做的最好的事情是使用有限差分来近似二阶导数,并找出改变符号的位置。

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

递增

figx

figy

<头>
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 <= 0 的位置。

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

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

figy2