Engee 文档
Notebook

数值积分

在本例中,我们将学习如何对速度测量矢量进行积分,并推断出行进的距离。

让我们研究初始数据

假设我们有一个在不同时间点测量车速的向量。

In [ ]:
vel = [ 0, .45, 1.79, 4.02, 7.15, 11.18, 16.09, 21.90, 29.05, 29.05,
        29.05, 29.05, 29.05, 22.42, 17.9, 17.9, 17.9, 17.9, 14.34, 11.01,
        8.9, 6.54, 2.03, 0.55, 0 ];
vTime = 0:24;

数据记录的时间间隔相等(每秒,连续 24 秒)。让我们画出观察到的过程图:

In [ ]:
gr()
plot( vTime, vel, title="Скорость автомобиля", markershape=:star8,
      xlabel="Время, с", ylabel = "Скорость, м/с", legend=false )
Out[0]:

正斜率对应汽车加速的时间间隔,水平的平面图对应匀速运动,负斜率对应刹车的时间间隔。在时间t=0 时,汽车处于静止状态,此时的速度等于 0 m/s。汽车加速,直到在大约t=8 时达到 29.05 米/秒的最大速度。该速度保持了 4 秒钟。然后开始减速至 17.9 米/秒,保持这一速度 3 秒钟,并继续不均匀制动至完全停止。

这条曲线很难用一个连续函数来描述,因为它有很多导数不连续。

让我们计算一下路程

为了进行数值积分,我们将使用Trapz 软件包,其设置如下:

In [ ]:
]add Trapz

该软件包中的函数trapz 采用梯形法对离散时间序列进行积分。这种方法非常适合具有明显可观测不连续性的数据,并假定系统的动态在两点之间呈线性变化。

为了说明这种方法的思路,让我们用数据在图形上画一些梯形:

In [ ]:
plot( vTime, vel, title="Скорость автомобиля", markershape=:star8,
      xlabel="Время, с", ylabel = "Скорость, м/с", legend=false )
plot!( vTime, vel, fillrange=zeros(length(vel)), fillcolor=:blue, label=:none, lw=2, lc=:black )
for i in 1:length(vTime)
    plot!( [vTime[i],vTime[i]], [0,vel[i]], lw=2, lc=:black )
end
plot!()
Out[0]:

利用函数trapz ,我们可以通过计算每个区间下梯形的面积之和,计算出任意分段线性曲线下的面积。

让我们用数值积分来计算汽车在观察时间内行驶的距离(图中整个彩色区域的面积)。

In [ ]:
using Trapz
distance = trapz( vTime, vel )
Out[0]:
345.2199999999999

因此,在 24 秒内,汽车行驶了 345.22 米。

让我们画出行驶距离的曲线图

NumericalIntegration 库中,还有一个对我们有用的函数 -cumul_integrate

In [ ]:
]add NumericalIntegration

该函数cumul_integrate 也执行数值积分,但返回的不是整条曲线下的面积,而是初始值在每个观测点的累计和。

In [ ]:
using NumericalIntegration: cumul_integrate
cdistance = cumul_integrate( vTime, vel );

我们已经计算出了汽车从原点到每个时间戳所行驶的距离,现在我们来绘制曲线图。

In [ ]:
plot( cdistance, title = "Расстояние, пройденное автомобилем",
      xlabel = "Время, с", ylabel = "Расстояние (м)", legend=false )
Out[0]:

结论

我们用几个简单函数对离散时间序列(测量速度矢量)进行了整合,得到了整个观测时间内的行驶距离,以及每个时间间隔内的克服距离图。