Вы можете использовать алгоритм усреднения, при котором старые значения затухают линейно. Если S_n - это скорость в момент времени n, а A_ {n-1} - это среднее значение в момент времени n-1, определите свою среднюю скорость следующим образом.
A_1 = S_1
A_2 = (S_1 + S_2) / 2
A_n = S_n / (n-1) + A_ {n-1} (1-1 / (n-1))
В английском это означает, что чем дольше в прошлом проводилось измерение, тем меньше оно имеет значение, потому что его важность упала.
Сравните это с обычным алгоритмом усреднения:
A_n = S_n / n + A_ {n-1} (1-1 / n)
Вы также можете получить геометрическое затухание, которое очень сильно отразится на последних скоростях:
A_n = S_n / 2 + A_ {n-1} / 2
Если скорости 4,3,5,6, то
A_4 = 4,5 (простое среднее)
A_4 = 4,75 (линейный распад)
A_4 = 5,125 (геометрический распад)
Пример на PHP
Обратите внимание, что $n+1
(не $n
) - это число текущих точек данных из-за того, что массивы PHP индексируются с нулевым индексом. Чтобы соответствовать приведенному выше примеру, установите n == $n+1
или n-1 == $n
<?php
$s = [4,3,5,6];
// average
$a = [];
for ($n = 0; $n < count($s); ++$n)
{
if ($n == 0)
$a[$n] = $s[$n];
else
{
// $n+1 = number of data points so far
$weight = 1/($n+1);
$a[$n] = $s[$n] * $weight + $a[$n-1] * (1 - $weight);
}
}
var_dump($a);
// linear decay
$a = [];
for ($n = 0; $n < count($s); ++$n)
{
if ($n == 0)
$a[$n] = $s[$n];
elseif ($n == 1)
$a[$n] = ($s[$n] + $s[$n-1]) / 2;
else
{
// $n = number of data points so far - 1
$weight = 1/($n);
$a[$n] = $s[$n] * $weight + $a[$n-1] * (1 - $weight);
}
}
var_dump($a);
// geometric decay
$a = [];
for ($n = 0; $n < count($s); ++$n)
{
if ($n == 0)
$a[$n] = $s[$n];
else
{
$weight = 1/2;
$a[$n] = $s[$n] * $weight + $a[$n-1] * (1 - $weight);
}
}
var_dump($a);
выход
array (size=4)
0 => int 4
1 => float 3.5
2 => float 4
3 => float 4.5
array (size=4)
0 => int 4
1 => float 3.5
2 => float 4.25
3 => float 4.8333333333333
array (size=4)
0 => int 4
1 => float 3.5
2 => float 4.25
3 => float 5.125