cumtrapz()是否有高阶版本?(涉及IT技术)

4

介绍

假设我有 N 个点,其函数值为 f(1:N),例如:

x(1:N) 点如下:
x = [ 0.0795, 0.1327, 0.1395, 0.5133, 0.6470, 0.7358, 0.7640 ];
f = [ 0.0388, 0.4774, 0.4547, 0.0784, 0.3241, 0.2818, 0.9667 ];

我希望使用这些数据计算 f 相对于 x 的累积积分。

低阶解决方案

在MATLAB中,我可以轻松使用cumtrapz()来完成:

>> result = cumtrapz( x, f )

result =

     0    0.0137    0.0169    0.1165    0.1434    0.1703    0.1879

问题

很不幸,cumtrapz()使用梯形法进行数值积分,这对我的目的来说是不够的。

更高阶的方法存在,如辛普森规则,但据我所知,在MATLAB文件交换处或其他任何地方没有执行非均匀网格的累计辛普森规则的函数。

是否已经存在cumtrapz()的更高阶版本?如果不存在,我需要怎么做才能自己实现它?


3
虽然这并不直接回答你的问题,但如果你有函数本身(而不仅仅是它的值),你可以使用 integral 函数,该函数使用自适应的数值积分方法。 - Luis Mendo
是的,我需要在没有函数的情况下近似计算积分 - 只有数值。 - jvriesem
1个回答

4
我不知道其他的方法,但你可以使用插值法与 pchipspline 或其他方法来增加分辨率。然后使用 cumtrapz 来获得更接近数值积分的近似值。
选择适用于您函数的方法需要由您自行决定。
以下是使用正弦函数和样条插值的示例:
>> x = linspace(0,pi,5);
>> f = sin(x);
>> intF = cumtrapz(x,f);
error = 2-intF(end)
error =
    0.1039

>> x2 = linspace(x(1),x(end),numel(x)*10); %Up sample by 10x
>> f2 = interp1(x,f,x2,'spline');   %Interpolate with spline
>> intF2 = cumtrapz(x2,f2);
>> error = 2-intF2(end)  %MUCH LESS ERROR
error =
   -0.0038

enter image description here


这似乎最适用于像二阶分段多项式一样的函数,对吗?换句话说,可以认为对于具有显着高阶导数的函数,它的精度会更低,对吗? - jvriesem
1
spline和pchip都是分段三次函数,但是如果您有一个更高阶的函数和足够慢的采样率,以至于样本之间存在很大偏差,那么我认为您可能会得到不太准确的结果...我的评论是...如果是这种情况,请增加采样率,这样您就不会错过数据中的剧烈波动。 https://blogs.mathworks.com/cleve/2012/07/16/splines-and-pchips/ - Aero Engy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接