在Matlab中求离散数据集的拐点

在Matlab中求离散数据集的拐点,matlab,dataset,inflection,Matlab,Dataset,Inflection,我有一个数据集(一个具有x和y值的数组),我最终希望将其拟合为一个非线性模型。为了增加拟合良好和模型收敛的机会,我希望提供尽可能接近解的初始参数。我要拟合的模型参数之一对应于曲线的拐点。有没有一种方法可以在Matlab中估计离散数据集(不是连续函数)的拐点?我不想事先进行curvefit,因为这是为了加速curvefit并增加其成功的概率。这个想法分两步进行: 首先定义噪声级,并将(x,y)多边形线“简化”为一些“平滑”子集(xs,ys)。简化后,曲线特征的每一个变化都将被认为是显著的 查找多边

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

这个想法分两步进行:

  • 首先定义噪声级,并将(
    x
    y
    )多边形线“简化”为一些“平滑”子集(
    xs
    ys
    )。简化后,曲线特征的每一个变化都将被认为是显著的

  • 查找多边形线的凸度变化(
    xs
    ys

  • 对于第一点,您可以使用已实现的算法

    第二个点基于由多段线的3个连续点构成的有符号区域:

          | x0   y0   1 |
        1 |             |
    A = - | x1   y1   1 |
        2 |             |
          | x2   y2   1 |
    
    当这些区域为正时,多段线为“凸”(即正曲率),当这些区域为负时,多段线为“凹”(即负曲率)。曲率的变化是拐点所在的位置

    从文件交换下载
    dpsimplify
    函数后,可以运行以下代码(假设
    x
    y
    向量已经存在):


    你的数据集是干净的,还是有噪音?我不会说它是完全干净的,因为它是实验性的。然而,它是根据许多中等噪声数据集的平均值计算出来的,所以你可以说噪声没有那么糟糕。谢谢!我去试试看。@CST链接-漂亮的帖子+1.@CST Link我应该在今天晚些时候或明天有实验数据来测试它。我会通知你的。@rayryeng谢谢你[脸红]。:-)@CST链接-工作正常:)非常感谢!
    %// 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);