Matlab 使用trapz查找曲线下的面积

Matlab 使用trapz查找曲线下的面积,matlab,numerical-integration,Matlab,Numerical Integration,我试图用它来找到曲线下的面积 Myx数据表示日期时间,Myy数据表示加速度为af(x)。加速计读数为SI形式 x(HH:mm:ss.SSS)内的示例数据: y范围内的示例数据(加速计值*9.81): 当我输入以下命令时(使用整个数据数组): 我得到一个持续时间数组,如下所示: velocity = duration 00:00:13 我不太确定我是否理解00:00:13的含义。当我计算速度时,我希望看到9.81米/秒或5米/秒。我是否误用了该函数,还是应该将duration数

我试图用它来找到曲线下的面积

My
x
数据表示日期时间,My
y
数据表示加速度为a
f(x)
。加速计读数为SI形式

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

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

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

我得到一个持续时间数组,如下所示:

velocity = 
    duration
    00:00:13

我不太确定我是否理解00:00:13的含义。当我计算速度时,我希望看到9.81米/秒或5米/秒。我是否误用了该函数,还是应该将duration数组转换为其他对象类型?

在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
    的梯形,持续1min=60秒:
    60*(1+2)/2=60*1.5=90米/s
  • 2m/s^2
    4m/s^2
    持续1min=60秒的梯形:
    60*(2+4)/2=60*3=180 m/s

  • 我们对结果的梯形区域求和:
    90+180=270
    。这就是为什么在使用真实数据之前最好使用一个简单的示例进行验证。

    MATLAB没有“意识到”y轴是加速度,只是在
    trapz
    计算过程中,你有一些单位datetime乘以标量。。。如果没有我们可以复制的例子,很难告诉你13秒与预期结果的关系。@Wolfie gotcha。当然,我用一个小例子更新了这个问题。那么得到实际速度可能需要9.81*13秒?请注意,更好的例子有两个特点:1。它实际上给出了您也引用的结果(使用这三个值不会产生13秒)。2.我们实际上可以复制和粘贴代码来运行和调整它。类似于
    x=datetime({'00:00','00:01','00:02','inputformat','HH:mm');y=[1,2,4]产生的
    trapz
    持续时间为4分钟30秒。创建这样的简单示例也可以帮助您自助,因为它可以提高对简单数字的理解,您可以用这些数字进行手工计算。@Wolfie我同意。当我知道问题所在时,我通常会做得更好。这对我来说只是一个曲线球。谢谢你的帮助。对我来说,使用“速度”公式,在给定速度(加速度积分)的情况下,计算从起点到终点的行驶距离是有意义的。这对你有意义吗?我不知道你指的是什么速度公式。。。通过将加速度与时间积分,你基本上是在
    处做
    v=u+,假设你的初始速度
    u
    为0,并且
    a
    不是常数,所以你需要一个积分。将其他用于距离etcspeed公式:速度=距离/时间。所以用这个公式,速度是abs(速度),时间是经过的时间。所以我们可以解距离,不是吗?只有当你的速度是恒定的,它不是,或者你不需要积分(可变)加速度来近似它时,这个公式才有效。您需要另一个积分。参考我的上一个链接,您需要在^2处积分w.r.t
    t
    来代替乘法,因为
    a
    不是常数。或者在一个环路中的多个位置近似计算速度,并以此方式估计距离。
    velocity = 
        duration
        00:00:13
    
    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
    
    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