Оценка моделей в пространстве состояний
На этой странице описываются доступные средства для оценки линейных моделей в пространстве состояний, входы которых имеют следующую форму:
Данный пакет предназначен для оценки дискретных моделей, но их можно преобразовывать в непрерывные с помощью функции 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" ""])
N4SIDStateSpace — это подтип AbstractPredictionStateSpace, объекта пространства состояний, который содержит матрицу
усиления наблюдателя sys.K (фильтр Калмана), а также предполагаемые ковариационные матрицы и т. д. Если воспользоваться вместо этого функцией n4sid, то получим
следующее:
sys2 = n4sid(d, :auto; verbose=false, zeroD=true)
bodeplot!(sys2.sys, lab=["n4sid" ""])
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" ""])
Использование нескольких наборов данных
Алгоритмы 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)
Представленная выше процедура равносильна вызову era напрямую с вектором наборов данных; в этом случае усреднение импульсных характеристик производится автоматически.
era(ds, 2, 50, 50, round(Int, 10/Ts), p=1, λ=1, smooth=true) # Должно быть идентично приведенной выше усредненной модели
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
Метод на основе погрешности прогнозирования (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) # Строим график спрогнозированных и истинных выходных данных
Дополнительные графики можно найти в интерактивных скриптах с примерами, а несколько примеров — в разделе примеров данной документации.
Аргументы
У алгоритма есть несколько параметров:
-
По умолчанию оптимизация начинается с начального предположения, предоставляемого
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.hdenotes 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.
API Statespace
#
ControlSystemIdentification.newpem — Function
sys, x0, res = newpem(
d,
nx;
zeroD = true,
focus = :prediction,
stable = true,
sys0 = subspaceid(d, nx; zeroD, focus, stable),
metric = abs2,
regularizer = (p, P) -> 0,
output_nonlinearity = nothing,
input_nonlinearity = nothing,
nlp = nothing,
optimizer = BFGS(
linesearch = LineSearches.BackTracking(),
),
store_trace = true,
show_trace = true,
show_every = 50,
iterations = 10000,
time_limit = 100,
x_tol = 0,
f_abstol = 0,
g_tol = 1e-12,
f_calls_limit = 0,
g_calls_limit = 0,
allow_f_increases = false,
)
Новая реализация метода на основе ошибки прогнозирования (PEM). Обратите внимание, что это экспериментальная реализация и в нее могут быть внесены изменения, не соответствующие semver.
Метод на основе ошибки прогнозирования является итеративной задачей оптимизации на основе градиента, поэтому он может быть очень чувствителен к масштабированию сигнала. Перед оценкой рекомендуется выполнить масштабирование к d, например путем умножения слева и справа на диагональные матрицы d̃ = Dy*d*Du, и применить обратное масштабирование к полученной системе В этом случае у нас есть
отсюда G = Dy \ G̃ * Du, где — это объект, оцениваемый для масштабированных iddata. Пример:
Dy = Diagonal(1 ./ vec(std(d.y, dims=2))) # Нормализация дисперсии
Du = Diagonal(1 ./ vec(std(d.u, dims=2))) # Нормализация дисперсии
d̃ = Dy * d * Du
Если начальное предположение sys0 задано вручную, оно также должно быть соответствующим образом масштабировано.
Аргументы
-
d:iddata -
nx: порядок модели -
zeroD: Делает матрицуDнулевой -
stable: если true, устойчивость оцениваемой системы будет обеспечиваться отражением собственных значений с помощьюschur_stabприϵ=1/100(по умолчанию). Еслиstableявляется вещественным значением, оно используется вместо заданного по умолчаниюϵ. -
sys0: Начальное предположение. Если оно не указано, то в качестве начального предположения используетсяsubspaceid. -
focus:predictionили:simulation. Если:simulation, матрицаKбудет нулевой. -
optimizer: один из оптимизаторов Optim -
metric: метрика, используемая для измерения остатков. Попробуйте, например,absдля лучшей устойчивости к выбросам.
Остальные аргументы относятся к Optim.Options.
-
regularizer: Функция вектора параметров и соответствующей системыPredictionStateSpace/StateSpace, которая может быть использована для регуляризации оценки. -
output_nonlinearity: Функция(y::Vector, p), которая работает с выходным сигналом в одной временной точкеyₜи изменяет его на месте. Подробные сведения см. ниже.pявляется вектором оцениваемых параметров, которые можно оптимизировать. -
input_nonlinearity: Функция(u::Matrix, p), которая работает со всем входным сигналомuза раз и изменяет его на месте. Подробные сведения см. ниже.pпредставляет собой вектор оцениваемых параметров, который является общим и дляoutput_nonlinearity. -
nlp: вектор начального предположения для нелинейных параметров. Если указанoutput_nonlinearity, он может быть указан дополнительно.
Нелинейная оценка
Нелинейные системы в форме Гаммерштейна — Винера, то есть системы со статическими нелинейными входами, статическими нелинейными выходами и линейной системой между ними, могут оцениваться, пока нелинейности известны. Эта процедура выглядит следующим образом:
-
Если существует известная входная нелинейность, вручную примените входную нелинейность к входному сигналу
uперед оценкой, т. е. используйте нелинейно преобразованный входной сигнал в объектеiddatad. Если входная нелинейность имеет неизвестные параметры, укажите входную нелинейность в виде функции с именованным аргументомinput_nonlinearityдляnewpem. Предполагается, что эта функция будет работать со всем (матричным) выходным сигналомuи изменять его на месте. -
Если выходная нелинейность является инвертируемой, примените инверсию к выходному сигналу
yперед оценкой аналогично описанному выше. -
Если выходная нелинейность является неинвертируемой, укажите выходное нелинейное преобразование в виде функции с именованным аргументом
output_nonlinearityдляnewpem. Предполагается, что эта функция будет работать с (векторным) выходным сигналомyи изменять его на месте. Пример:
function output_nonlinearity(y, p)
y[1] = y[1] + p[1]*y[1]^2 # Обратите внимание, как входящий вектор изменяется на месте.
y[2] = abs(y[2])
end
Обратите внимание, y = f(y) не изменяет y на месте, а создает новый вектор y и присваивает его переменной y. Это не то, что нам нужно.
Второй аргумент для input_nonlinearity и output_nonlinearity — это (необязательный) вектор параметров, которые могут быть оптимизированы. Чтобы использовать эту возможность, передайте именованный аргумент nlp в newpem с вектором начальных предположений для нелинейных параметров. Нелинейные параметры являются общими для выходных и входных нелинейностей, т. е. эти две функции получат один и тот же вектор параметров.
Результатом данной оценки является линейная система без нелинейностей.
Пример
Далее показано моделирование данных из линейной системы и оценка модели. Пример нелинейной идентификации см. в документации.
using ControlSystemIdentification, ControlSystemsBase Plots
G = DemoSystems.doylesat()
T = 1000 # Количество временных шагов
Ts = 0.01 # Интервал выборки
sys = c2d(G, Ts)
nx = sys.nx
nu = sys.nu
ny = sys.ny
x0 = zeros(nx) # фактическое начальное состояние
sim(sys, u, x0 = x0) = lsim(sys, u; x0)[1]
σy = 1e-1 # Ковариация шума
u = randn(nu, T)
y = sim(sys, u, x0)
yn = y .+ σy .* randn.() # Добавляем шум измерения
d = iddata(yn, u, Ts)
sysh, x0h, opt = ControlSystemIdentification.newpem(d, nx, show_every=10)
plot(
bodeplot([sys, sysh]),
predplot(sysh, d, x0h), # Включает оцененное начальное состояние в прогнозирование
)
Возвращаемая модель имеет тип PredictionStateSpace и содержит поле sys с моделью системы, а также ковариационные матрицы и вычисленный коэффициент усиления Калмана для фильтра Калмана.
См. также описание nonlinear_pem.
Расширенная справка
В данной реализации используется трехдиагональная параметризация матрицы A, которая, как было показано, является предпочтительной с точки зрения оптимизации¹. Начальное предположение sys0 автоматически преобразуется в специальную трехдиагональную модальную форму. [1] Mckelvey, Tomas & Helmersson, Anders. (1997). Параметризация пространств состояний многомерных линейных систем с помощью трехдиагональных матричных форм.
Вектор параметров, используемый при оптимизации, имеет следующий вид:
p = [trivec(A); vec(B); vec(C); vec(D); vec(K); vec(x0)]
Где ControlSystemIdentification.trivec векторизует диагонали -1,0,1 для A. Если focus = :simulation, K опускается, а если zeroD = true, опускается D.
#
ControlSystemIdentification.subspaceid — Function
subspaceid(
data::InputOutputData,
nx = :auto;
verbose = false,
r = nx === :auto ? min(length(data) ÷ 20, 50) : nx + 10, # Используемый максимальный горизонт прогнозирования
s1 = r, # Количество прошлых выходных значений
s2 = r, # Количество прошлых входных значений
W = :MOESP,
zeroD = false,
stable = true,
focus = :prediction,
svd::F1 = svd!,
scaleU = true,
Aestimator::F2 = \,
Bestimator::F3 = \,
weights = nothing,
)
Оценивает модель пространства состояний с помощью идентификации на основе подпространства. Доступно несколько различных алгоритмов, основанных на подпространстве, которые можно выбрать с помощью ключевого слова W. Возможные варианты: :MOESP, :CVA, :N4SID, :IVM
Источник: Ljung, Theory for the user.
Устойчивость к выбросам можно повысить, предоставив собственный алгоритм разложения и заменив внутренние средства оценки по методу наименьших квадратов. См. документацию по именованным аргументам svd, Aestimator и Bestimator ниже.
Возвращаемая модель имеет тип N4SIDStateSpace и содержит поле sys с моделью системы, а также ковариационные матрицы для фильтра Калмана.
Аргументы
-
data: Идентификационные данныеiddata -
nx: ранг модели (порядок модели) -
verbose: выводить что-либо? -
r: горизонт прогнозирования. Модель может более эффективно работать в моделировании, если сделать его длиннее, но это потребует больше времени на вычисления. -
s1: прошлый горизонт выходных данных -
s2: прошлый горизонт входных данных -
W: Тип веса, можно выбрать среди:MOESP, :CVA, :N4SID, :IVM -
zeroD: Позволяет сделать матрицуDнулевой. -
stable: стабилизирует неустойчивую систему с помощью отражения собственных значений. -
focus::predictionилиsimulation -
svd: Функция, используемая дляsvd. Устойчивость к выбросам можно повысить, используяTotalLeastSquares.rpcaдля предварительной обработки матрицы данных перед применениемsvd, какsvd = A->svd!(rpca(A)[1]). -
scaleU: изменяет масштаб входных каналов так, чтобы они имели одинаковую энергию. -
Aestimator: Функция средства оценки, используемая для оценкиA,C. По умолчанию используется`, т. е. наименьшие квадраты, но для повышения устойчивости к выбросам можно использовать робастные средства оценки, такие как `irls, flts, rtlsиз TotalLeastSquares.jl. -
Bestimator: Функция средства оценки, используемая для оценкиB,D. Взвешенную оценку можно получить, передавwlsиз TotalLeastSquares.jl вместе с именованным аргументомweights. -
weights: Вектор весов может быть предоставлен, еслиBestimatorимеет значениеwls.
Расширенная справка
Более точную модель предсказания иногда можно получить, используя newpem, которая также является несмещенной для данных замкнутого контура (subspaceid смещена для данных замкнутого контура, см. пример в документации). Метод на основе ошибки прогнозирования является итеративным и, как правило, более дорогим, чем subspaceid, и использует эту функцию (по умолчанию) для формирования начального предположения для оптимизации.
model, x0 = subspaceid(frd::FRD, Ts, args...; estimate_x0 = false, bilinear_transform = false, kwargs...)
Если предоставлен объект данных частотной характеристики
-
FRD автоматически преобразуется в
InputOutputFreqData. -
Для
estimate_x0по умолчанию задан 0. -
bilinear_transformпреобразует вектор частот в дискретное время, см. примечание ниже.
Примечание. Если данные частотных характеристик получены в результате анализа частотных характеристик, перед оценкой необходимо провести билинейное преобразование данных. Это преобразование будет применено, если bilinear_transform = true.
model, x0 = subspaceid(data::InputOutputFreqData,
Ts = data.Ts,
nx = :auto;
cont = false,
verbose = false,
r = nx === :auto ? min(length(data) ÷ 20, 20) : 2nx, # Внутренний порядок модели
zeroD = false,
estimate_x0 = true,
stable = true,
svd = svd!,
Aestimator = \,
Bestimator = \,
weights = nothing
)
Оценивает модель пространства состояний с помощью идентификации на основе подпространства в частотной области.
Если результаты неудовлетворительны, попробуйте изменить r, особенно если объем данных невелик.
Пример см. в документации.
Аргументы
-
data: объект идентификационных данных частотной области. -
Ts: интервал выборки, в который были собраны данные. -
nx: Желаемый порядок модели, целое число или:auto. -
cont: возвращать модель с непрерывным временем? Для преобразования оцененной модели с дискретным временем используется билинейное преобразование, см. функциюd2c. -
verbose: выводить что-либо? -
r: Внутренний порядок модели, значение должно быть больше или равноnx. -
zeroD: Позволяет сделать матрицуDнулевой. -
estimate_x0: оценка дополнительных параметров для учета начальных условий. Это может потребоваться, если данные получены в результате БПФ данных временной области, но может и не потребоваться, если данные собраны с помощью анализа частотных характеристик с точно периодическим входом и надлежащей обработкой переходных процессов. -
stable: Для обеспечения стабильности модели (используетсяschur_stab). -
svd: Используемая функцияsvd. -
Aestimator: Средство оценки матрицыA(и исходнойC-матрицы). -
Bestimator: средство оценки матриц B/D и C/D. -
weights: Необязательный вектор частотных весов, длина которого совпадает с количеством частот в `data.
#
ControlSystemIdentification.n4sid — Function
res = n4sid(data, r=:auto; verbose=false)
Оценивает модель пространства состояний с помощью метода n4sid. Возвращает объект типа N4SIDStateSpace, обеспечивающий доступ к модели в виде res.sys.
Реализует упрощенный алгоритм (alg 2), приведенный в работе N4SID: Subspace Algorithms for the Identification of Combined Deterministic Stochastic Systems, авторы: PETER VAN OVERSCHEE и BART DE MOOR
Идеи для частотного взвешивания взяты из работы Frequency Weighted Subspace Based System Identification in the Frequency Domain, Tomas McKelvey (1996). В частности, мы применяем весовую матрицу выходных частот (Fy) так, как она представлена в уравнениях. (16)--(18).
Аргументы
-
data: Идентификационные данныеdata = iddata(y,u) -
r: ранг модели (порядок модели) -
verbose: выводить что-либо? -
Wf: модель возмущений измерений в частотной области. Чтобы сфокусировать внимание модели на узкой полосе частот, попробуйте использовать что-то вродеWf = Bandstop(lower, upper, fs=1/Ts), чтобы указать, что существуют возмущения за пределами этой полосы. -
i: параметр алгоритма, обычно настраивать его не нужно. -
γ: задайте для него значение в диапазоне (0,1) для стабилизации неустойчивых моделей таким образом, чтобы наибольшее собственное значение имело величину γ. -
zeroD: значение по умолчанию — false
См. также более новую реализацию subspaceid, которая позволяет выбирать различные веса (n4sid — один из них). Более точную модель предсказания иногда можно получить, используя newpem, которая также является несмещенной для данных замкнутого контура.
#
ControlSystemIdentification.era — Function
era(YY::AbstractArray{<:Any, 3}, Ts, nx::Int, m::Int = 2nx, n::Int = 2nx)
Алгоритм реализации собственных значений. Алгоритм возвращает модель пространства состояний.
Аргументы
-
YY: Размер марковских параметров (импульсного отклика)ny × nu × n_time -
Ts: Интервал выборки -
nx: порядок модели -
m: количество строк в матрице Ганкеля -
n: количество столбцов в матрице Ганкеля
era(d::AbstractIdData, nx; m = 2nx, n = 2nx, l = 5nx, p = l, λ=0, smooth=false)
era(ds::Vector{IdData}, nx; m = 2nx, n = 2nx, l = 5nx, p = l, λ=0, smooth=false)
Алгоритм реализации собственных значений. Использует okid для нахождения марковских параметров в качестве начального шага.
Параметр l, скорее всего, потребуется настроить. Разумнее всего выбрать достаточное большое значение для l, чтобы импульсный отклик максимально рассеялся.
Если предоставлен вектор наборов данных, марковские параметры, оцененные из каждого эксперимента, усредняются перед вызовом era. Это позволяет использовать данные нескольких экспериментов для улучшения оценки модели
Аргументы
-
nx: порядок модели -
l: количество оцениваемых марковских параметров. -
λ: параметр регуляризации (им не стоит злоупотреблять, лучше провести больше экспериментов) -
smooth: Если задано значение true, регуляризация, заданная с помощьюλ, штрафует за кривизну в оцененном импульсном отклике. -
p: По желанию удалите первыеpстолбцов во внутренних матрицах Ганкеля, чтобы учесть начальные условия != 0. Еслиx0 != 0, то дляerapпо умолчанию будетl, а при прямом вызовеokidpпо умолчанию будет 0.
#
ControlSystemIdentification.okid — Function
H = okid(d::AbstractIdData, nx, l = 5nx; p = 1, λ=0, estimator = /)
Идентификация с помощью фильтра наблюдателя Калмана. Возвращает размер H ny × nu × (l+1) марковских параметров (импульсного отклика).
Параметр l, скорее всего, потребуется настроить. Разумнее всего выбрать достаточное большое значение для l, чтобы импульсный отклик максимально рассеялся.
Аргументы
-
nx: порядок модели -
l: количество оцениваемых марковских параметров (длина импульсного отклика). -
λ: параметр регуляризации -
smooth: Если задано значение true, регуляризация, заданная с помощьюλ, штрафует за кривизну в оцененном импульсном отклике. Еслиeraбудет использоваться послеokid, следует отдать предпочтение небольшомуλсsmooth=true, но, если импульсный отклик будет проверяться на глаз, большее сглаживание может дать визуально более точную оценку импульсного отклика. -
p: По желанию удалите первыеpстолбцов во внутренних матрицах Ганкеля, чтобы учесть начальные условия != 0. Еслиx0 != 0, попробуйте задать дляpпримерно то же значение, что и дляl. -
estimator: функция, используемая для оценки марковских параметров. По умолчанию используется/(наименьшие квадраты), но может быть и надежным вариантом, таким какTotalLeastSquares.irls / fltsилиTotalLeastSquares.tls, для полного решения по методу наименьших квадратов (ошибки в переменных)
#
ControlSystemsBase.observer_predictor — Function
observer_predictor(sys::N4SIDStateSpace; h=1)
Возвращает систему предикторов
с входным уравнением [B-KD K] * [u; y]
h ≥ 1 является горизонтом прогнозирования.
См. также описание noise_model и prediction_error_filter.
#
ControlSystemsBase.observer_controller — Function
observer_controller(sys::AbstractPredictionStateSpace, L)
Возвращает контроллер обратной связи по измерению, который принимает y и формирует управляющий сигнал u = -Lx̂. См. также описание ff_controller.
#
ControlSystemIdentification.prediction_error — Function
e = prediction_error(sys::AbstractStateSpace, d::AbstractIdData, args...; kwargs...)
Возвращает ошибки прогнозирования `d.y - predict(sys, d, …)
#
ControlSystemIdentification.prediction_error_filter — Function
prediction_error_filter(sys::AbstractPredictionStateSpace; h=1)
prediction_error_filter(sys::AbstractStateSpace, R1, R2; h=1)
Возвращает фильтр, который принимает [u; y] в качестве входных данных и выдает ошибку прогнозирования e = y - ŷ. См. также описание innovation_form и noise_model. h ≥ 1 является горизонтом прогнозирования. См. описание функции predictiondata для создания iddata с [u; y] в качестве входных данных.
#
ControlSystemIdentification.noise_model — Function
noise_model(sys::AbstractPredictionStateSpace)
Возвращает модель шума, управляющего системой v, в
Модель игнорирует u и задается следующим образом:
Также называется «инновационная форма». Эта функция вызывает ControlSystemsBase.innovation_form.