使用 trapz 求曲线下面积
Using trapz to find the area under a curve
我正在尝试使用 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 的结果。我是在滥用函数还是应该将持续时间数组转换为不同的对象类型?
日期时间在 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
您期望加速度积分输出 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 个梯形:
- 梯形从
1m/s^2
到 2m/s^2
持续 1 分钟 = 60 秒:60*(1+2)/2 = 60*1.5 = 90 m/s
- 梯形从
2m/s^2
到 4m/s^2
持续 1 分钟 = 60 秒:60*(2+4)/2 = 60*3 = 180 m/s
我们对结果的梯形区域求和:90 + 180 = 270
正如预期的那样。这就是为什么最好在使用真实世界数据之前使用一个简单的示例进行验证。
我正在尝试使用 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 的结果。我是在滥用函数还是应该将持续时间数组转换为不同的对象类型?
日期时间在 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
您期望加速度积分输出 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 个梯形:
- 梯形从
1m/s^2
到2m/s^2
持续 1 分钟 = 60 秒:60*(1+2)/2 = 60*1.5 = 90 m/s
- 梯形从
2m/s^2
到4m/s^2
持续 1 分钟 = 60 秒:60*(2+4)/2 = 60*3 = 180 m/s
我们对结果的梯形区域求和:90 + 180 = 270
正如预期的那样。这就是为什么最好在使用真实世界数据之前使用一个简单的示例进行验证。