Алгоритм управления на основе поиска экстремума

Автор
avatar-svetlanasvetlana
Notebook

Алгоритм управления на основе поиска экстремума

Управление на основе поиска экстремума (Extremum Seeking Control) – это эффективный алгоритм оптимизации управления, который адаптируется к медленно меняющимся параметрам и не требует модель объекта управления. Для этого метода мы выбираем некоторую целевую функцию и находим ее максимум или минимум для функции затрат. Оптимальное управление соответствует точке экстремума этой функции.

Неизменяемая часть

Представим, что на вход некоторой системы поступает сигнал u, а на выходе – сигнал y. Выходы формируют целевую функцию, максимум которой мы хотим найти.

image_3.png

В нашей модели мы представим это простым квадратным уравнением $J = 100-(10-u)^2$ в блоке Engee Function.

image_2.png

В блоке Engee Function используется следующий код:

struct Block <: AbstractCausalComponent; end
function (c::Block)(t::Real, u)
    J = 100-(10-u)^2;
    return J
end

Построим зависимость целевой функции от входного сигнала. В Engee это легко сделать, выбрав тип отображения Зависимость одного сигнала от другого. По графику мы видим, что целевая функция достигает максимума $100$ при $u = 10$. Теперь дело за малым - научить наш контроллер искать этот экстремум. image_2.png

Модуляция

Представим, что мы не знаем, что оптимальное значение $u = 10$ и выберем любое начальное предположение, например $u = 5$. ES-контроллер должен автоматически определять,оптимально ли это значение. В случае, если это не так, контроллер должен установить, является ли это значение слишком малым или слишком большим. Для этого подадим на вход не постоянный сигнал, а колеблющийся вокруг нашего начального предположения, добавив к входному сигналу низкоамплитудный синусоидальный сигнал $asin(ωt)$. Этот этап называется модуляцией.

image.png

In [ ]:
a = 0.3;
ω = 30.0; #Рад/с
φ2 = 0.0; #Рад

Синусоидальная составляющая позволяет определить наклон целевой функции при выбранном значении $u$. Поскольку $u = 5$ меньше искомого экстремума, то мы ожидаем, что эти два сигнала будут в одной фазе, то есть при увеличении $u$, выход $J$ так же увеличивается. image_3.png

Если же мы выберем значение $u = 12$, что больше искомого экстремума, то эти два сигнала будут не в фазе, так как при увеличении $u$ значение $J$ уменьшается.

image_2.png

Демодуляция

На графике оранжевая синусоида это входной сигнал, колеблющийся вокруг $u = 12$, а синяя - выходной сигнал системы. image_2.png

Определить, находится ли сигнал целевой функции c входным сигналом в одной фазе может быть затруднительно, поскольку они смещены относительно друг друга. Но нас интересуют не их абсолютные значения, а лишь изменения. Изменение входного сигнала и есть сама синусоида $asin(ωt)$. Изменение значения целевой функции можно получить, пропустив её через фильтр высоких частот.

In [ ]:
w_h = 5.0; # Частота среза фильтра высоких частот 

Если перемножить эти два сигнала, то мы получим сигнал $ξ$, принимающий неотрицательные значения в случае, если сигналы находятся в одной фазе. И, напротив, если сигналы в противофазе, то произведение будет принимать преимущественно отрицательные значения. Этот этап называется Демодуляция. image.png

Обновление параметров

На последнем этапе демодулированный сигнал $ξ$ интегрируется. Если $u$ слишком мало, то демодулированный сигнал положителен и результат интегрирования будет увеличиваться. Если u напротив велико - уменьшаться. Причем, чем дальше мы находимся от оптимального значения, тем быстрее увеличивается или уменьшается сумма.

image_2.png

В этом можно убедиться, если вместо константы поставить на вход линейный сигнал Ramp. Чем ближе мы к оптимальному значению, тем точнее становятся шаги и около экстремума сигнал лишь незначительно колеблется.

image_2.png

ES-контроллер для статической системы

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

Давайте так и сделаем в модели. Мы видим, что наша система не достигла оптимального состояния.

image_3.png

Для того, чтобы ускорить процесс сходимости, добавим к интегратору коэффициент усиления.

In [ ]:
k = 5.0;

Подбирая коэффициент усиления важно соблюдать баланс, так как слишком быстрое ускорение сделает систему неустойчивой. image_2.png

ES-контроллер для динамической системы

Как мы упоминали в самом начале, ES-контроллер хорошо адаптируется к изменяющейся динамике, но изменения должны быть небыстрыми, чтобы поиск оптимального управления успевал сходиться к оптимуму. Посмотрим это на примере. Изменим уравнение в блоке Engee function, чтобы оно зависело от времени. Например, будем постепенно сдвигать параболу вправо. Теперь ES-контроллеру необходимо постоянно увеличивать входное значение u, чтобы поддерживать максимальное выходное значение J в 100.

image_2.png

Теперь вход u постоянно меняется, чтобы выход J оставался близким к максимальному значению.

Параметры ES-контроллера

Итак, мы на примере рассмотрели упрощенную версию ES-контроллера. На рисунке показана его полная версия со всеми параметрами, настраивая которые, можно получить результат, который быстро и надежно сходится к оптимальному решению. В него также добавлен фильтр низких частот для удаления высокочастотного шума из демодулированного сигнала. Большое количество настраиваемых параметров считается одним из недостатков ES-контроллера.

  • ω - Частота модулирующего сигнала;
  • a - Амплитуда демодулирующего сигнала;
  • b - Амплитуда модулирующего сигнала;
  • φ1 - Фаза демодулирующего сигнала;
  • φ2 - Фаза модулирующего сигнала;
  • K - Скорость сходимости оптимизации;
  • x0 - Начальные условия интегратора;
  • ωl - Частота среза фильтра низких частот;
  • ωh - Частота среза фильтра высоких частот;

kontr.png