是否有 cumtrapz() 的高阶版本?
Is there a higher-order version of cumtrapz()?
简介
假设我有 N
个点 x(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 文件交换或其他任何地方,没有一个函数可以针对非均匀网格执行辛普森法则的累积版本。
是否已经存在 cumtrapz() 的高阶版本?如果没有,我需要做什么才能自己实现?
我不知道其他方法,但是您可以使用 pchip
、spline
或其他方法的插值来提高分辨率。然后使用 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
简介
假设我有 N
个点 x(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 文件交换或其他任何地方,没有一个函数可以针对非均匀网格执行辛普森法则的累积版本。
是否已经存在 cumtrapz() 的高阶版本?如果没有,我需要做什么才能自己实现?
我不知道其他方法,但是您可以使用 pchip
、spline
或其他方法的插值来提高分辨率。然后使用 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