Прочитал на Хабр статью [1], в которой автор простым языком даёт достаточно глубокое представление такого сложного и важного математического объекта как фильтр Калмана и захотел предложить читателям посмотреть на него (фильтр Калмана) несколько с другого ракурса. Сразу хочу предупредить, что перед чтением данной статьи хорошо бы прочесть статью [1], так как даже формулы были специально взяты ровно оттуда, дабы данная статья базировалась на материале упомянутой работы [1].

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

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

А теперь, изложенную идею попробуем воплотить в виде математических абстракций.

 \begin{align}   & {{{\hat{x}}}_{k}}={{F}_{k}}{{{\hat{x}}}_{k-1}}+{{B}_{k}}{{{\vec{u}}}_{k}} \\   & {{P}_{k}}={{F}_{k}}{{P}_{k-1}}F_{k}^{T}+{{Q}_{k}} \\  \end{align} \tag{1}

Детально разберём модель (1):

{{F}_{k}}

- матрица дискретной модели наблюдаемого объекта, в данном случае это двигатель погружного насоса;

{{\hat{x}}_{k}}

- случайный вектор пространства состояний фильтра Калмана с ковариационной матрицей

{{P}_{k}}=Cov({{\hat{x}}_{k}}),

характеризующей разброс

{{\hat{x}}_{k}}

вокруг его математического ожидания

M\left[ {{{\hat{x}}}_{k}} \right],

в нашем случае

{{\hat{x}}_{k}}

-это вектор, состоящий из координат, характеризующих электрические и механические процессы в моделируемом двигателе погружного насоса, в частности одна из его координат является интересующей нас скоростью вращения ротора электродвигателя;

{{Q}_{k}}

- ковариационная матрица шума внешних возмущающих воздействий на вектор пространства состояний

{{\hat{x}}_{k}}

математической модели электродвигателя, например неоднородность нефтяной фракции, закачиваемой погружным насосом, что стохастически воздействует на электромеханические процессы двигателя;

{{\vec{u}}_{k}}

- вектор детерминированных внешних воздействий с согласующей этот вектор с моделью двигателя матрицей

{{B}_{k}},

в данном случае это реальные напряжения фаз двигателя погружного насоса.

Так же

{{\vec{\mu }}_{expected}}={{H}_{k}}{{\hat{x}}_{k}}

- случайный вектор показаний квазидатчиков токов фаз математической модели двигателя насоса, где

{{H}_{k}}

- матрица согласования вектора пространства состояний

{{\hat{x}}_{k}}

с вектором показаний квазидатчиков

{{\vec{\mu }}_{expected}};\sum{_{expected}}={{H}_{k}}{{P}_{k}}H_{k}^{T}

- ковариационная матрица случайного вектора показаний квазидатчиков

{{\vec{\mu }}_{expected}} ,

характеризующая разброс этих показаний вокруг математического ожидания

M\left[ {{{\vec{\mu }}}_{expected}} \right];{{\vec{z}}_{k}}

- случайный вектор показаний реальных датчиков тока фаз двигателя с ковариационной матрицей

{{R}_{k}}=Cov({{\vec{z}}_{k}}),

характеризующей шумовой разброс показаний

{{\vec{z}}_{k}}

вокруг математического ожидания

M\left[ {{{\vec{z}}}_{k}} \right].

Итак, мы имеем два случайных вектора

{{\vec{\mu }}_{expected}},{{\vec{z}}_{k}}

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

\sum{_{expected}}={{H}_{k}}{{P}_{k}}H_{k}^{T}  и  { {R}_{k}}

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

{{\vec{\mu }}_{expected  }}  и  {{\vec{z}}_{k}},

и получить случайный вектор

{{\hat{x}}_{k}}^{\prime }.

Новая случайная векторная величина   

{{\hat{x}}_{k}}^{\prime }

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

Случайный вектор

{{\vec{\mu }}_{expected}}

показаний квазидатчиков тока математической модели двигателя и его ковариационную матрицу

 \sum{_{expected}}

представим в виде :

\left( {{{\vec{\mu }}}_{0}},{{\Sigma }_{0}} \right)=\left( {{{\vec{\mu }}}_{expected}},\sum{_{expected}} \right)=\left( {{H}_{k}}{{{\hat{x}}}_{k}},{{H}_{k}}{{P}_{k}}H_{k}^{T} \right )  \tag{2}

Случайный вектор   

{{\vec{z}}_{k}}

показаний реальных датчиков тока математической модели двигателя и его ковариационную матрицу  

{{R}_{k}}

представим в виде :

\left( {{{\vec{\mu }}}_{1}},{{\Sigma }_{1}} \right)=\left( {{{\vec{z}}}_{k}},{{R}_{k}} \right)  \tag{3}

В результате произведения  

{{\vec{\mu }}_{expected}}  ,  {{\vec{z}}_{k}}

получаем векторную случайную величину  

{\vec{\mu }}'

и её ковариационную матрицу

  {\Sigma }'  ,

которые можно выразить через  

{{\vec{\mu }}_{expected}}  ,   {{\vec{z}}_{k}}

и их ковариационные матрицы следующим образом:

  \begin{align}   & {\vec{\mu }}'={{{\vec{\mu }}}_{0}}+K({{{\vec{\mu }}}_{1}}-{{{\vec{\mu }}}_{0}}) \\   & {\Sigma }'={{\Sigma }_{0}}-K{{\Sigma }_{0}} \\  \end{align}   где   K={{\Sigma }_{0}}{{\left( {{\Sigma }_{0}}+{{\Sigma }_{1}}  \right)}^{-1}}  \tag{4}

Причём

  \begin{align}   & {\vec{\mu }}'={{H}_{k}}{{{{\hat{x}}'}}_{k}} \\   & {\Sigma }'={{H}_{k}}{{{{P}'}}_{k}}H_{k}^{T} \\  \end{align}       \tag{5}

Исходя из (2),(3),(4),(5), получим:

  \begin{align}   & {\vec{\mu }}'={{H}_{k}}{{{{\hat{x}}'}}_{k}}={{H}_{k}}{{{\hat{x}}}_{k}}+{{K}_{k}}\left( {{{\vec{z}}}_{k}}-{{H}_{k}}{{{\hat{x}}}_{k}} \right) \\   & {\Sigma }'={{H}_{k}}{{{{P}'}}_{k}}H_{k}^{T}={{H}_{k}}{{P}_{k}}H_{k}^{T}-{{K}_{k}}{{H}_{k}}{{P}_{k}}H_{k}^{T} \\  \end{align}  \tag{6}

Исходя из (2),(3),(4) коэффициент усиления Калмана   

{{K}_{k}}

будет иметь вид

{{K}_{k}}={{H}_{k}}{{P}_{k}}H_{k}^{T}{{\left( {{H}_{k}}{{P}_{k}}H_{k}^{T}+{{R}_{k}} \right)}^{-1}}  \tag{7}

Мы можем убрать   

{{H}_{k}} 

из начала каждого члена в двух предыдущих уравнениях (6) (обратите внимание, что один скрывается в   K  ), а   

H_{k}^{T}

убрать из конца всех членов второго уравнения системы (6).

Окончательно приходим к следующим выражениям:

  \begin{align}   & {{{{\hat{x}}'}}_{k}}={{{\hat{x}}}_{k}}+{{{{K}'}}_{k}}\left( {{{\vec{z}}}_{k}}-{{H}_{k}}{{{\hat{x}}}_{k}} \right) \\   & {{{{P}'}}_{k}}={{P}_{k}}-{{{{K}'}}_{k}}{{H}_{k}}{{P}_{k}} \\   & {{{{K}'}}_{k}}={{P}_{k}}H_{k}^{T}{{\left( {{H}_{k}}{{P}_{k}}H_{k}^{T}+{{R}_{k}} \right)}^{-1}} \\  \end{align}   \tag{8}

К которым добавим систему (1):

\begin{align}   & {{{\hat{x}}}_{k}}={{F}_{k}}{{{\hat{x}}}_{k-1}}+{{B}_{k}}{{{\vec{u}}}_{k}} \\   & {{P}_{k}}={{F}_{k}}{{P}_{k-1}}F_{k}^{T}+{{Q}_{k}} \\  \end{align}  \tag{1}{{{\hat{x}}'}_{k}}

— это новое наилучшее возможное значение, и мы можем дальше передавать его вместе с 

{{{P}'}_{k}}

на очередной этап вычислений, полагая  

{{\hat{x}}_{k-1}}={{{\hat{x}}'}_{k}}  ,   {{P}_{k-1}}={{{P}'}_{k}}  .

Ну и что? Скажете Вы, тот же фильтр Калмана, что и в [1]. Но давайте в первое уравнение системы (8) вместо

{{\hat{x}}_{k}}

подставим первое уравнение системы (1), и получим

{{{\hat{x}}'}_{k}}={{F}_{k}}{{\hat{x}}_{k-1}}+{{B}_{k}}{{\vec{u}}_{k}}+{{{K}}_{k}'}\left( {{{\vec{z}}}_{k}}-{{H}_{k}}{{{\hat{x}}}_{k}} \right)  \tag{9}

наблюдатель в каноническом виде, где   

{{F}_{k}}{{\hat{x}}_{k-1}}+{{B}_{k}}{{\vec{u}}_{k}}

 - это часть, которая отвечает за математическую модель наблюдаемого объекта, в нашем случае это электродвигатель,    

{{\vec{u}}_{k}}

- внешнее детерминированное воздействие, в нашем случае это напряжения фаз, измеренные реальными датчиками,   

{{\vec{z}}_{k}}

 - измеряемые величины, в нашем случае это показания датчиков тока двигателя насоса.   

{{{K}}_{k}'}

 - матричный коэффициент усиления наблюдателя, который устроен так, что благодаря ему  

\left( {{{\vec{z}}}_{k}}-{{H}_{k}}{{{\hat{x}}}_{k}} \right)

стремится к нулю, но так как  

{{\vec{z}}_{k}}

- это показания датчиков реальных, а  

{{\vec{\mu }}_{expected}}={{H}_{k}}{{\hat{x}}_{k}}

- показания квазидатчиков виртуальных, то это означает, что показания датчиков виртуальных станут равны показаниям датчиков реальных. То есть, математическая модель будет запитана тем же напряжением и будет выдавать те же токи, что и наблюдаемый объект, а это означает, что значения координат вектора   

{{{\hat{x}}}_{k}'}

  будут соответствовать реальным текущим значениям наблюдаемого объекта, а что касается нашего случая, то одна из координат  

 {{{\hat{x}}}_{k}'}

 будет соответствовать реальному значению скорости вращения ротора электродвигателя погружного нефтяного насоса.

Тогда причём здесь фильтрация?

Задача наблюдения, сформулированная в стохастических терминах, именуется задачей фильтрации [2].

То есть фильтр Калмана – это оптимальный наблюдатель.

  1. Объяснение фильтра Калмана в картинках 

  2. К. Браммер Г. Зиффлинг Фильтр Калмана – Бьюси. Детерминированное наблюдение и стохастическая фильтрация