我正在寻找与 matlab 的数值积分。我知道matlab中有一个trapz函数,但是精度不够好。通过在线搜索,我发现那里有一个四元函数,它似乎只接受符号表达式作为输入。我的数据都是离散的、一维的。有什么方法可以在我的数据上使用四元吗?谢谢。
你的问题的答案是否定的。在 Matlab 中对没有表达式的数据进行数值积分的唯一方法是使用
trapz
函数。如果它对你来说不够准确,请尝试编写你自己的四元函数,就像Li-aung所说的那样,它非常简单,this可能会有所帮助。
您可以尝试的另一种方法是使用强大的曲线拟合工具
cftool
进行拟合,然后使用可以对integrate
对象进行操作的cfit
函数(它有一个奇怪的约定,上限是第一个参数!)。我认为您不会得到比trapz
更准确的答案,这取决于合身程度。
使用 MATLAB 中的样条函数对数据进行插值,然后积分该数据。这是以离散形式集成数据的标准方法。
如果您首先创建一个在其中插入数据的函数,则可以使用
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
一个变量的函数积分是计算函数图形曲线下的面积。对于这个答案,我将把令人讨厌的函数和极端情况以及所有困扰数值积分例程的作者的曲折放在一边,其中大多数可能与这里无关。
辛普森规则是一种对函数进行数值积分的方法,您有一个代码可以在函数域内的点处计算函数的值。这与这里无关。
假设您的数据代表定期收集的值的时间序列。然后,您可以将数据绘制为具有等宽条形的直方图。您寻求的被积函数是直方图中您感兴趣的限制之间的条形面积之和。
您应该能够将此方法应用于 x 轴(即直方图中条形的宽度)不显示时间的数据集、条形不等宽的情况、数据穿过 x 轴,并且是最合理的数据集,非常容易。
数据的离散化限制了您可以获得的结果的准确性。例如,如果您的时间序列以 1 秒的间隔进行采样,则无法通过这种方法在不是整数秒的间隔上进行积分。但是,您实际上没有数据可以通过任何方法更准确地计算数字。当然,您可以使用 Matlab(或其他任何东西)生成额外的精度数字,但它们没有任何意义。