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米/秒。 t=8. 她保持这个速度4秒。 然后她开始减速到17.9,保持这个速度三秒钟,并继续不均匀地减速,直到她完全停止。

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

计算行驶距离

对于数值积分,我们将使用包 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]:

结论

我们应用了几个简单的函数来整合离散时间序列(测量速度的矢量),并获得了整个观察期间的行进距离以及如何克服每个时间间隔的曲线图。