Экспортируемые функции и типы
Указатель
#
ControlSystemIdentification.FRD — Type
FRD(w, r)
Представляет данные частотной характеристики. w содержит вектор частоты, а r — характеристику. К методам, определенным для этого типа, относятся
Если r представляет собой частотную характеристику MIMO, ее измерения равны ny × nu × nω.
График объекта frd::FRD можно построить с помощью plot(frd, hz=false), если была вызвана команда using Plots.
#
ControlSystemIdentification.FRD — Method
FRD(w, sys::LTISystem)
Создает объект данных частотной характеристики, оценив частотную характеристику sys на частотах w.
#
ControlSystemIdentification.Hz — Type
Представляет частоты в герцах для индексирования объектов FRD: frd[2Hz:10Hz]
#
ControlSystemIdentification.N4SIDStateSpace — Type
N4SIDStateSpace <: AbstractPredictionStateSpace
Результат оценки модели пространства состояний с помощью метода n4sid.
Поля:
-
sys: оцениваемая модель в виде объектаStateSpace -
Q: оцениваемая ковариационная матрица состояний -
R: оцениваемая ковариационная матрица измерений -
S: оцениваемая матрица взаимной ковариации между состояниями и измерениями -
K: коэффициент усиления наблюдателя Калмана -
P: решение уравнения Риккати -
x: оцениваемая траектория состояния (n4sid) или начальное условие (subspaceid) -
s: сингулярное разложение -
fve: доля дисперсии, объясненная сингулярными значениями
#
ControlSystemIdentification.PredictionStateSpace — Type
PredictionStateSpace{T, ST <: AbstractStateSpace{T}, KT, QT, RT, ST2} <: AbstractPredictionStateSpace{T}
PredictionStateSpace(sys, K, Q=nothing, R=nothing, S=nothing)
Тип пространства состояний, содержащий дополнительную модель фильтра Калмана для целей прогнозирования.
Аргументы
-
sys: ОПИСАНИЕ -
K: коэффициент усиления Калмана в бесконечном интервале -
Q = nothing: ковариация динамики -
R = nothing: ковариация измерений -
S = nothing: взаимная ковариация
#
ControlSystemIdentification.rad — Type
Представляет частоты в рад/с для индексирования объектов FRD: frd[2rad:10rad]
#
ControlSystemIdentification.apply_fun — Function
apply_fun(fun, d::InputOutputData)
Применяет fun(y) ко всем временным рядам y[,u,[x]] ∈ d и возвращает новый iddata с преобразованными рядами.
#
ControlSystemIdentification.ar — Method
ar(d::AbstractIdData, na; λ=0, estimator=\, scaleB=false, stochastic=false)
Вычисляет авторегрессионную передаточную функцию G = 1/A; авторегрессионный процесс определяется как A(z⁻¹)y(t) = e(t)
Аргументы
-
d: IdData, см. описаниеiddata. -
na: порядок модели -
λ:λ > 0можно указать для регуляризации L₂. -
estimator: например,\,tls,irls,rtls -
scaleB: нужно ли масштабировать числитель с помощью дисперсии ошибки прогнозирования. -
stochastic: если задано значение true, возвращает передаточную функцию с неопределенными параметрами, представленнымиMonteCarloMeasurements.Particles.
Известно, что оценка авторегрессионных моделей методом наименьших квадратов затруднена при сильном шуме измерений, поэтому использование estimator = tls может улучшить результат в этом случае.
Пример
julia> N = 10000
10000
julia> e = [-0.2; zeros(N-1)] # шум e
10000-element Vector{Float64}:
[...]
julia> G = tf([1, 0], [1, -0.9], 1) # Авторегрессионная передаточная функция
TransferFunction{Discrete{Int64}, ControlSystemsBase.SisoRational{Float64}}
1.0z
----------
1.0z - 0.9
Sample Time: 1 (seconds)
Discrete-time transfer function model
julia> y = lsim(G, e, 1:N)[1][:] # Получение выходного сигнала авторегрессионной передаточной функции из входного шума e
10000-element Vector{Float64}:
[...]
julia> Gest = ar(iddata(y), 1) # Вычисление авторегрессионной передаточной функции из выходного y
TransferFunction{Discrete{Float64}, ControlSystemsBase.SisoRational{Float64}}
1.0z
-------------------------
1.0z - 0.8999999999999998
Sample Time: 1.0 (seconds)
Discrete-time transfer function model
julia> G ≈ Gest # Проверка правильности вычисления
true
julia> eest = lsim(1/Gest, y, 1:N)[1][:] # восстановление входного шума e из выходного y и вычисленной передаточной функции Gest
10000-element Vector{Float64}:
[...]
julia> isapprox(eest, e, atol = eps()) # входной шум корректно восстановлен
true
#
ControlSystemIdentification.arma — Method
model = arma(d::AbstractIdData, na, nc; initial_order=20, method=:ls)
Оценивает модель авторегрессионного скользящего среднего с коэффициентами na в знаменателе и коэффициентами nc в числителе. Возвращает модель и оцененную последовательность шумов, управляющих системой.
Аргументы
-
d: iddata -
initial_order: для оценки остатков используется начальная авторегрессионная модель этого порядка. -
estimator: Функция(A,y)->minimizeₓ(Ax-y)по умолчанию равна\, но есть и другой вариант —wtls_estimator(1:length(y)-initial_order,na,nc,ones(nc)).
См. также описание estimate_residuals.
#
ControlSystemIdentification.arma_ssa — Method
arma_ssa(d::AbstractIdData, na, nc; L=nothing, estimator=\, robust=false)
Выполняет подгонку моделей arma с помощью сингулярного спектрального анализа. Для разложения сигнала и шума на части выполняется факторизация с низким рангом (svd или robust svd). Затем шум используется в качестве входных данных для подгонки модели arma.
Аргументы
-
d: iddata -
na: количество параметров знаменателя -
nc: количество параметров числителя -
L: длина внедрения запаздывания, используемого для разделения сигнала и шума.nothingсоответствует автоматическому выбору. -
estimator: функция для решения задачи наименьших квадратов. Примеры\,tls,irls,rtls. -
robust: использование надежного PCA для обеспечения устойчивости к выбросам.
#
ControlSystemIdentification.arx — Method
Gtf = arx(d::AbstractIdData, na, nb; inputdelay = ones(Int, size(nb)), λ = 0, estimator=\, stochastic=false)
Выполняет подгонку передаточной функции к данным с помощью модели ARX и минимизации ошибки уравнения.
-
nbиnaпредставляют количество коэффициентов многочленов числителя и знаменателя.
Входную задержку можно добавить с помощью inputdelay = d, что соответствует дополнительной задержке z^-d. inputdelay = 0 Приводит к получению прямой составляющей. Высший порядок многочлена B задается с помощью nb + inputdelay - 1. λ > 0 можно указать для регуляризации L₂. estimator по умолчанию \ (наименьшие квадраты), альтернативами являются estimator = tls для полной оценки по методу наименьших квадратов. arx(Δt,yn,u,na,nb, estimator=wtls_estimator(y,na,nb) потенциально более устойчив в условиях сильного шума измерений. Количество свободных параметров равно na+nb
-
stochastic: если задано значение true, возвращает передаточную функцию с неопределенными параметрами, представленнымиMonteCarloMeasurements.Particles.
Поддерживает оценку MISO, предоставляя iddata с матрицей u, с nb = [nb₁, nb₂…] и дополнительным inputdelay = [d₁, d₂…].
Эта функция поддерживает несколько наборов данных, предоставляемых в виде вектора объектов iddata.
#
ControlSystemIdentification.arxar — Method
G, H, e = arxar(d::InputOutputData, na::Int, nb::Union{Int, Vector{Int}}, nd::Int)
Оценивает модель ARXAR Ay = Bu + v, где v = He и H = 1/D, используя обобщенный метод наименьших квадратов. Дополнительные сведения см. в работе Сёдерстёма (Söderström) Convergence properties of the generalized least squares identification method, 1974.
Аргументы
-
d: iddata -
na: порядок A -
nb: количество коэффициентов в B, порядок определяется с помощьюnb + inputdelay - 1. При оценке MISO он имеет видnb = [nb₁, nb₂...]. -
nd: порядок D
Именованные аргументы
-
H = nothing: предварительные знания об авторегрессионной модели шума. -
inputdelay = ones(Int, size(nb)): необязательная задержка входных данных, inputdelay = 0 приводит к получению прямой составляющей, принимает вид inputdelay = [d₁, d₂…] при оценке MISO. -
λ = 0:λ > 0можно указать для регуляризации L₂. -
estimator = \: например,\,tls,irls,rtls, для трех последних требуетсяusing TotalLeastSquares. -
δmin = 10e-4: минимальное изменение степени e, указывающее на сходимость. -
iterations = 10: максимальное количество итераций. -
verbose = false: если задано значение true, выводятся дополнительные сведения.
Пример:
julia> N = 500
500
julia> sim(G, u) = lsim(G, u, 1:N)[1][:]
sim (generic function with 1 method)
julia> A = tf([1, -0.8], [1, 0], 1)
TransferFunction{Discrete{Int64}, ControlSystemsBase.SisoRational{Float64}}
1.0z - 0.8
----------
1.0z
Sample Time: 1 (seconds)
Discrete-time transfer function model
julia> B = tf([0, 1], [1, 0], 1)
TransferFunction{Discrete{Int64}, ControlSystemsBase.SisoRational{Int64}}
1
-
z
Sample Time: 1 (seconds)
Discrete-time transfer function model
julia> G = minreal(B / A)
TransferFunction{Discrete{Int64}, ControlSystemsBase.SisoRational{Float64}}
1.0
----------
1.0z - 0.8
Sample Time: 1 (seconds)
Discrete-time transfer function model
julia> D = tf([1, 0.7], [1, 0], 1)
TransferFunction{Discrete{Int64}, ControlSystemsBase.SisoRational{Float64}}
1.0z + 0.7
----------
1.0z
Sample Time: 1 (seconds)
Discrete-time transfer function model
julia> H = 1 / D
TransferFunction{Discrete{Int64}, ControlSystemsBase.SisoRational{Float64}}
1.0z
----------
1.0z + 0.7
Sample Time: 1 (seconds)
Discrete-time transfer function model
julia> u, e = randn(1, N), randn(1, N)
[...]
julia> y, v = sim(G, u), sim(H * (1/A), e) # моделирование процесса
[...]
julia> d = iddata(y .+ v, u, 1)
InputOutput data of length 500 with 1 outputs and 1 inputs
julia> na, nb , nd = 1, 1, 1
(1, 1, 1)
julia> Gest, Hest, res = arxar(d, na, nb, nd)
(G = TransferFunction{Discrete{Int64}, ControlSystemsBase.SisoRational{Float64}}
0.9987917259291642
-------------------------
1.0z - 0.7937837464682017
Sample Time: 1 (seconds)
Discrete-time transfer function model, H = TransferFunction{Discrete{Int64}, ControlSystemsBase.SisoRational{Float64}}
1.0z
-------------------------
1.0z + 0.7019519225937721
Sample Time: 1 (seconds)
Discrete-time transfer function model, e = [...]
#
ControlSystemIdentification.autocorplot — Function
autocorplot(y, Ts, [lags])
Строит график автокорреляции y для lags, которая по умолчанию равна 1:size(y, 2)÷2.
#
ControlSystemIdentification.coherence — Method
κ² = coherence(d; n = length(d)÷10, noverlap = n÷2, window=hamming, method=:welch)
Вычисляет и строит график функции когерентности с квадратом величины. κ² с величиной, близкой к 1, указывает на хорошую объяснимость энергии в выходном сигнале энергией входного сигнала. κ² << 1 указывает на то, что либо система нелинейна, либо сильный шум занимает значительную часть в выходной энергии.
-
κ: Квадратичная функция когерентности в виде
FRD. -
method::welchили:corr.:welchиспользует метод Велча для оценки спектральной плотности мощности, а:corrиспользует метод коррелограммы. Дляmethod = :corrдополнительный именованный аргументσопределяет ширину гауссова окна, применяемого к оцененным корреляционным функциям перед БПФ. Большее значениеσподразумевает меньшее сглаживание.
См. также описание coherenceplot.
Расширенная справка
Для модели сигнала y = Gu + v κ² определяется следующим образом
откуда следует, что 0 ≤ κ² ≤ 1 и что κ² близка к 1, если энергия шума S*{vv} мала по сравнению с выходной энергией, обусловленной входными данными S*{uu}\|G(iω)\|\^2.
#
ControlSystemIdentification.coherenceplot — Function
coherenceplot(d, [(;n=..., noverlap=...); hz=false)
Вычисляет и строит график функции (квадрата) когерентности κ. κ с величиной, близкой к 1, указывает на хорошую объяснимость энергии в выходном сигнале энергией входного сигнала. κ << 1 указывает на то, что либо система нелинейна, либо сильный шум занимает значительную часть в выходной энергии.
hz указывает на герцы вместо рад/с.
Именованные аргументы для coherence предоставляются в виде именованного кортежа в качестве второго позиционного аргумента.
#
ControlSystemIdentification.crosscorplot — Function
crosscorplot(data, [lags])
crosscorplot(u, y, Ts, [lags])
Строит график взаимной корреляции между входом и выходом для lags, который по умолчанию составляет 10 % от длины набора данных с отрицательной стороны и 50 % с положительной стороны, но не более 100 с каждой стороны.
#
ControlSystemIdentification.detrend — Method
detrend(d::AbstractArray)
detrend(d::AbstractIdData)
Удаляет среднее значение из d.
#
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: количество столбцов в матрице Ганкеля
#
ControlSystemIdentification.era — Function
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.estimate_residuals — Method
estimate_residuals(model, y)
Оценивает остатки, определяющие динамику модели ARMA.
#
ControlSystemIdentification.estimate_x0 — Function
estimate_x0(sys, d, n = min(length(d), 3 * slowest_time_constant(sys)); fixed = fill(NaN, sys.nx)
Оценивает начальное состояние системы.
Аргументы
-
d:iddata -
n: количество используемых выборок. -
fixed: Если задан вектор той же длины, что иx0, конечные значения указывают на фиксированные значения, которые не подлежат оценке, а неограниченные значения являются свободными.
Пример
sys = ssrand(2,3,4, Ts=1)
x0 = randn(sys.nx)
u = randn(sys.nu, 100)
y,t,x = lsim(sys, u; x0)
d = iddata(y, u, 1)
x0h = estimate_x0(sys, d, 8, fixed=[Inf, x0[2], Inf, Inf])
x0h[2] == x0[2] # Должно быть точное равенство
norm(x0-x0h) # Должен быть небольшим
#
ControlSystemIdentification.filter_bank — Method
filter_bank(basis::AbstractStateSpace{<:Discrete}, signal::AbstractMatrix)
Фильтрует signal во всех системах в basis.
#
ControlSystemIdentification.find_na — Function
find_na(y::AbstractVector,n::Int)
Строит графики RMSE и AIC. Для порядков моделей, не превышающих n. Полезна для выбора моделей.
#
ControlSystemIdentification.find_nanb — Function
find_nanb(d::InputOutputData, na, nb; logrms = false, method = :aic)
Строит графики RMSE и AIC. Для порядков моделей, не превышающих na, nb. Полезна для выбора моделей. na может быть целым числом или диапазоном. То же самое относится и к nb.
-
logrmsопределяет, строить ли график логарифма среднеквадратичной ошибки по основанию 10. -
method: определяет, использовать ли для определения порядка модели информационный критерий Акаике (:aic) или итоговую ошибку прогнозирования (:fpe).
Если цветовая шкала трудночитаема из-за нескольких плиток, представляющих очень большие ошибки, старайтесь не рисовать эти плитки, указывая диапазоны na и nb вместо целых чисел. Например, не показывайте порядок модели меньше 2, используя find_nanb(d, 3:na, 3:nb)
#
ControlSystemIdentification.find_similarity_transform — Function
find_similarity_transform(sys1, sys2, method = :obsv)
Находит T так, что ControlSystemsBase.similarity_transform(sys1, T) == sys2
Источник: Minimal state-space realization in linear system theory: an overview, B. De Schutter
Если method == :obsv, для нахождения T используются матрицы наблюдаемости sys1 и sys2, а method == :ctrb использует матрицы управляемости.
julia> T = randn(3,3);
julia> sys1 = ssrand(1,1,3);
julia> sys2 = ControlSystemsBase.similarity_transform(sys1, T);
julia> T2 = find_similarity_transform(sys1, sys2);
julia> T2 ≈ T
true
#
ControlSystemIdentification.freqvec — Method
freqvec(h, k)
Возвращает вектор частот длиной k для систем с интервалом выборки h.
#
ControlSystemIdentification.getARXregressor — Method
getARXregressor(y::AbstractVector,u::AbstractVecOrMat, na, nb; inputdelay = ones(Int, size(nb)))
Возвращает сокращенный выходной сигнал y и матрицу регрессии A — такую, что оценка модели ARX методом наименьших квадратов порядка na,nb равна y\A.
Возвращает матрицу регрессии, используемую для подгонки модели ARX, например в виде A(z)y = B(z)u с выходными данными y и входными данными u, где порядок авторегрессии равен na, порядок входного скользящего среднего равен nb, и необязательная входная задержка равна inputdelay. Внимание: при изменении входной задержки порядок изменяется на nb + inputdelay - 1. inputdelay = 0 Приводит к получению прямой составляющей.
Пример
A = [1,2*0.7*1,1] # Коэффициенты A(z)
B = [10,5] # Коэффициенты B(z)
u = randn(100) # Моделирование 100 временных шагов с гауссовым входом
y = filt(B,A,u)
yr,A = getARXregressor(y,u,3,2) # Предполагается, что известен системный порядок — 3,2
x = A\yr # Оценка многочленов модели
plot([yr A*x], lab=["Signal" "Prediction"])
Нелинейные модели ARX см. в описании BasisFunctionExpansions.jl. См. также описание arx.
#
ControlSystemIdentification.getARregressor — Method
yt,A = getARregressor(y::AbstractVector, na)
Возвращает такие значения, что x = A\yt. Дополнительные сведения см. в описании getARXregressor.
#
ControlSystemIdentification.iddata — Function
iddata(y, Ts = nothing)
iddata(y, u, Ts = nothing)
iddata(y, u, x, Ts = nothing)
Создает объект идентификационных данных временной области.
Аргументы
-
y::AbstractArray: выходные данные (обязательно) -
u::AbstractArray: входные данные (если доступны) -
x::AbstractArray: данные состояния (если доступны) -
Ts::Union{Real,Nothing} = nothing: дополнительный интервал выборки
Если временные ряды являются многомерными, время находится в последнем измерении, то есть размеры массивов равны (num_variables, num_timepoints) (см. примеры ниже).
Операции с iddata
-
Добавление двух к временному измерению
[d1 d2](это делается только в том случае, если состояние системы в концеd1близко к состоянию в началеd2) -
Индексирование временных рядов
d[output_index, input_index] -
Индексирование оси времени с помощью индексов
d[time_indices] -
Индексирование оси времени с помощью секунд
d[3Sec:12Sec](using ControlSystemIdentification: Sec) -
Доступ к количеству входных данных, выходных данных и времени выборки:
d.nu, d.ny, d.Ts -
Доступ к вектору времени
d.t -
Умножение в обычном порядке для масштабирования выходных данных
C * d. Перед оценкой модели обычно рекомендуется масштабировать выходные данные системы с несколькими выводами так, чтобы они имели примерно одинаковый размер, в случае если они имеют разную величину. -
Умножение в обычном порядке для масштабирования входных данных
d * B -
plot
Примеры
julia> iddata(randn(10))
Output data of length 10 with 1 outputs, Ts = nothing
julia> iddata(randn(10), randn(10), 1)
InputOutput data of length 10, 1 outputs, 1 inputs, Ts = 1
julia> d = iddata(randn(2, 10), randn(3, 10), 0.1)
InputOutput data of length 10, 2 outputs, 3 inputs, Ts = 0.1
julia> [d d] # Конкатенация по времени
InputOutput data of length 20, 2 outputs, 3 inputs, Ts = 0.1
julia> d[1:3]
InputOutput data of length 3, 2 outputs, 3 inputs, Ts = 0.1
julia> d.nu
3
julia> d.t # доступ к вектору времени
0.0:0.1:0.9
Использование нескольких наборов данных
Некоторые методы оценки поддерживают использование нескольких наборов данных для оценки модели. В этом случае наборы данных предоставляются в виде вектора объектов iddata. Вот эти методы:
Некоторые другие методы оценки можно адаптировать для использования нескольких наборов данных с минимальными изменениями.
Иногда несколько наборов данных можно также обрабатывать путем конкатенации. Для этого состояние системы в конце одного набора данных должно быть близко к состоянию в начале следующего. Например, все эксперименты должны начинаться и заканчиваться в одной и той же рабочей точке.
#
ControlSystemIdentification.iddata — Method
iddata(y::AbstractArray, u::AbstractArray, w::AbstractVector)
Создает объект входных-выходных данных частотной области. w должен быть указан в рад/с.
#
ControlSystemIdentification.iddata — Method
iddata(res::ControlSystemsBase.SimResult)
Создает объект идентификационных данных непосредственно из результатов моделирования.
#
ControlSystemIdentification.impulseest — Method
ir, t, Σ = impulseest(d::AbstractIdData, n; λ=0, estimator=ls)
Оценивает импульсный отклик системы путем подгонки FIR-модели n-го порядка. Возвращает оценку импульсного отклика, вектор времени и ковариационную матрицу.
Эта функция поддерживает только данные с одним выходным значением. Для данных с несколькими выходными значениями используйте okid.
См. также описание impulseestplot и okid.
#
ControlSystemIdentification.impulseestplot — Function
impulseestplot(data,n; σ = 2)
Оценивает импульсный отклик системы путем подгонки FIR-модели n-го порядка и строит график результата с доверительной полосой 95 % (2σ). Обратите внимание, что доверительная полоса строится вокруг нуля, то есть она строится таким образом, чтобы можно было определить, существенно ли отличается импульсный отклик от нуля.
Этот метод поддерживает только данные с одним выходным значением. Для данных с несколькими выходными значениями используйте okid.
См. также описание impulseest и okid.
#
ControlSystemIdentification.kautz — Method
kautz(a::Vector, h)
Создает базис Каутца с дискретным временем с полюсами в точке a и временем выборки h.
#
ControlSystemIdentification.laguerre — Method
laguerre(a::Number, Nq)
Создает базис Лагерра длиной Nq с полюсами в точке -a.
#
ControlSystemIdentification.laguerre_id — Method
laguerre_id(a::Number, Nq, Ts)
Создает базис Лагерра с дискретным временем длиной Nq с полюсами в точке -a для идентификации системы.
ПРИМЕЧАНИЕ. При больших значениях Nq этот базис может быть численно плохо обусловлен. Рекомендуется применить balance_statespace к полученному базису.
#
ControlSystemIdentification.laguerre_oo — Method
laguerre_oo(a::Number, Nq)
Создает выходной ортогонализированный базис Лагерра длиной Nq с полюсами в точке -a.
#
ControlSystemIdentification.minimum_phase — Method
minimum_phase(G)
Перемещает нули и полюса G из неустойчивой полуплоскости в устойчивую. Если G является системой с пространством состояний, сначала она преобразуется в передаточную функцию. Это может привести к потере точности.
#
ControlSystemIdentification.model_spectrum — Method
model_spectrum(f, h, args...; kwargs...)
Аргументы
-
f: функция оценки модели, напримерar,arma -
h: интервал выборки -
args: аргументы дляf -
kwargs: именованные аргументы дляf
Пример:
using ControlSystemIdentification, DSP T = 1000 s = sin.((1:T) .* 2pi/10) S1 = spectrogram(s,window=hanning) estimator = model_spectrum(ar,1,2) S2 = spectrogram(s,estimator,window=rect) plot(plot(S1),plot(S2)) # Требуется пакет LPVSpectral.jl
#
ControlSystemIdentification.modelfit — Method
modelfit(y, yh)
Вычисляет соответствие модели yh для y в процентах, иногда называемое нормализованной среднеквадратичной ошибкой (NRMSE).
Выходное значение 100 означает идеальную подгонку, выходное значение 0 означает, что подгонка не лучше, чем среднее значение по данным. Отрицательные значения возможны, если прогнозирование хуже, чем прогнозирование среднего значения данных.
#
ControlSystemIdentification.n4sid — Method
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.newpem — Method
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.noise_model — Method
noise_model(sys::AbstractPredictionStateSpace)
Возвращает модель шума, управляющего системой v, в
Модель игнорирует u и задается следующим образом:
Также называется «инновационная форма». Эта функция вызывает ControlSystemsBase.innovation_form.
#
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, для полного решения по методу наименьших квадратов (ошибки в переменных)
#
ControlSystemIdentification.plr — Method
G, Gn = plr(d::AbstractIdData,na,nb,nc; initial_order = 20)
Выполняет псевдолинейную регрессию для оценки модели в форме. Ay = Bu + Cw Остаточная последовательность оценивается сначала путем оценки модели arx высокого порядка, после чего оцененная остаточная последовательность включается во вторую задачу оценки. Возвращаемыми значениями являются оцененная модель системы и оцененная модель шума. G и Gn всегда будут иметь один и тот же многочлен в знаменателе.
#
ControlSystemIdentification.prediction_error — Method
e = prediction_error(sys::AbstractStateSpace, d::AbstractIdData, args...; kwargs...)
Возвращает ошибки прогнозирования `d.y - predict(sys, d, …)
#
ControlSystemIdentification.prediction_error_filter — Method
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.predictiondata — Method
predictiondata(d::AbstractIdData)
Добавляет выходное значение y к входному u_new = [u; y]
#
ControlSystemIdentification.predplot — Function
predplot(sys, data, x0=:estimate; ploty=true, plote=false, h=1, sysname="")
Строит графики h-шагового прогнозирования системы и измеренных выходных данных для их сравнения.
По умолчанию начальное условие x0 оценивается с использованием данных. Чтобы начать моделирование из источника, укажите x0 = :zero или x0 = zeros(sys.nx).
-
plotyопределяет, строить ли график измеренного сигнала. -
ploteопределяет, строить ли график остатка. -
hявляется горизонтом прогнозирования.
#
ControlSystemIdentification.prefilter — Method
prefilter(f, d::InputOutputData)
Применяет коэффициенты фильтрации к идентификационным данным
#
ControlSystemIdentification.prefilter — Method
prefilter(d::AbstractIdData, responsetype::FilterType)
Фильтрует входные и выходные значения данных идентификации с помощью нуль-фазовой фильтрации (filtfilt). Поскольку фильтруются и входные, и выходные данные, линейная идентификация не будет затронута никаким другим способом, кроме как фокусировкой на выбранном частотном диапазоне, т. е. диапазоне, который имеет высокий коэффициент усиления в предоставленном фильтре. Обратите внимание, что, если система, создавшая d, нелинейна, такое преобразование может сильно повлиять на идентификацию. Проверьте линейность, например с помощью coherenceplot.
#
ControlSystemIdentification.prefilter — Method
prefilter(d::AbstractIdData, l::Number, u::Number)
Фильтрует входные и выходные данные с помощью полосового пропускающего фильтра в диапазоне от l до u Гц. Если l = 0, будет использоваться низкочастотный фильтр, а если u = Inf, — высокочастотный.
#
ControlSystemIdentification.ramp_in — Method
ramp_in(d::InputOutputData, h::Int; rev = false)
Умножает начальные h выборок входного и выходного сигналов с линейно возрастающим темпом.
#
ControlSystemIdentification.ramp_out — Method
ramp_out(d::InputOutputData, h::Int)
Умножает конечные h выборок входного и выходного сигналов с линейно убывающим темпом.
#
ControlSystemIdentification.residualplot — Function
residualplot(model, data)
Строит графики остаточной автокорреляции и корреляции между входным сигналом и остатком.
#
ControlSystemIdentification.schur_stab — Method
schur_stab(A::AbstractMatrix{T}, ϵ = 0.01)
Стабилизирует собственные значения матрицы A с дискретным временем путем преобразования матрицы A в комплексную. Форма Шура и проецирование неустойчивых собственных значений 1-ϵ < λ ≤ 2 на единичный диск. Для собственных значений больше двух задается нуль.
#
ControlSystemIdentification.simplot — Function
simplot(sys, data, x0=:estimate; ploty=true, plote=false, sysname="")
Строит графики моделирования системы и измеренных выходных данных для их сравнения.
По умолчанию начальное условие x0 оценивается с использованием данных. Чтобы начать моделирование из источника, укажите x0 = :zero или x0 = zeros(sys.nx).
-
plotyопределяет, строить ли график измеренного сигнала. -
ploteопределяет, строить ли график остатка.
#
ControlSystemIdentification.subspaceid — Method
model, x0 = subspaceid(frd::FRD, Ts, args...; estimate_x0 = false, bilinear_transform = false, kwargs...)
Если предоставлен объект данных частотной характеристики
-
FRD автоматически преобразуется в
InputOutputFreqData. -
Для
estimate_x0по умолчанию задан 0. -
bilinear_transformпреобразует вектор частот в дискретное время, см. примечание ниже.
Примечание. Если данные частотных характеристик получены в результате анализа частотных характеристик, перед оценкой необходимо провести билинейное преобразование данных. Это преобразование будет применено, если bilinear_transform = true.
#
ControlSystemIdentification.subspaceid — Method
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, и использует эту функцию (по умолчанию) для формирования начального предположения для оптимизации.
#
ControlSystemIdentification.subspaceid — Method
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.tfest — Function
tfest(
data::FRD,
p0,
link = log ∘ abs;
freq_weight = sqrt(data.w[1]*data.w[end]),
refine = true,
opt = BFGS(),
opts = Optim.Options(
store_trace = true,
show_trace = true,
show_every = 1,
iterations = 100,
allow_f_increases = false,
time_limit = 100,
x_tol = 0,
f_tol = 0,
g_tol = 1e-8,
f_calls_limit = 0,
g_calls_limit = 0,
),
)
Выполняет подгонку параметрической передаточной функции к данным в частотной области.
На начальном этапе оптимизации решается следующее:
а на втором этапе (если refine=true) решается следующее:
(abs2(link(B/A) - link(l)))
Аргументы
-
data: ОбъектFRDс данными частотной области. -
p0: начальное предположение параметров. Может бытьNamedTupleилиComponentVectorс полямиb,a, задающими числитель и знаменатель в том виде, в каком они появляются при вызовеtf, т. е.(b = [1.0], a = [1.0,1.0,1.0]). Также может быть экземпляромTransferFunction. -
link: по умолчанию информация об этапе отбрасывается при подгонке. Чтобы включить этап, измените наlink = log. -
freq_weight: применяет взвешивание с обратной частотой. Это значение определяет частоту среза, до которой вес постоянен и после которой вес линейно уменьшается. По умолчанию используется среднее геометрическое значение наименьшей и наибольшей частоты. -
refine: указывает, выполняется ли второй этап оптимизации для уточнения результатов первого. -
opt: используемый оптимизатор Optim. -
opts:Optim.Options— управление параметрами решателя.
См. также описание minimum_phase для преобразования возможно неминимально фазовой системы в минимально фазовую.
#
ControlSystemIdentification.tfest — Function
H, N = tfest(data, σ = 0.05, method = :corr)
Оценивает модель передаточной функции с помощью коррелограммы (задано умолчанию), используя модель сигнала y = H(iω)u + n.
И H, и N имеют тип FRD (данные частотной характеристики).
-
σопределяет ширину гауссова окна, применяемого к оцененным корреляционным функциям перед БПФ. Большее значениеσподразумевает меньшее сглаживание. -
H= Syu/Suu Передаточная функция процесса -
N= Sy - |Syu|²/Suu Оцениваемая PSD шума (также оценка дисперсииH). Обратите внимание, PSD связана с моделью шумаN*m, используемой в литературе по идентификации систем, какN*{psd}} = N*m\^* N*m. Кривая величины модели шума может быть визуализирована путем построения графика√(N). -
method::welchили:corr.:welchиспользует метод Велча для оценки спектральной плотности мощности, а:corr(по умолчанию) — метод коррелограммы. Еслиmethod = :welch, дополнительные именованные аргументыn,noverlapиwindowопределяют количество образцов на сегмент (по умолчанию 10 % данных), количество образцов, перекрываемых между сегментами (по умолчанию 50 %), и используемую функцию окна (по умолчаниюhamming) соответственно.
Расширенная справка
Этот метод оценки является несмещенным, если входной сигнал u нескоррелирован с шумом n, но в противном случае является смещенным (например, при идентификации в замкнутом контуре).
#
ControlSystemIdentification.tfest — Method
tfest(data::FRD, basis::AbstractStateSpace;
freq_weight = 1 ./ (data.w .+ data.w[2]),
opt = BFGS(),
metric::M = abs2,
opts = Optim.Options(
store_trace = true,
show_trace = true,
show_every = 50,
iterations = 1000000,
allow_f_increases = false,
time_limit = 100,
x_tol = 1e-5,
f_tol = 0,
g_tol = 1e-8,
f_calls_limit = 0,
g_calls_limit = 0,
)
Выполняет подгонку параметрической передаточной функции к данным в частотной области использованием заранее заданного базиса.
Аргументы
-
data: ОбъектFRDс данными частотной области.
функция kautz(a::AbstractVector)
-
basis: базис для оценки. См., например, описаниеlaguerre, laguerre_oo, kautz. -
freq_weight: вектор весов на частоту. По умолчанию это значение равно примерно1/f. -
opt: используемый оптимизатор Optim. -
opts:Optim.Options— управление параметрами решателя.
#
ControlSystemIdentification.wtls_estimator — Function
wtls_estimator(y,na,nb, σu=0)
Создает функцию средства оценки для оценки моделей arx при наличии шума измерений. Если известна дисперсия шума на входе σu (ошибки модели), ее можно задать для повышения точности.
#
DSP.Filters.resample — Method
DSP.resample(sys::AbstractStateSpace{<:Discrete}, Qd::AbstractMatrix, newh::Real)
Изменяет интервал выборки ковариационной матрицы Qd, принадлежащей sys, на newh. Эта функция не обрабатывает ковариацию измерений. Способ выполнения этой задачи зависит от контекста. Если сигнал из более быстрой выборки имеет такой же уровень шума при измерении, ничего менять не нужно. Если сигнал из медленной выборки был подвергнут пониженной дискретизации с помощью фильтрации, ковариация измерений должна увеличиться, если система перейдет на более высокую частоту дискретизации. Для поддержки частотной характеристики системы необходимо соответствующим образом изменить ковариацию измерений.
Аргументы
-
sys: Система с дискретным временем, имеющая ковариационную матрицу шума динамикиQd. -
Qd: ковариационная матрица шума динамики. -
newh: новый интервал выборки.
#
DSP.Filters.resample — Method
resample(sys::AbstractStateSpace{<:Discrete}, newh::Real)
Изменяет интервал выборки sys на newh.
#
DSP.Filters.resample — Method
dr = resample(d::InputOutputData, f)
Выполняет повторную выборку iddata d с долей f, например f = fs_new / fs_original.
#
StatsAPI.predict — Method
yh = predict(ar::TransferFunction, y)
Прогнозирование авторегрессионной модели
#
StatsAPI.predict — Method
predict(ARX::TransferFunction, d::InputOutputData)
Прогнозирование на шаг вперед для процесса ARX. Длина возвращаемого прогнозирования равна length(d) - max(na, nb).
Пример:
julia> predict(tf(1, [1, -1], 1), iddata(1:10, 1:10))
9-element Vector{Int64}:
2
4
6
8
10
12
14
16
18
#
StatsAPI.residuals — Method
residuals(ARX::TransferFunction, d::InputOutputData)
Вычисляет остатки v = Ay - Bu процесса ARX и InputOutputData d. Длина возвращаемых остатков равна length(d) - max(na, nb).
Пример:
julia> ARX = tf(1, [1, -1], 1)
TransferFunction{Discrete{Int64}, ControlSystemsBase.SisoRational{Int64}}
1
-----
z - 1
Sample Time: 1 (seconds)
Discrete-time transfer function model
julia> u = 1:5
1:5
julia> y = lsim(ARX, u, 1:5)[1][:]
5-element Vector{Float64}:
0.0
1.0
3.0
6.0
10.0
julia> d = iddata(y, u)
InputOutput data of length 5 with 1 outputs and 1 inputs
julia> residuals(ARX, d)
4-element Vector{Float64}:
0.0
0.0
0.0
0.0
#
DelimitedFiles.writedlm — Function
DelimitedFiles.writedlm(io::IO, d::AbstractIdData, args...; kwargs...)
Записывает идентификационные данные на диск.
#
ControlSystemsBase.c2d — Function
c2d(w::AbstractVector{<:Real}, Ts; w_prewarp = 0)
c2d(frd::FRD, Ts; w_prewarp = 0)
Преобразует вектор частот с непрерывным временем w или данные частотных характеристик frd из непрерывного в дискретное время с помощью билинейного преобразования (метод Тастина). Это полезно в тех случаях, когда частотная характеристика получена с помощью анализа частотной характеристики и необходимо использовать функцию subspaceid.