Документация Engee

Идентификация замкнутого контура

В этом примере рассматривается эффективность различных алгоритмов идентификации применительно к данным замкнутого контура (когда входной сигнал системы производится контроллером с использованием обратной связи от выхода).

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

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

мы получаем замкнутую систему,

в которой и невозможно различить. Введение позволяет разрешить эту проблему.

В самом первом из приведенных ниже экспериментов демонстрируется эта проблема при отсутствии возбуждения через .

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

  1. arx, a prediction-error approach based on a least-squares estimate.

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

  3. Метод на основе погрешности прогнозирования (PEM) newpem.

Методы ARX и PEM теоретически не подвержены смещению при наличии обратной связи по выходу [1], в то время как метод на основе подпространства подвержен. (Обратите внимание: метод на основе подпространства используется с целью получения начального предположения для итеративного алгоритма PEM.)

using ControlSystemsBase, ControlSystemIdentification, Plots
G = tf(1, [1, -0.9], 1) # Истинная система

function generate_data(u; T)
    E = c2d(tf(1 / 100, [1, 0.01, 0.1]), 1) # Модель цветного шума
    e = lsim(E, randn(1, T)).y              # Реализация шума
    function u_noise(x, t)
        y = x .+ e[t] # Добавляем измеренный шум к состоянию для моделирования обратной связи шума измерения
        u(y, t)
    end
    res = lsim(G, u_noise, 1:T, x0 = [1])
    d = iddata(res)
    d.y .+= e # Добавляем шум измерения к выходу, хранящемуся в объекте данных
    d
end

function estimate_and_plot(d, nx=1; title, focus=:prediciton)
    Gh1 = arx(d, 1, 1)

    sys0 = subspaceid(d, nx; focus)
    tf(sys0)

    Gh2, _ = ControlSystemIdentification.newpem(d, nx; sys0, focus)
    tf(Gh2)

    figb = bodeplot(
        [G, Gh1, sys0.sys, Gh2.sys];
        ticks = :default,
        title,
        lab = ["True system" "ARX" "Subspace" "PEM"],
        plotphase = false,
    )

    figd = plot(d)
    plot(figb, figd)
end
estimate_and_plot (generic function with 2 methods)

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

L = 0.5 # Коэффициент усиления обратной связи u = -L*x
u = (x, t) -> -L * x
title = "-Lx"
estimate_and_plot(generate_data(u, T=80), title=title*",  T=80")
WbJGnxzoBfAAAAAASUVORK5CYII=

При большем объеме данных оценки столь же плохие.

estimate_and_plot(generate_data(u, T=8000), title=title*",  T=8000")
BQ8AAB8vSIQAAACGNXh8AgAAwLAGiRAAAMCw9v9fqR77kzbvQQAAAABJRU5ErkJggg==

Это означает, что, если система определяется только шумом, оценить ее практически невозможно.

Теперь рассмотрим небольшое периодическое возбуждение

L = 0.5 # Коэффициент усиления обратной связи u = -L*x
u = (x, t) -> -L * x .+ 5sin(t)
title = "-Lx + 5sin(t)"
estimate_and_plot(generate_data(u, T=80), title=title*",  T=80")
m4QPuEkjAAAAAASUVORK5CYII=

В данном случае все методы, кроме метода на основе подпространства, работают достаточно эффективно.

estimate_and_plot(generate_data(u, T=8000), title=title*",  T=8000")
EabiKLIIwwGgxkIzlCPwWAwmBENXj6BwWAwmBEN7ggxGAwGM6L5P1+LSfmoYwXJAAAAAElFTkSuQmCC

Увеличение объема данных не улучшает работу метода на основе подпространства.

При более сложном возбуждении (случайный шум белого спектра) все методы работают хорошо.

L = 0.5 # Коэффициент усиления обратной связи u = -L*x
u = (x, t) -> -L * x .+ 5randn()
title = "-Lx + 5randn()"
estimate_and_plot(generate_data(u, T=80), title=title*",  T=80")
cAAAAAElFTkSuQmCC

А при увеличении объема данных — еще лучше.

estimate_and_plot(generate_data(u, T=8000), title=title*",  T=8000")
vaCK8J839joAAAAASUVORK5CYII=

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

L = 1 # Коэффициент усиления обратной связи u = -L*x
u = (x, t) -> -L * x .+ 0.1randn()
title = "-Lx + 0.1randn()"
estimate_and_plot(generate_data(u, T=80), title=title*",  T=80")
8gCJjEBz3fRAAAAAElFTkSuQmCC

В данном случае можно попытаться повысить порядок модели для метода PEM и метода на основе подпространства, чтобы узнать, смогут ли они изучить модель шума (с двумя полюсами).

estimate_and_plot(generate_data(u, T=8000), 3, title=title*",  T=8000")
wBZXvOq8z9PngAAAABJRU5ErkJggg==

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

Определение наличия обратной связи

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

L = 0.5 # Коэффициент усиления обратной связи u = -L*x
u = (x, t) -> -L * x .+ randn.()
title = "-Lx + 5sin(t)"
crosscorplot(generate_data(u, T=500), -5:10, m=:circle)
Hy8urcuTPTFQGoPQQhAACwGs4RAgAAqyEIAQCA1RCEAADAav8HotO6ijpKgqoAAAAASUVORK5CYII=

На этом графике явно видна значительная корреляция как с положительным, так и с отрицательным запаздыванием, что указывает на наличие обратной связи. Здесь используется статический P-регулятор, что дает корреляцию на один шаг назад во времени. С динамическим регулятором (например, ПИ-регулятором) эффект будет существеннее.

Если удалить обратную связь, получится следующее:

L = 0.0 # нет обратной связи
u = (x, t) -> -L * x .+ randn.()
title = "-Lx + 5sin(t)"
crosscorplot(generate_data(u, T=500), -5:10, m=:circle)
evZMmTWpgoMOHDwsEgsWLFytbrKysunfv3qdPH7UUHDRokEAgyM3NbdYLA9BzHIqimK4BABryxhtvJCQkdOzYsbS0tKSkxNfX9+TJk1ZWVvV2zszMFIvFhBBbW1sHB4eGl5yVlUVffdTGxsbR0VHjlQPoBQQhgK6rqam5cePG06dPFQqFl5eXt7c30xUBtCoIQgAAYDUcIwQAAFZDEAIAAKshCAEAgNX+H52tEJDKjjh8AAAAAElFTkSuQmCC

теперь корреляция для отрицательных задержек и нулевой задержки практически несущественная (ниже пунктирных линий).


1. Ljung, Lennart. System identification---Theory for the user, гл. 13.