Pull to refresh

Comments 7

Спасибо за статью!
* Из описания не понятно на сколько шагов вперёд удалось предсказать «с идеальным совпадеинем».
* Не понятно какие данные у Вас использовались в качестве «входного воздействия», а какие как фильтруемый вектор измерения. Возможно ответ можно найти анализом кода, но для удобства не мешает текстом описать хотя бы в кратце.
Спасибо за критику!

В первую очередь меня интересовала точность определения производных. Здесь за десяток итераций погрешность становилась 0,1%, за сотню итераций — порядка 10^-7. Вероятно можно достичь более быстрого уменьшения погрешности путем изменения начального значения ковариационной матрицы оценки вектора состояния P. Планирую пробовать различные начальные значения при работе с реальными данными.

В тестовой программе в качестве входных данных использовались точные значения величины и ее первой производной, рассчитанные из полиномиальной функции с известными коэффициентами. Т.е. входные данные о величине и первой производной были даны точно, а вторая и третья производные определялись при помощи фильтра. Они и были выходными данными, они и определялись с указанной выше точностью.
И какие, собственно выводы? Ваша реализация быстрее/медленнее?
Моя реализация позволяет достичь требуемого результата, не подключать библиотеки типа matplotlib, а так же проводить пакетную обработку нескольких параметров с одними и теми же операторами эволюции и управления, вычисляя их единожды на каждый шаг, а не на каждый шаг и каждый параметр.

Возможно я недостаточно понятно написал, целью работы было не создать новую универсальную библиотеку, а разработать в той или иной мере оптимальное средство решения весьма конкретной задачи. Что касается скорости, на не очень быстром десктопе при обработке одного параметра удается сделать 50e3 итераций за 10 секунд, что меня устраивает. К сожалению отчет о скорости работы других реализаций фильтрации дать не могу — не хватило терпения удовлетворить их зависимости.
def calcF( t ):
    res = np.identity( dim )
    _t = 1.0
    for i in range( 1, dim ):
        _t *= t / i
        for j in range( 0, dim-i ):
            res[ j ][ i+j ] = _t
    return res

for i in range( 0, n_iter ):
    z[i] = H.dot( calcF( t[ i ] ) ).dot( xtruth )


Складывается впечатление, что рассматривается задача нелинейного ФК (EKF). Матрица динамики вычисляется на каждом шагу интегрирования (как Якобиан — матрица частных производных от системы нелинейных диф. уравнений).

1. Приведите в статье для каких исходных уравнений решалась данная задача. В CalcF я наблюдаю только некую степенную функцию от t. Похоже на n-ую производную от t^m.

2. Судя по коду выше, рассматривается задача с постоянным вектором измерения без шумов и каким-то непонятным вектором времени (массив случайных величин).

3. Случайный вектор времени требует встраивания в calcF (вычисление Якобиана) некоего алгоритма дискретизации (наподобие Рунге-Кутта). Хотя я вообще не представляю насколько корректно будет работать нелинейный ФК с нерегулярной сеткой времени. Цифровой ФК строится по непрерывным диф. уравнениям с последующей дискретизацией матрицы динамики и управляющего воздействия (последнего, судя по коду, нет в изложенной в статье задаче).
Дополнение:

Не уверен, что в случае постоянного вектора измерения корректно говорить о предсказании с использованием ФК.
Тут рассматривается просто оценивание одного зафиксированного во времени измерения. Если предположить, что данное измерение не содержит аддитивной погрешности, то теряется смысл использования ФК, т.к. можно было бы просто подставить эти два значения (величина и ее первая производная) в исходную систему нелинейных уравнений.

Если же предположить что в измерении величины и ее первой производной есть какая-то погрешность случайная, то прогонка в 100 раз этого зашумленного измерения через ФК лишь притянет вектор состояния к зашумленному измерению.

В статье не описана методика определения точности оценивания (что с чем сравнивалось).

Корректной можно было бы считать такая постановка, когда значения из xtruth складывались с массивом шумов и значения xtruth + noize[t] подавались бы в ФК в качестве зашумленных измерений. Тогда по выходному вектору ФК и его вектору состояния можно было бы судить о точности настройки.

Задача предсказания с помощью ФК — это когда у вас вектор измерения от объекта меняется и Вы хотите прогонкой ФК несколько раз спрогнозировать в какое состояние объект перейдет через сколько-то шагов интегрирования. В случае постоянного воздействия прогноз становится тривиальной задачей.
Уважаемый,

Обратите, пожалуйста, внимание на название статьи и на вступительную часть, ту что расположена перед исходным кодом программы. Прогнозирование величины производится при помощи разложения в степенной ряд, а фильтрация применяется для определения производных, т.е. коэффициентов этого разложения. Более того, в приведенной программе приведена только фильтрация, но не прогнозирование.

Далее постараюсь отвечать по порядку.
В пробной программе в качестве исходной величины — изменяющегося истинного вектора состояния — применялись векторы calcF(t[i]).dot(xtruth), определенные на моменты времени t, причем моменты времени случайны.
Здесь матрица, возвращаемая calcF(t[i]), обеспечивает расчет эволюции системы по полиномиальному закону, т.е. calcF(t[i]).dot(xtruth) имеет следующий вид:
[[ xtruth[0][0] + xtruth[1][0]*t[i] + xtruth[2][0]*t[i]*t[i]/2 + xtruth[3][0]*t[i]*t[i]*t[i]/6 + xtruth[4][0]*t[i]*t[i]*t[i]*t[i]/24 ],
 [ xtruth[1][0] + xtruth[2][0]*t[i] + xtruth[3][0]*t[i]*t[i]/2 + xtruth[4][0]*t[i]*t[i]*t[i]/6 ],
 [ xtruth[2][0] + xtruth[3][0]*t[i] + xtruth[4][0]*t[i]*t[i]/2 ],
 ... ]


В реальной ситуации закон изменения истинной величины будет другим, а именно квазигармоническим. Но поскольку период велик, я посчитал допустимым в качестве модели задавать степенной ряд и для генерации истинного состояния вектора в пробной программе ограничиться также степенным рядом.
Время покажет, верно ли такое приближение.

Шумов в задаче кроме неточного момента времени (записанного в t[i]) не будет, поскольку исходные данные — модель движения, — выдает незашумленные величины и снабжает их меткой времени.
Другое дело, что я не могу использовать эти данные непосредственно, поскольку мне нужно знать производные до 3й (модель выдает только 1ю) и на основе их спрогнозировать вектор состояния на некоторое небольшое время вперед (в пределах единиц секунд).
В связи с этим я не вижу необходимости искусственно зашумлять вектор состояния.
Sign up to leave a comment.

Articles