#алгоритм #gps
Пишу программу gps навигатор, есть функция - средняя скорость.
Данные поступают постоянно и все значения записывать не вариант. У меня была идея
записывать определенное количество значений, скажем, 50 и из них строить среднюю скорость.
У кого-нибудь есть предложения или может кто-то сталкивался с подобным, как вы решили
проблему?
Ответы
Ответ 1
Допустим avg - среднее арифметическое из n измерений. Появляется следующее измерение a. Чтобы учесть это измерение достаточно пересчитать среднее avg = avg * (n / (n + 1)) + a / (n + 1). Таким образом вам достаточно хранить только среднее и количество учтенных в нем измерений. Только мне кажется, что для вашей задачи нужно будет сделать хитрый ход: ограничить выборку последними m - значениями. Насколько я понял, вы считаете среднюю скорость, чтобы "сгладить" резкие скачки при отображении скорости. Тогда можно принять n за константу ( n = m ) и таким образом каждый раз отбрасывать из расчета среднего измерение равное "предыдущему" среднему. Дополнено Для последнего случая необходимо получить среднее значение для начального участка. Тут можно пойти двумя путями: Задать avg равным первому измерению; Наращивать n от нуля до m. Приведу пример: double getAvg(double aNext, int m) { static double avg = 0; static double n = 0; avg = avg * (n / (n + 1)) + aNext / (n + 1); n += 1; if (n > m) n = m; return avg; }Ответ 2
Средняя скорость обычно привязывается к некоторому характерному времени задачи, а данные из совсем далёкого прошлого обычно портят оценку. В то же время есть простой способ копить данные с экспоненциальныо убывающим весом, когда рекуррентно накапливаются две суммы: Q' = 1 + q Q, V' = v + q V. При этом vср = V' / Q'. Нетрудно убедиться, что данные накапливаются с весами, представляющими собой бесконечно убывающую в сторону прошлого геометрическую прогрессию. Выбирая q = 1 - 1/N, мы тем самым задаём вес exp(-1) = 0,37 для данных, удалённых на N отсчётов в прошлое. При этом Q <= 1 / (1-q) = N, V <= vmax*N.Ответ 3
Если для GPS, разве нельзя рассчитать среднюю скорость исходя из длинны пути и прошедшего времени? т.е. Вам достаточно хранить пройденное расстояние и пройденное время от начала маршрута.
Комментариев нет:
Отправить комментарий