Оценка моделей в пространстве состояний
На этой странице описываются доступные средства для оценки линейных моделей в пространстве состояний, входы которых имеют следующую форму:
Данный пакет предназначен для оценки дискретных моделей, но их можно преобразовывать в непрерывные с помощью функции d2c
из пакета ControlSystemsBase.jl.
Существует несколько методов для идентификации моделей в пространстве состояний: subspaceid
, n4sid
, newpem
и era
. subspaceid
— это самый современный алгоритм для идентификации на основе подпространства, в то время как n4sid
— это более старая реализация. newpem
решает задачу погрешности прогнозирования с помощью метода итеративной оптимизации (из пакета Optim.jl) и, как правило, немного более точен, хотя и требует больших вычислительных затрат. Если вы не уверены, какой метод использовать, попробуйте сначала subspaceid
(если только данные не получены в результате операции с замкнутым контуром; в этом случае используйте newpem
).
Идентификация на основе подпространства с помощью n4sid
и subspaceid
В этом примере модель в пространстве состояний оценивается с помощью метода subspaceid
. Эта функция возвращает объект типа N4SIDStateSpace
, обеспечивающий доступ к модели в виде sys.sys
.
using ControlSystemIdentification, ControlSystemsBase, Plots
Ts = 0.1
G = c2d(DemoSystems.resonant(), Ts)
u = randn(1,1000)
y = lsim(G,u).y
y .+= 0.01 .* randn.() # Добавляем шум измерения
d = iddata(y,u,Ts)
sys = subspaceid(d, :auto; verbose=false, zeroD=true)
# либо используем устойчивую версию svd, если в y есть выбросы или отсутствующие значения
# using TotalLeastSquares
# sys = n4sid(d, :auto; verbose=false, svd=x->rpca(x)[3])
bodeplot([G, sys.sys], lab=["True" "" "subspace" ""])
julia
N4SIDStateSpace
is a subtype of AbstractPredictionStateSpace
, a statespace object that contains an observer gain matrix sys.K
(Kalman filter) as well as estimated covariance matrices etc. Если воспользоваться вместо этого функцией n4sid
, то получим следующее:
sys2 = n4sid(d, :auto; verbose=false, zeroD=true)
bodeplot!(sys2.sys, lab=["n4sid" ""])
julia
subspaceid
allows you to choose the weighting between :MOESP, :CVA, :N4SID, :IVM
and is generally preferred over n4sid
. Обе функции позволяют выбрать функции, применяемые для оценки наименьших квадратов и вычисления SVD, например средства оценки, устойчивые к выбросам, и т. д.
Настройка подгонки модели
Алгоритмы оценки на основе подпространства имеют ряд параметров, которые можно настроить, если начальная подгонка модели неудовлетворительная.
-
Параметр
focus
определяет цель подгонки модели. По умолчанию используется значение:prediction
, при котором минимизируется погрешность прогнозирования. Если при этом значении для устойчивой системы получается неустойчивая модель либо если производительность моделирования низкая, может лучше подойти значениеfocus = :simulation
. -
Настроить можно также несколько параметров горизонта. С помощью именованного аргумента
r
выбирается горизонт прогнозирования. Значение должно быть больше порядка модели, по умолчаниюnx + 10
. Аргументыs1
иs2
определяют прошлые горизонты для выхода и входа соответственно. По умолчанию используетсяs1 = s2 = r
. Прошлые горизонты можно настроить только дляsubspaceid
. -
(Дополнительно.) Метод, используемый для вычисления SVD, а также выполнения подгонки методом наименьших квадратов, можно изменить с помощью именованных аргументов
svd, Aestimator, Bestimator
. -
zeroD
позволяет сделать оцениваемую матрицу нулевой (строго собственная модель). -
Можно выбрать тип веса
W
::MOESP, :CVA, :N4SID, :IVM
. По умолчанию используется:MOESP
.
Дополнительные аргументы и более подробные сведения см. в docstring функций subspaceid
и n4sid
.
ERA и OKID
Алгоритмы реализации собственных значений и идентификации наблюдателя Калмана доступны в виде функций era
и okid
. При вызове era
с объектом данных автоматически используется функция okid
с целью получения марковских параметров для алгоритма ERA.
sys3 = era(d, 2) # У функции era много параметров, которые могут требовать настройки.
bodeplot!(sys3, lab=["ERA" ""])
julia
Использование нескольких наборов данных
Алгоритмы ERA и OKID поддерживают использование нескольких наборов данных для повышения точности оценки. Ниже показано, как это делается вручную.
using ControlSystemIdentification, ControlSystemsBase, Plots, Statistics
Ts = 0.1
G = c2d(tf(1, [1,1,1]), Ts) # Истинная система
# Создаем несколько экспериментов
ds = map(1:5) do i
u = randn(1, 1000)
y, t, x = lsim(G, u)
yn = y + 0.2randn(size(y))
iddata(yn, u, Ts)
end
Ys = okid.(ds, 2, round(Int, 10/Ts), smooth=true, λ=1) # Оцениваем импульсную характеристику для каждого эксперимента
Y = mean(Ys) # Усредняем все импульсные характеристики
imp = impulse(G, 10)
f1 = plot(imp, lab="True", l=5)
plot!(imp.t, vec.(Ys), lab="Individual estimates", title="Impulse-response estimates")
plot!(imp.t, vec(Y), l=(3, :black), lab="Mean")
models = era.(Ys, Ts, 2, 50, 50) # Оцениваем модели на основе отдельных экспериментов
meanmodel = era(Y, Ts, 2, 50, 50) # Оцениваем модель на основе средней импульсной характеристики
f2 = bodeplot([G, meanmodel], lab=["True" "" "Combined estimate" ""], l=2)
bodeplot!(models, lab="Individual estimates", c=:black, alpha=0.5, legend=:bottomleft)
plot(f1, f2)
julia
Представленная выше процедура равносильна вызову era
напрямую с вектором наборов данных; в этом случае усреднение импульсных характеристик производится автоматически.
era(ds, 2, 50, 50, round(Int, 10/Ts), p=1, λ=1, smooth=true) # Должно быть идентично приведенной выше усредненной модели
julia
StateSpace{ControlSystemsBase.Discrete{Float64}, Float64} A = 0.9714275037672085 -0.08556668857687873 0.08556668857687827 0.9234713852927754 B = -0.0655718881394695 0.06269691994965396 C = -0.655718881394695 -0.6269691994965387 D = 0.011478353122140328 Sample Time: 0.1 (seconds) Discrete-time state-space model
output
Метод на основе погрешности прогнозирования (PEM)
Метод на основе погрешности прогнозирования представляет собой простой, но эффективный алгоритм для идентификации дискретных ЛПП-систем в форме пространства состояний:
Пользователь может выбрать, что следует минимизировать: погрешности прогнозирования или погрешности моделирования, причем метрики являются произвольными, то есть не ограничены квадратичными погрешностями.
Результатом идентификации с помощью функции newpem
является пользовательский тип с дополнительными полями для ковариационных матриц усиления Калмана и шума.
Идентификация серого ящика
Сведения об оценке линейных и нелинейных моделей с фиксированной структурой см. в описании функции ControlSystemIdentification.nonlinear_pem
.
Пример использования
Ниже мы генерируем систему и моделируем ее вперед во времени. Затем мы пытаемся оценить модель на основе входной и выходной последовательностей с помощью функции newpem
.
using ControlSystemIdentification, ControlSystemsBase, Random, LinearAlgebra
using ControlSystemIdentification: newpem
sys = c2d(tf(1, [1, 0.5, 1]) * tf(1, [1, 1]), 0.1)
Random.seed!(1)
T = 1000 # Количество временных шагов
nx = 3 # Количество полюсов в истинной системе
nu = 1 # Количество входов
x0 = randn(nx) # Начальное состояние
sim(sys,u,x0=x0) = lsim(ss(sys), u, x0=x0).y # Вспомогательная функция
u = randn(nu,T) # Генерируем случайные входные данные
y = sim(sys, u, x0) # Моделируем систему
y .+= 0.01 .* randn.() # Добавляем шум измерения
d = iddata(y,u,0.1)
sysh,opt = newpem(d, nx, focus=:prediction) # Оцениваем модель
yh = predict(sysh, d) # Выполняем прогнозирование с помощью оцененной модели
predplot(sysh, d) # Строим график спрогнозированных и истинных выходных данных
julia
Дополнительные графики можно найти в интерактивных скриптах с примерами, а несколько примеров — в разделе примеров данной документации.
Аргументы
У алгоритма есть несколько параметров:
-
По умолчанию оптимизация начинается с начального предположения, предоставляемого
subspaceid
, но его можно переопределить, передав начальное предположение вnewpem
с помощью именованного аргументаsys0
. -
Параметр
focus
определяет цель подгонки модели. По умолчанию используется значение:prediction
, при котором минимизируется погрешность прогнозирования. Если при этом значении для устойчивой системы получается неустойчивая модель либо если производительность моделирования низкая, может лучше подойти значениеfocus = :simulation
. -
Регуляризатор можно передать с помощью именованного аргумента
regularizer
. -
Сделать модель устойчивой можно с помощью аргумента
stable = true
. -
Матрицу можно сделать нулевой с помощью аргумента
zeroD = true
. -
Добиться необходимого баланса между точностью прогнозирования и производительностью моделирования можно путем оптимизации погрешности прогнозирования на шаге . По умолчанию используется значение , которое соответствует среднеквадратичной погрешности прогнозирования. Его можно изменить с помощью именованного аргумента
h
. Чем выше значениеh
, тем больше вычислительных затрат требуется для решения задачи оптимизации.
Дополнительные аргументы и более подробные сведения см. в docstring функции newpem
.
Внутренние компоненты
На внутреннем уровне для оптимизации параметров системы используется пакет Optim.jl, который вычисляет градиенты (и при необходимости гессианы) посредством автоматического дифференцирования. Параметры решателя Optim можно контролировать, передавая именованные аргументы в newpem
и передавая созданный вручную объект решателя. Решатель по умолчанию — BFGS()
Фильтрация, прогнозирование и моделирование
При оценке моделей иногда можно выбрать «цель» оценки: производительность прогнозирования (:prediciton
) или моделирования (:simulation
). При выборе моделирования приоритетом является точность низкочастотных свойств, особенно при интеграции систем, а при выборе моделирования — точность модели на более высоких частотах. Если на систему влияют существенные входные возмущения или если система является неустойчивой, в качестве цели предпочтительнее выбирать прогнозирование.
При проверке оцененных моделей их можно имитировать с помощью функции lsim
из пакета ControlSystemsBase.jl или с помощью функции simulate
. Модель можно также преобразовать в объект KalmanFilter
из пакета LowLevelParticleFilters.jl, вызвав KalmanFilter(sys)
, после чего можно выполнять фильтрацию, сглаживание и другие операции с помощью средств, доступных для KalmanFilter
.
Кроме того, имеются перечисленные ниже вспомогательные функции.
-
predict
(sys, d, x0=zeros; h=1)
: Form predictions using estimatedsys
, this essentially runs a stationary Kalman filter.h
denotes the prediction horizon. -
simulate
(sys, u, x0=zeros)
: Simulate the system using inputu
. The noise model and Kalman gain does not have any influence on the simulated output. -
observer_predictor
: Extract the predictor model from the estimated system (ss(A-KC,[B K],C,D)
).
Генерация кода
Для генерации кода на C, например, с целью моделирования системы используйте пакет SymbolicControlSystems.jl.