【问题标题】:Numerical integration using Simpson's Rule on discrete data使用辛普森法则对离散数据进行数值积分
【发布时间】:2012-04-10 12:08:21
【问题描述】:

我正在寻找与 matlab 的数值积分。我知道matlab中有一个trapz函数,但是精度不够好。通过在线搜索,我发现那里有一个 quad 函数,它似乎只接受符号表达式作为输入。我的数据都是离散的和一维的。这是在我的数据上使用 quad 的任何方式吗?谢谢。

【问题讨论】:

  • quad() 是辛普森法则的一种实现,它是高中数学。有什么阻止你自己实施辛普森的规则吗?
  • 是否只使用辛普森法则,我认为是自适应辛普森正交。但无论如何,我不知道为什么,quad 比我的实现快。我有很多数据要整合,正在寻找更快的方法。
  • 我的数值方法课程已经有几年了,但是 IIRC 常规辛普森规则和自适应类型之间的唯一区别是自适应辛普森规则应用了采样点的可变间距。由于您没有集成符号表达式,因此您无法更改采样间隔 - 您已经拥有数据并且无法在其之间插入更多点。因此,常规的辛普森规则将尽可能好。
  • 关于速度:您是否考虑过使用新版本 MATLAB 中提供的并行执行工具?并行 for 循环 parfor 非常易于使用,并且会将您的 CPU 负载分散到尽可能多的内核(或执行节点)上。

标签: matlab integration numerical


【解决方案1】:

您的问题的答案是否定的。在 Matlab 中对没有表达式的数据执行数值积分的唯一方法是使用 trapz 函数。如果对您来说不够准确,请尝试按照 Li-aung 所说的编写自己的四元函数,非常简单,this 可能会有所帮助。

您可以尝试的另一种方法是使用强大的曲线拟合工具cftool 进行拟合,然后使用可以对cfit 对象进行操作的integrate 函数(它有一个奇怪的约定,上限是第一个论点!)。我认为您不会得到比trapz 更准确的答案,这取决于合适的情况。

【讨论】:

    【解决方案2】:

    使用 MATLAB 中的 spline 函数对数据进行插值,然后对这些数据进行积分。这是以离散形式集成数据的标准方法。

    【讨论】:

      【解决方案3】:

      如果您首先创建一个插入数据的函数,则可以使用quadl() 来整合您的数据。

      function f = int_fun(x,xdata,ydata)
      f = interp1(xdata,ydata,x);
      

      然后将其提供给quadl() 函数:

      integral = quadl(@int_fun,A,B,[],[],x,y) % syntax to pass extra arguments
                                               % to the function
      

      【讨论】:

        【解决方案4】:

        一个变量的函数的积分是计算函数图形曲线下的面积。对于这个答案,我将撇开讨厌的函数和极端情况以及所有让数值积分例程编写者感到困惑的曲折,其中大部分可能与这里无关。

        辛普森规则是一种对函数进行数值积分的方法,您有一个代码可以在其域内的点处评估该函数。这在这里无关紧要。

        假设您的数据代表定期收集的时间序列值。然后,您可以将数据绘制为具有等宽条形的直方图。您寻求的被积函数是直方图中您感兴趣的限制之间的条形区域的总和。

        您应该能够将此方法应用于 x 轴(即直方图中条形的宽度)不显示时间的数据集、条形不等宽的情况、数据穿过 x 轴的位置,以及最合理的数据集,非常容易。

        数据的离散化限制了您可以获得的结果的准确性。例如,如果您的时间序列以 1 秒的间隔进行采样,则您无法通过这种方法在不是整数秒的间隔上进行积分。但是,您实际上并没有数据可以通过任何方法更准确地计算出一个数字。当然,您可以使用 Matlab(或其他任何东西)生成额外的精度数字,但它们没有任何意义。

        【讨论】:

        • 辛普森规则也可以用于固定样本点:例如,scipy has an implementation of it。此外,您描述的直方图是一个矩形近似值,理论上它甚至比连续函数的trapz 更差;对于大多数功能,即使使用固定样本,辛普森规则或 Romberg 积分等也绝对可以击败它。
        • 想想你知道你的函数是一个n-degree多项式的情况;那么n 或更多样本点足以完美了解该函数,从而获得无限的准确性,而您的主张是矩形近似是您可能做的最好的,这显然是错误的。虽然你通常不知道它是一个多项式,但连续性假设(例如 Stone-Weierstrass,它说 any 连续函数是多项式序列的极限)意味着更好的近似值会让你更好的结果。
        • @Dougal:如果您想对从中采样离散数据的函数做出毫无根据的假设,请继续。我做到了,我假设函数不是连续的或可微的。
        • 如果你不做任何连续性假设,数值积分是不可能的。你怎么知道那里没有一些可笑的小尖峰?你没有,除非你认为它不是。
        猜你喜欢
        • 2016-02-16
        • 1970-01-01
        • 2013-12-21
        • 2018-05-20
        • 2015-02-13
        • 2019-04-25
        • 1970-01-01
        • 2018-08-18
        • 2016-01-12
        相关资源
        最近更新 更多