我有一个数据集(一个包含 x 和 y 值的数组),我最终想要拟合非线性模型。为了增加拟合良好和模型收敛的机会,我想提供尽可能接近解的初始参数。我要拟合的模型参数之一对应于曲线的拐点。有没有办法可以在 Matlab 中估计离散数据集(不是连续函数)的拐点?我不想事先进行曲线拟合,因为这是为了加速曲线拟合并增加其成功的可能性。
问问题
3063 次
1 回答
2
这个想法是分两步工作:
首先定义什么是噪声级别,并将 (
x
,y
) 折线“简化”为某个“平滑”子集 (xs
,ys
)。简化后,曲线特征的每一次变化都将被认为是显着的。寻找折线 (
xs
,ys
) 的凸度变化。
对于第一点,您可以使用此处实现的Douglas-Peucker算法。
第二个点基于由折线的 3 个连续点构成的带符号区域:
| x0 y0 1 |
1 | |
A = - | x1 y1 1 |
2 | |
| x2 y2 1 |
折线是“凸的”——即正曲率——这些区域为正,而“凹”——即负曲率——当该区域为负时。曲率的变化就是拐点所在的地方。
从 File Exchange下载dpsimplify
函数后,您可以运行以下代码(假设x
和y
向量已经存在):
%// 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 回答