是否有更高版本的cumtrapz()?

时间:2017-11-16 21:16:40

标签: matlab numerical-integration quad

简介

假设我有Nx(1:N),我的函数值为f(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()使用梯形方法进行数值积分,这对我的目的来说是不够的。

Higher-order methods exist,就像辛普森的规则一样,但据我所知,没有一个函数可以在MATLAB文件交换中或其他任何地方执行Simpson规则对非均匀网格的累积版本。

cumtrapz()的高阶版本是否已经存在?如果没有,我自己要做些什么呢?

1 个答案:

答案 0 :(得分:3)

我不知道另一种方法,但您可以使用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