【问题标题】:how to make a smooth plot in matlab如何在matlab中绘制平滑图
【发布时间】:2012-10-10 21:42:32
【问题描述】:

我有大约 100 个数据点,它们大部分都满足某个功能(但有些点是关闭的)。我想将所有这些点绘制成一条平滑的曲线,但问题是这些点分布不均匀。无论如何,这是为了获得平滑的曲线吗?我正在考虑在两者之间插入一些点,但我想到的唯一方法是在两个数据点之间线性插入一些人造点。但这会显示出一个非常奇怪的形状(比如一些尖角)。那么有更好的主意吗?谢谢。

【问题讨论】:

  • 您能否展示您的数据和/或原始数据图表?

标签: matlab interpolation


【解决方案1】:

如果您或多或少知道实际曲线应该是什么,您可以尝试将该曲线拟合到您的点(例如使用polyfit)。根据偏离的点数和距离,您可以使用最小二乘回归(这很容易开始工作)。如果异常值太多(或者它们太大/太小),您还可以使用robustfit 函数尝试稳健回归(例如最小绝对偏差拟合)。

如果您可以手动确定异常值,您还可以通过其他点拟合曲线以获得更好的结果,甚至可以在这些点上使用插值方法(例如 MATLAB 中的interp1)以获得更平滑的曲线。

【讨论】:

  • 是的,我也是这么想的,但问题是拟合函数没有紧密的形式,因为该函数是通过数值求解另一组方程得到的。
  • spline() 做分段曲线拟合怎么样?它会“平滑”出没有简单封闭形式基础函数的点序列。
  • 为了消除异常值,也许您可​​以构造一个最小生成树en.wikipedia.org/wiki/Minimum_spanning_tree,其权重与距离成正比,并剪掉任何只有一个连接距离超过某个阈值距离的节点下一个节点?然后您可以使用样条线/其他插值获得更平滑的结果。
  • @AndrewJanke:这可行,但我想interp1'spline' 参数也可以做到这一点。这两种方法的唯一缺点是您必须先选择异常值。
【解决方案2】:

如果您知道哪个函数描述了您的数据,稳健的拟合(例如使用ROBUSTFIT,或带有robust 选项的新的便捷函数NONLINEARMODEL)是一个很好的方法。数据中的异常值。

如果您不知道描述数据的函数,但想要一条不受异常值影响的平滑趋势线,根据我的经验,来自 File Exchange 的SMOOTHN 做得很好。

【讨论】:

    【解决方案3】:

    你看过平滑样条曲线的使用吗?类似于插值样条,但选择的节点和系数是为了最小化最小二乘误差函数。 Matlab central 提供了一个很好的实现,我已经成功使用它。

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多