Excel 寻找拐点

Excel 寻找拐点,excel,vba,math,Excel,Vba,Math,我现在有两组数据,一个x轴和y轴,我需要找到它从正斜率变为负斜率的点。是否有办法在VBA或excel中的函数中找到该数据?作为近似值,您可以为随后的每对行计算DeltaY/DeltaX,并检查其符号的变化 示例(从[A1]开始-从起始单元格向下复制所有公式) [B2]=A2^3-A2 [C3]=(B3-B2)/(A3-A2) [D3]=符号(C3) [E4]=如果(D4D3;“嘟嘟”声) X^3-X DY/DX符号(F'(X))变化 -1 0 -0,9 0,

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

作为近似值,您可以为随后的每对行计算DeltaY/DeltaX,并检查其符号的变化

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

[B2]=A2^3-A2
[C3]=(B3-B2)/(A3-A2)
[D3]=符号(C3)
[E4]=如果(D4D3;“嘟嘟”声)
X^3-X DY/DX符号(F'(X))变化
-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 0375-0,09-1哔哔声
-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-0357 0,27 1嘟嘟声
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)

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

我建议使用回归法。不是线性回归,而是典型的多阶回归,又称多项式回归(
y=a_0+a_1*x+a_2*x^2+…+a_n*x^n
)。这可以直接在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来运行对分算法,但您知道吗?使用它来获取您要查找的值(假设至少有一个值是真的)

由于您并没有提供数据集的示例,这是一个数字,但若我们使用MikeD示例,我们会得到这个

使用值,而不是公式:


如果数据本身不是连续的,则不能将斜率描述为平滑函数。此外,拐点不是坡度从正变为负,而是曲率从向上变为向下。你在问题中所描述的基本上是当地的最低/最高限额。对不起,我的措辞有点不恰当。我想找到曲率从上升到下降的拐点。对不起,我的数学有点生疏了。只要找到单元格之间的变化(y的变化除以x的变化),然后找到变化之间的变化(再次除以x的变化),就可以得到曲率。当oes为0时,它接近拐点(考虑到数据是离散的,而不是连续的),不是拐点,而是局部极值(最小值或最大值)。拐点是曲率转换符号,而不是斜率。只有当斜率从正变为负时,拐点才起作用。为什么?E列检测到dy/dx的任何符号变化。。。i、 e.两个数据点之间的任何奇数个相对极值。。。尽管这对(离散的)“数据集”有各种限制。。。看看x=-0.5和x=0.7
[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