【问题标题】:Is there a higher-order version of cumtrapz()?是否有 cumtrapz() 的高阶版本?
【发布时间】:2018-04-30 13:18:38
【问题描述】:

简介

假设我有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 File Exchange 或其他任何地方,没有针对非均匀网格执行辛普森规则的累积版本的函数。

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

【问题讨论】:

  • 这并不能真正回答你的问题,但如果你有函数(不仅仅是它的值),你可以使用integral,它使用自适应求积法
  • 是的,我需要在没有函数的情况下近似积分 - 只是值。

标签: matlab numerical-integration


【解决方案1】:

我不知道其他方法,但是您可以使用带有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

【讨论】:

  • 看起来这对于像二阶分段多项式一样的函数来说效果最好,对吧?换句话说,假设它对于具有显着高阶导数的函数不太准确是否正确?
  • spline 和 pchip 都是三次分段的,但是是的,我想如果你有更高阶的函数和足够慢的采样率,以至于样本之间有很多偏差,你可能会期望不太准确的结果。 ..我对此的评论是......如果是这种情况,请增加采样率,这样您就不会错过数据中的剧烈波动。 blogs.mathworks.com/cleve/2012/07/16/splines-and-pchips
猜你喜欢
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 2011-12-08
  • 2011-10-18
  • 2011-11-05
相关资源
最近更新 更多