0

我有一个数据集(一个包含 x 和 y 值的数组),我最终想要拟合非线性模型。为了增加拟合良好和模型收敛的机会,我想提供尽可能接近解的初始参数。我要拟合的模型参数之一对应于曲线的拐点。有没有办法可以在 Matlab 中估计离散数据集(不是连续函数)的拐点?我不想事先进行曲线拟合,因为这是为了加速曲线拟合并增加其成功的可能性。

4

1 回答 1

2

这个想法是分两步工作:

  1. 首先定义什么是噪声级别,并将 ( x, y) 折线“简化”为某个“平滑”子集 ( xs, ys)。简化后,曲线特征的每一次变化都将被认为是显着的。

  2. 寻找折线 ( xs, ys) 的凸度变化。

对于第一点,您可以使用此处实现的Douglas-Peucker算法。

第二个点基于由折线的 3 个连续点构成的带符号区域:

      | x0   y0   1 |
    1 |             |
A = - | x1   y1   1 |
    2 |             |
      | x2   y2   1 |

折线是“凸的”——即正曲率——这些区域为正,而“凹”——即负曲率——当该区域为负时。曲率的变化就是拐点所在的地方。

从 File Exchange下载dpsimplify函数后,您可以运行以下代码(假设xy向量已经存在):

%// Part 1.
[ps,~] = dpsimplify([x(:),y(:)], 1e-3);  %// adjust "tol" above noise level
xs = ps(:,1);
ys = ps(:,2);

%// Part 2
I = 1:numel(xs)-2;
sgnA = sign( ...
    xs(I+0).*ys(I+1) ...
  + xs(I+1).*ys(I+2) ...
  + xs(I+2).*ys(I+0) ...
  - xs(I+0).*ys(I+2) ...
  - xs(I+1).*ys(I+0) ...
  - xs(I+2).*ys(I+1) ...
);
k_inflex = find(2 == abs(diff(sgnA)));
x_inflex = xs(k_inflex);
y_inflex = ys(k_inflex);
于 2015-06-02T14:47:49.193 回答