数值积分¶
在本例中,我们将学习如何对速度测量矢量进行积分,并推断出行进的距离。
让我们研究初始数据¶
假设我们有一个在不同时间点测量车速的向量。
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]:
因此,在 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]:
结论¶
我们用几个简单函数对离散时间序列(测量速度矢量)进行了整合,得到了整个观测时间内的行驶距离,以及每个时间间隔内的克服距离图。