使用trapz找到曲线下面积

时间:2018-05-18 03:06:06

标签: matlab numerical-integration

我正在尝试使用trapz来查找曲线下方的区域。

我的x数据代表日期时间,而我的y数据代表加速f(x)。加速度计读数采用SI的形式。

x中的示例数据(HH:mm:ss.SSS):

'01:06:48.330'
'01:06:48.352'
'01:06:48.374'

y内的示例数据(加速度计值* 9.81):

8.73750256159470
8.59619296907904
8.63520263017352

当我输入以下命令(使用整个数据数组)时:

velocity = trapz(x,y);

我找回一个持续时间数组,如下所示:

velocity = 
    duration
    00:00:13

我完全不确定我理解00:00:13的含义。当我计算速度时,我希望看到类似9.81 m / s或5m / s的东西。我是否滥用该功能,还是应该将持续时间数组转换为其他对象类型?

2 个答案:

答案 0 :(得分:1)

MATLAB中的日期时间通常很棘手。在进行任何积分之前,我会将其转换为秒。这是一个示例解决方案。

x=['01:06:48.330'; '01:06:48.352'; '01:06:48.374'];
datetime(x,'Format','HH:mm:ss.SSS');
secvec = datevec(x);
secvec = 3600*secvec(:,4)+60*secvec(:,5)+secvec(:,6); % times measured in seconds

y = [8.73750256159470; 8.59619296907904; 8.63520263017352]; % accelerations in m/s^2
trapz(secvec,y)
>> ans = 0.380216002428058 % Gained velocity, measured in m/s

答案 1 :(得分:1)

您希望m/s输出积分加速的原因仅仅是因为您正在进行涉及(m/s^2)*s的特定计算,即y轴* x轴。

让我们使用一个简单的例子,我们先将其转换为秒,然后进行整合。

x = datetime( {'00:00', '00:01', '00:02'}, 'inputformat', 'HH:mm' ); % Time
y = [1 2 4]; % Acceleration (m/s^2)

x_elapsed_seconds = datenum(x-min(x))*24*60*60; % Datenum returns days, convert to secs

z = trapz( x_elapsed_seconds, y ); % Velocity = 270 m/s

我们可以验证,对于这个例子,270m / s是正确的,因为计算中只有2个梯形:

  1. 1m/s^22m/s^2的梯形持续1分钟= 60秒:60*(1+2)/2 = 60*1.5 = 90 m/s
  2. 2m/s^24m/s^2的梯形持续1分钟= 60秒:60*(2+4)/2 = 60*3 = 180 m/s
  3. 我们对结果的梯形区域求和:90 + 180 = 270按预期方式。这就是为什么在使用真实世界数据之前,最好使用一个简单的验证示例。