Этот пример показывает, как оценить параметры в пользовательских структурах модели. Такие структуры заданы моделями IDGREY (линейное пространство состояний) или IDNLGREY (нелинейное пространство состояний). Мы рассмотрим, как присвоить структуру, исправить параметры и создать зависимости среди них.
Мы исследуем данные, полученные (моделируемым) двигателем постоянного тока. Сначала загружаем данные:
load dcmdata
who
Your variables are: text u y
Матрица y
содержит два выхода: y1
- угловое положение вала мотора и y2
- скорость вращения. Существует 400 выборок данных, и шаг расчета составляет 0,1 секунды. Вход содержится в векторе u
. Это вход напряжение на двигатель.
z = iddata(y,u,0.1); % The IDDATA object z.InputName = 'Voltage'; z.OutputName = {'Angle';'AngVel'}; plot(z(:,1,:))
Фигура: Данные измерения: Напряжение к углу
plot(z(:,2,:))
Фигура: Данные измерения: Напряжение к скорости вращения
d/dt x = A x + B u + K e y = C x + D u + e
Мы создадим модель двигателя постоянного тока. Динамика двигателя хорошо известна. Если мы выберем x1 в качестве углового положения и x2 в качестве скорости вращения, легко настроить модель пространства состояний следующего символа, пренебрегающего нарушениями порядка: (см. Пример 4.1 в Ljung (1999):
| 0 1 | | 0 | d/dt x = | | x + | | u | 0 -th1 | | th2 |
| 1 0 | y = | | x | 0 1 |
Значение параметра th1
является ли здесь обратная временная константа двигателя и th2
таков, что th2/th1
- статический коэффициент усиления от входного параметра до скорости вращения. (Смотрите Ljung (1987), как th1
и th2
относятся к физическим параметрам двигателя). Мы оценим эти два параметра по наблюдаемым данным. Структура модели (параметризованное пространство состояний), описанная выше, может быть представлена в MATLAB ® с использованием моделей IDSS и IDGREY. Эти модели позволяют вам выполнить оценку параметров с помощью экспериментальных данных.
Если предположить, что th1 = 1 и th2 = 0,28 мы получаем номинальную или начальную модель
A = [0 1; 0 -1]; % initial guess for A(2,2) is -1 B = [0; 0.28]; % initial guess for B(2) is 0.28 C = eye(2); D = zeros(2,1);
и мы упакуем это в объект модели IDSS:
ms = idss(A,B,C,D);
Модель характеризуется своими матрицами, их значениями, какие элементы свободны (будут оценены) и верхними и нижними пределами тех:
ms.Structure.a
ans = Name: 'A' Value: [2x2 double] Minimum: [2x2 double] Maximum: [2x2 double] Free: [2x2 logical] Scale: [2x2 double] Info: [2x2 struct] 1x1 param.Continuous
ms.Structure.a.Value ms.Structure.a.Free
ans = 0 1 0 -1 ans = 2x2 logical array 1 1 1 1
Поэтому теперь мы должны отметить, что только A (2,2) и B (2,1) являются свободными параметрами, которые должны быть оценены.
ms.Structure.a.Free = [0 0; 0 1]; ms.Structure.b.Free = [0; 1]; ms.Structure.c.Free = 0; % scalar expansion used ms.Structure.d.Free = 0; ms.Ts = 0; % This defines the model to be continuous
ms % Initial model
ms = Continuous-time identified state-space model: dx/dt = A x(t) + B u(t) + K e(t) y(t) = C x(t) + D u(t) + e(t) A = x1 x2 x1 0 1 x2 0 -1 B = u1 x1 0 x2 0.28 C = x1 x2 y1 1 0 y2 0 1 D = u1 y1 0 y2 0 K = y1 y2 x1 0 0 x2 0 0 Parameterization: STRUCTURED form (some fixed coefficients in A, B, C). Feedthrough: none Disturbance component: none Number of free coefficients: 2 Use "idssdata", "getpvec", "getcov" for parameters and their uncertainties. Status: Created by direct construction or transformation. Not estimated.
Оценка ошибки предсказания (максимальной вероятности) параметров теперь вычисляется:
dcmodel = ssest(z,ms,ssestOptions('Display','on')); dcmodel
dcmodel = Continuous-time identified state-space model: dx/dt = A x(t) + B u(t) + K e(t) y(t) = C x(t) + D u(t) + e(t) A = x1 x2 x1 0 1 x2 0 -4.013 B = Voltage x1 0 x2 1.002 C = x1 x2 Angle 1 0 AngVel 0 1 D = Voltage Angle 0 AngVel 0 K = Angle AngVel x1 0 0 x2 0 0 Parameterization: STRUCTURED form (some fixed coefficients in A, B, C). Feedthrough: none Disturbance component: none Number of free coefficients: 2 Use "idssdata", "getpvec", "getcov" for parameters and their uncertainties. Status: Estimated using SSEST on time domain data "z". Fit to estimation data: [98.35;84.42]% FPE: 0.001071, MSE: 0.1192
Оценочные значения параметров довольно близки к тем, которые использовались при моделировании данных (-4 и 1). Чтобы оценить качество модели, мы можем симулировать модель с фактическим входом и сравнить ее с фактическим выходом.
compare(z,dcmodel);
Теперь мы можем, например, построить графики нулей и полюсов и их областей неопределенности. Мы нарисуем области, соответствующие 3 стандартным отклонениям, поскольку модель довольно точная. Обратите внимание, что шест в источник абсолютно уверен, поскольку он является частью структуры модели; интегратор от скорости вращения до положения.
clf showConfidence(iopzplot(dcmodel),3)
Теперь мы можем внести различные изменения. 1,2-элемент A-матрицы (фиксированный на 1) говорит нам, что x2
является производной x1
. Предположим, что датчики не калиброваны, так что может быть неизвестная константа пропорциональности. Чтобы включить оценку такой константы, мы просто «отпустим» A(1,2)
и переоценку:
dcmodel2 = dcmodel; dcmodel2.Structure.a.Free(1,2) = 1; dcmodel2 = pem(z,dcmodel2,ssestOptions('Display','on'));
State-space Model Identification Estimation data: Time domain data z Data has 2 outputs, 1 inputs and 400 samples. Number of states: 2 Algorithm: Nonlinear least squares with automatically chosen line search method <br> ------------------------------------------------------------------------------------------ <br> Norm of First-order Improvement (%) <br> Iteration Cost step optimality Expected Achieved Bisections <br>------------------------------------------------------------------------------------------ 0 0.00106082 - 40 0.0256 - - 1 0.00106055 0.0038 8.21 0.0256 0.0255 0 2 0.00106055 5.48e-05 0.000879 1.13e-05 1.13e-05 0 ------------------------------------------------------------------------------------------ Estimating parameter covariance... done. Termination condition: Near (local) minimum, (norm(g) < tol).. Number of iterations: 2, Number of function evaluations: 5 Status: Estimated using PEM Fit to estimation data: [98.35;84.42]%, FPE: 0.00107658
Получившаяся модель является
dcmodel2
dcmodel2 = Continuous-time identified state-space model: dx/dt = A x(t) + B u(t) + K e(t) y(t) = C x(t) + D u(t) + e(t) A = x1 x2 x1 0 0.9975 x2 0 -4.011 B = Voltage x1 0 x2 1.004 C = x1 x2 Angle 1 0 AngVel 0 1 D = Voltage Angle 0 AngVel 0 K = Angle AngVel x1 0 0 x2 0 0 Parameterization: STRUCTURED form (some fixed coefficients in A, B, C). Feedthrough: none Disturbance component: none Number of free coefficients: 3 Use "idssdata", "getpvec", "getcov" for parameters and their uncertainties. Status: Estimated using PEM on time domain data "z". Fit to estimation data: [98.35;84.42]% FPE: 0.001077, MSE: 0.1192
Мы находим, что предполагаемое A(1,2)
близок к 1. Чтобы сравнить две модели, мы используем compare
команда:
compare(z,dcmodel,dcmodel2)
Предположим, что мы точно знаем статический коэффициент усиления двигателя постоянного тока (от входного напряжения до скорости вращения, например, из предыдущего эксперимента с переходной характеристикой. Если статический коэффициент усиления G
, и константа времени двигателя t, тогда модель пространства состояний становится
|0 1| | 0 | d/dt x = | |x + | | u |0 -1/t| | G/t |
|1 0| y = | | x |0 1|
С G
известно, что существует зависимость между записями в различных матрицах. В порядок для описания этого, ранее использованный способ с параметрами «Free» будет недостаточным. Таким образом, мы должны записать файл MATLAB, который производит A, B, C и D, а также, опционально, K и X0 матрицы в качестве выходов для каждого заданного вектора параметра в качестве входов. Он также принимает вспомогательные аргументы в качестве входов, чтобы пользователь мог изменять определенные вещи в структуре модели, не редактируя файл. В этом случае мы позволяем известное статическое усиление G
быть введенным как такой аргумент. Записанный файл имеет имя 'motorDynamics.m'.
type motorDynamics
function [A,B,C,D,K,X0] = motorDynamics(par,ts,aux) %MOTORDYNAMICS ODE file representing the dynamics of a motor. % % [A,B,C,D,K,X0] = motorDynamics(Tau,Ts,G) % returns the State Space matrices of the DC-motor with % time-constant Tau (Tau = par) and known static gain G. The sample % time is Ts. % % This file returns continuous-time representation if input argument Ts % is zero. If Ts>0, a discrete-time representation is returned. To make % the IDGREY model that uses this file aware of this flexibility, set the % value of Structure.FcnType property to 'cd'. This flexibility is useful % for conversion between continuous and discrete domains required for % estimation and simulation. % % See also IDGREY, IDDEMO7. % L. Ljung % Copyright 1986-2015 The MathWorks, Inc. t = par(1); G = aux(1); A = [0 1;0 -1/t]; B = [0;G/t]; C = eye(2); D = [0;0]; K = zeros(2); X0 = [0;0]; if ts>0 % Sample the model with sample time Ts s = expm([[A B]*ts; zeros(1,3)]); A = s(1:2,1:2); B = s(1:2,3); end
Теперь мы создадим объект модели IDGREY, соответствующий этой структуре модели: Предполагаемая временная константа будет
par_guess = 1;
Мы также даем значение 0,25 вспомогательной переменной G
(усиление) и шаг расчета.
aux = 0.25; dcmm = idgrey('motorDynamics',par_guess,'cd',aux,0);
Временная константа теперь оценивается как
dcmm = greyest(z,dcmm,greyestOptions('Display','on'));
Таким образом, теперь мы оценили постоянную времени двигателя непосредственно. Ее значение хорошо согласуется с предыдущей оценкой.
dcmm
dcmm = Continuous-time linear grey box model defined by "motorDynamics" function: dx/dt = A x(t) + B u(t) + K e(t) y(t) = C x(t) + D u(t) + e(t) A = x1 x2 x1 0 1 x2 0 -4.006 B = Voltage x1 0 x2 1.001 C = x1 x2 Angle 1 0 AngVel 0 1 D = Voltage Angle 0 AngVel 0 K = Angle AngVel x1 0 0 x2 0 0 Model parameters: Par1 = 0.2496 Parameterization: ODE Function: motorDynamics (parametrizes both continuous- and discrete-time equations) Disturbance component: parameterized by the ODE function Initial state: parameterized by the ODE function Number of free coefficients: 1 Use "getpvec", "getcov" for parameters and their uncertainties. Status: Estimated using GREYEST on time domain data "z". Fit to estimation data: [98.35;84.42]% FPE: 0.00107, MSE: 0.1193
С помощью этой модели мы теперь можем приступить к тестированию различных аспектов, как и прежде. Синтаксис всех команд идентичен предыдущему случаю. Для примера мы можем сравнить модель идгри с другой моделью пространства состояний:
compare(z,dcmm,dcmodel)
Они явно очень близки.
Часть тулбокса в пространстве состояний также обрабатывает многомерные (несколько выходов) модели ARX. Под многомерной моделью ARX мы подразумеваем следующее:
A(q) y(t) = B(q) u(t) + e(t)
Здесь A (q) является ny | ny матрицей, записи которой являются полиномами в операторе задержки 1/q. Элемент k-l обозначается:
где:
Таким образом, это полином в 1/q
степени nakl
.
Точно так же B (q) является ny | nu матрицей, чей kj-элемент является:
Таким образом, происходит задержка nkkj
от входного числа j
к выводимому номеру k
. Наиболее распространенным способом их создания было бы использование ARX-команды. Значения порядков указаны как: nn = [na nb nk]
с na
будучи ny-by-ny
матрица, kj
-entry nakj
; nb
и nk
заданы аналогично.
Давайте протестируем некоторые ARX-модели на dc-данных. Сначала мы могли бы просто создать общую модель второго порядка:
dcarx1 = arx(z,'na',[2,2;2,2],'nb',[2;2],'nk',[1;1])
dcarx1 = Discrete-time ARX model: Model for output "Angle": A(z)y_1(t) = - A_i(z)y_i(t) + B(z)u(t) + e_1(t) A(z) = 1 - 0.5545 z^-1 - 0.4454 z^-2 A_2(z) = -0.03548 z^-1 - 0.06405 z^-2 B(z) = 0.004243 z^-1 + 0.006589 z^-2 Model for output "AngVel": A(z)y_2(t) = - A_i(z)y_i(t) + B(z)u(t) + e_2(t) A(z) = 1 - 0.2005 z^-1 - 0.2924 z^-2 A_1(z) = 0.01849 z^-1 - 0.01937 z^-2 B(z) = 0.08642 z^-1 + 0.03877 z^-2 Sample time: 0.1 seconds Parameterization: Polynomial orders: na=[2 2;2 2] nb=[2;2] nk=[1;1] Number of free coefficients: 12 Use "polydata", "getpvec", "getcov" for parameters and their uncertainties. Status: Estimated using ARX on time domain data "z". Fit to estimation data: [97.87;83.44]% (prediction focus) FPE: 0.002157, MSE: 0.1398
Результат, dcarx1
, хранится как модель IDPOLY, и применяются все предыдущие команды. Мы могли бы, например, явно перечислить ARX-полиномы по:
dcarx1.a
ans = 2x2 cell array {[1 -0.5545 -0.4454]} {[0 -0.0355 -0.0640]} {[ 0 0.0185 -0.0194]} {[1 -0.2005 -0.2924]}
как массивы ячеек, где, например, элемент {1,2} dcarx1.a является полиномом A (1,2), описанный ранее, относящийся y2 к y1.
Мы также можем протестировать структуру, где мы знаем это y1
получается фильтрацией y2
через фильтр первого порядка. (Угол является интегралом скорости вращения). Затем мы могли бы также постулировать динамику первого порядка от входа до вывода № 2:
na = [1 1; 0 1]; nb = [0 ; 1]; nk = [1 ; 1]; dcarx2 = arx(z,[na nb nk])
dcarx2 = Discrete-time ARX model: Model for output "Angle": A(z)y_1(t) = - A_i(z)y_i(t) + B(z)u(t) + e_1(t) A(z) = 1 - 0.9992 z^-1 A_2(z) = -0.09595 z^-1 B(z) = 0 Model for output "AngVel": A(z)y_2(t) = B(z)u(t) + e_2(t) A(z) = 1 - 0.6254 z^-1 B(z) = 0.08973 z^-1 Sample time: 0.1 seconds Parameterization: Polynomial orders: na=[1 1;0 1] nb=[0;1] nk=[1;1] Number of free coefficients: 4 Use "polydata", "getpvec", "getcov" for parameters and their uncertainties. Status: Estimated using ARX on time domain data "z". Fit to estimation data: [97.52;81.46]% (prediction focus) FPE: 0.003452, MSE: 0.177
Чтобы сравнить различные модели, мы используем
compare(z,dcmodel,dcmm,dcarx2)
Наконец, мы могли бы сравнить бодеплоты, полученные из входа, чтобы вывести одну для различных моделей при помощи bode
: Первый выход:
dcmm2 = idss(dcmm); % convert to IDSS for subreferencing bode(dcmodel(1,1),'r',dcmm2(1,1),'b',dcarx2(1,1),'g')
Second output:
bode(dcmodel(2,1),'r',dcmm2(2,1),'b',dcarx2(2,1),'g')
Две первые модели более или менее в точном согласии. ARX-модели не так хороши, из-за смещения, вызванного небелым шумом ошибки уравнения. (У нас был белый шум измерения в симуляциях).
Оценка моделей с предварительно выбранными структурами может быть выполнена с помощью тулбокса Система Идентификации. В форме пространство состояний параметры могут быть фиксированы к их известным значениям или ограничены, чтобы лежать в заданной области значений. Если необходимо задать отношение между параметрами или другими ограничениями, можно использовать объекты IDGREY. Модели IDGREY оценивают пользовательский файл MATLAB для оценки параметров системы в пространстве состояний. Мульти-вариативные модели ARX предлагают другую опцию для быстрой оценки мультивыходов с заданной пользователем структурой.