В этом примере показано, как создавать простые модели процессов с помощью Toolbox™ идентификации системы. Описаны методики создания этих моделей и оценки их параметров с использованием экспериментальных данных. В этом примере требуется Simulink ®.
В этом примере показано, как создавать простые модели процессов, часто используемые в промышленности. Для описания поведения процесса обычно используются простые функции непрерывной передачи данных низкого порядка. Такие модели описаны объектами IDPROC, которые представляют передаточную функцию в форме с нулевым коэффициентом усиления полюса.
Модели процессов имеют базовый тип «Статический коэффициент усиления + Постоянная времени + Задержка времени». Они могут быть представлены следующим образом:

или как процесс интеграции:

где пользователь может определить количество реальных полюсов (0, 1, 2 или 3), а также наличие нуля в числителе, наличие члена интегратора (1/s) и наличие временной задержки (Td). Кроме того, на смену реальным полюсам может прийти недостаточно затухающая (сложная) пара полюсов.
Объекты IDPROC определяют модели процессов с помощью букв P (для модели процесса), D (для временной задержки), Z (для нуля) и I (для интегратора). Целое число будет обозначать число полюсов. Модели генерируются вызовом idproc с вектором символов, созданным с использованием этих букв.
Например:
idproc('P1') % transfer function with only one pole (no zeros or delay) idproc('P2DIZ') % model with 2 poles, delay integrator and delay idproc('P0ID') % model with no poles, but an integrator and a delay
ans =
Process model with transfer function:
Kp
G(s) = ----------
1+Tp1*s
Kp = NaN
Tp1 = NaN
Parameterization:
{'P1'}
Number of free coefficients: 2
Use "getpvec", "getcov" for parameters and their uncertainties.
Status:
Created by direct construction or transformation. Not estimated.
ans =
Process model with transfer function:
1+Tz*s
G(s) = Kp * ------------------- * exp(-Td*s)
s(1+Tp1*s)(1+Tp2*s)
Kp = NaN
Tp1 = NaN
Tp2 = NaN
Td = NaN
Tz = NaN
Parameterization:
{'P2DIZ'}
Number of free coefficients: 5
Use "getpvec", "getcov" for parameters and their uncertainties.
Status:
Created by direct construction or transformation. Not estimated.
ans =
Process model with transfer function:
Kp
G(s) = --- * exp(-Td*s)
s
Kp = NaN
Td = NaN
Parameterization:
{'P0DI'}
Number of free coefficients: 2
Use "getpvec", "getcov" for parameters and their uncertainties.
Status:
Created by direct construction or transformation. Not estimated.
Рассмотрим систему, описанную в следующей модели SIMULINK:
open_system('iddempr1') set_param('iddempr1/Random Number','seed','0')

Красная часть - система, синяя часть - контроллер, а опорный сигнал - стреловидная синусоида (сигнал чирпа). Время выборки данных устанавливается равным 0,5 секунды. Как было отмечено, система является функцией непрерывного переноса времени и, следовательно, может быть описана с использованием объектов модели в панели инструментов идентификации системы, таких как idss, idpoly или idproc.
Опишите систему с помощью idpoly и idproc объекты. Используя idpoly объект, система может быть описана как:
m0 = idpoly(1,0.1,1,1,[1 0.5],'Ts',0,'InputDelay',1.57,'NoiseVariance',0.01);
Форма IDPOLY, используемая выше, полезна для описания передаточных функций произвольных порядков. Поскольку рассматриваемая система довольно проста (один полюс без нулей) и непрерывна, мы можем использовать более простой объект IDPROC для захвата его динамики:
m0p = idproc('p1d','Kp',0.2,'Tp1',2,'Td',1.57) % one pole+delay, with initial values % for gain, pole and delay specified.
m0p =
Process model with transfer function:
Kp
G(s) = ---------- * exp(-Td*s)
1+Tp1*s
Kp = 0.2
Tp1 = 2
Td = 1.57
Parameterization:
{'P1D'}
Number of free coefficients: 3
Use "getpvec", "getcov" for parameters and their uncertainties.
Status:
Created by direct construction or transformation. Not estimated.
Как только система описана объектом модели, таким как IDPROC, она может использоваться для оценки ее параметров с использованием данных измерений. В качестве примера рассмотрим задачу оценки параметров системы модели Simulink (красная часть) с использованием данных моделирования. Мы начинаем с получения данных для оценки:
sim('iddempr1') dat1e = iddata(y,u,0.5); % The IDDATA object for storing measurement data
Рассмотрим данные:
plot(dat1e)

Мы можем определить модель процесса с помощью procest путем предоставления той же информации о структуре, что и при создании моделей IDPROC. Например, модель 1-полюсной + задержки может быть оценена вызовом procest следующим образом:
m1 = procest(dat1e,'p1d'); % estimation of idproc model using data 'dat1e'. % Check the result of estimation: m1
m1 =
Process model with transfer function:
Kp
G(s) = ---------- * exp(-Td*s)
1+Tp1*s
Kp = 0.20045
Tp1 = 2.0431
Td = 1.499
Parameterization:
{'P1D'}
Number of free coefficients: 3
Use "getpvec", "getcov" for parameters and their uncertainties.
Status:
Estimated using PROCEST on time domain data "dat1e".
Fit to estimation data: 87.34%
FPE: 0.01069, MSE: 0.01062
To get information about uncertainties, use
present(m1)
m1 =
Process model with transfer function:
Kp
G(s) = ---------- * exp(-Td*s)
1+Tp1*s
Kp = 0.20045 +/- 0.00077275
Tp1 = 2.0431 +/- 0.061216
Td = 1.499 +/- 0.040854
Parameterization:
{'P1D'}
Number of free coefficients: 3
Use "getpvec", "getcov" for parameters and their uncertainties.
Status:
Termination condition: Near (local) minimum, (norm(g) < tol)..
Number of iterations: 4, Number of function evaluations: 9
Estimated using PROCEST on time domain data "dat1e".
Fit to estimation data: 87.34%
FPE: 0.01069, MSE: 0.01062
More information in model's "Report" property.
Параметры модели, K, Tp1 и Td Теперь показаны с одним диапазоном неопределенности стандартного отклонения.
Модель m1 выше оценен объект модели IDPROC, к которому можно применить все команды модели панели инструментов:
step(m1,m0) %step response of models m1 (estimated) and m0 (actual) legend('m1 (estimated parameters)','m0 (known parameters)','location','northwest')

Реакция Боде с доверительной областью, соответствующей 3 стандартным отклонениям, может быть вычислена путем:
h = bodeplot(m1,m0); showConfidence(h,3)

Аналогично, данные измерений могут сравниваться с выходными данными моделей с использованием compare следующим образом:
compare(dat1e,m0,m1)

Другие операции, такие как sim, impulse, c2d также доступны, как и для других объектов модели.
bdclose('iddempr1')
Может быть важно (по крайней мере, для медленной выборки) учитывать интерсамплярное поведение входных данных. Чтобы проиллюстрировать это, давайте изучим ту же систему, что и раньше, но без схемы выборки и удержания:
open_system('iddempr5')

Смоделировать эту систему с одинаковым временем выборки:
sim('iddempr5') dat1f = iddata(y,u,0.5); % The IDDATA object for the simulated data
Мы оцениваем модель IDPROC с использованием data1f одновременно накладывая верхнюю границу на допустимую задержку значения. Мы будем использовать 'lm' в качестве метода поиска, а также выберем просмотр прогресса оценки.
m2_init = idproc('P1D'); m2_init.Structure.Td.Maximum = 2; opt = procestOptions('SearchMethod','lm','Display','on'); m2 = procest(dat1f,m2_init,opt); m2
m2 =
Process model with transfer function:
Kp
G(s) = ---------- * exp(-Td*s)
1+Tp1*s
Kp = 0.20038
Tp1 = 2.01
Td = 1.31
Parameterization:
{'P1D'}
Number of free coefficients: 3
Use "getpvec", "getcov" for parameters and their uncertainties.
Status:
Estimated using PROCEST on time domain data "dat1f".
Fit to estimation data: 87.26%
FPE: 0.01067, MSE: 0.01061

Эта модель имеет несколько менее точную оценку задержки, чем предыдущая, m1:
[m0p.Td, m1.Td, m2.Td] step(m0,m1,m2) legend('m0 (actual)','m1 (estimated with ZOH)','m2 (estimated without ZOH)','location','southeast')
ans =
1.5700 1.4990 1.3100

Тем не менее, сообщая процессу оценки, что интерсамплярное поведение является вводом первого порядка (приближением к истинному непрерывному), мы делаем лучше:
dat1f.InterSample = 'foh';
m3 = procest(dat1f,m2_init,opt);

Сравните четыре модели m0 (true) m1 (полученные из ввода zoh) м2 (полученные для непрерывного ввода, с предположением zoh) и m3 (полученные для того же ввода, но с предположением foh)
[m0p.Td, m1.Td, m2.Td, m3.Td] compare(dat1e,m0,m1,m2,m3)
ans =
1.5700 1.4990 1.3100 1.5570

step(m0,m1,m2,m3) legend('m0','m1','m2','m3') bdclose('iddempr5')

Рассмотрим более сложный процесс с интеграцией, который работает в замкнутом контуре:
open_system('iddempr2')

Истинная система может быть представлена следующим образом:
m0 = idproc('P2ZDI','Kp',1,'Tp1',1,'Tp2',5,'Tz',3,'Td',2.2);
Процесс управляется регулятором PD с ограниченной амплитудой ввода и устройством удержания нулевого порядка. Время выборки составляет 1 секунду.
set_param('iddempr2/Random Number','seed','0') sim('iddempr2') dat2 = iddata(y,u,1); % IDDATA object for estimation
Выполняются два различных моделирования: первое для оценки и второе для проверки достоверности.
set_param('iddempr2/Random Number','seed','13') sim('iddempr2') dat2v = iddata(y,u,1); % IDDATA object for validation purpose
Рассмотрим данные (оценка и проверка).
plot(dat2,dat2v) legend('dat2 (estimation)','dat2v (validation)')

Теперь давайте выполним оценку с помощью dat2.
Warn = warning('off','Ident:estimation:underdampedIDPROC'); m2_init = idproc('P2ZDI'); m2_init.Structure.Td.Maximum = 5; m2_init.Structure.Tp1.Maximum = 2; opt = procestOptions('SearchMethod','lsqnonlin','Display','on'); opt.SearchOptions.MaxIterations = 100; m2 = procest(dat2, m2_init, opt)
m2 =
Process model with transfer function:
1+Tz*s
G(s) = Kp * ------------------- * exp(-Td*s)
s(1+Tp1*s)(1+Tp2*s)
Kp = 0.98412
Tp1 = 2
Tp2 = 1.4838
Td = 1.713
Tz = 0.027244
Parameterization:
{'P2DIZ'}
Number of free coefficients: 5
Use "getpvec", "getcov" for parameters and their uncertainties.
Status:
Estimated using PROCEST on time domain data "dat2".
Fit to estimation data: 91.51%
FPE: 0.1128, MSE: 0.1092

compare(dat2v,m2,m0) % Gives very good agreement with data

bode(m2,m0)
legend({'m2 (est)','m0 (actual)'},'location','west')

impulse(m2,m0)
legend({'m2 (est)','m0 (actual)'})

Сравните также с параметрами истинной системы:
present(m2) [getpvec(m0), getpvec(m2)]
m2 =
Process model with transfer function:
1+Tz*s
G(s) = Kp * ------------------- * exp(-Td*s)
s(1+Tp1*s)(1+Tp2*s)
Kp = 0.98412 +/- 0.013672
Tp1 = 2 +/- 8.2231
Tp2 = 1.4838 +/- 10.193
Td = 1.713 +/- 63.703
Tz = 0.027244 +/- 65.516
Parameterization:
{'P2DIZ'}
Number of free coefficients: 5
Use "getpvec", "getcov" for parameters and their uncertainties.
Status:
Termination condition: Change in cost was less than the specified tolerance..
Number of iterations: 3, Number of function evaluations: 4
Estimated using PROCEST on time domain data "dat2".
Fit to estimation data: 91.51%
FPE: 0.1128, MSE: 0.1092
More information in model's "Report" property.
ans =
1.0000 0.9841
1.0000 2.0000
5.0000 1.4838
2.2000 1.7130
3.0000 0.0272
Слово осторожности. Идентификация нескольких констант реального времени иногда может быть плохо обусловленной проблемой, особенно если данные собираются в замкнутом цикле.
Чтобы проиллюстрировать это, оценим модель на основе данных проверки:
m2v = procest(dat2v, m2_init, opt) [getpvec(m0), getpvec(m2), getpvec(m2v)]
m2v =
Process model with transfer function:
1+Tz*s
G(s) = Kp * ------------------- * exp(-Td*s)
s(1+Tp1*s)(1+Tp2*s)
Kp = 0.95747
Tp1 = 1.999
Tp2 = 0.60819
Td = 2.314
Tz = 0.0010561
Parameterization:
{'P2DIZ'}
Number of free coefficients: 5
Use "getpvec", "getcov" for parameters and their uncertainties.
Status:
Estimated using PROCEST on time domain data "dat2v".
Fit to estimation data: 90.65%
FPE: 0.1397, MSE: 0.1353
ans =
1.0000 0.9841 0.9575
1.0000 2.0000 1.9990
5.0000 1.4838 0.6082
2.2000 1.7130 2.3140
3.0000 0.0272 0.0011

Эта модель имеет гораздо худшие значения параметров. С другой стороны, он работает почти так же, как истинная система m0, когда тестируется на другом наборе данных2:
compare(dat2,m0,m2,m2v)

Предположим, из других источников известно, что одна постоянная времени равна 1:
m2v.Structure.Tp1.Value = 1; m2v.Structure.Tp1.Free = false;
Мы можем зафиксировать это значение, оценивая другие параметры:
m2v = procest(dat2v,m2v)
%
m2v =
Process model with transfer function:
1+Tz*s
G(s) = Kp * ------------------- * exp(-Td*s)
s(1+Tp1*s)(1+Tp2*s)
Kp = 1.0111
Tp1 = 1
Tp2 = 5.3014
Td = 2.195
Tz = 3.231
Parameterization:
{'P2DIZ'}
Number of free coefficients: 4
Use "getpvec", "getcov" for parameters and their uncertainties.
Status:
Estimated using PROCEST on time domain data "dat2v".
Fit to estimation data: 92.05%
FPE: 0.09952, MSE: 0.09794
Как было замечено, фиксация Tp1 по своему известному значению резко улучшает оценки остальных параметров в модели m2v.
Это также указывает на то, что простое приближение должно хорошо работать с данными:
m1x_init = idproc('P2D'); % simpler structure (no zero, no integrator) m1x_init.Structure.Td.Maximum = 2; m1x = procest(dat2v, m1x_init) compare(dat2,m0,m2,m2v,m1x)
m1x =
Process model with transfer function:
Kp
G(s) = ----------------- * exp(-Td*s)
(1+Tp1*s)(1+Tp2*s)
Kp = -1.2555
Tp1 = 1.0249e-06
Tp2 = 0.078021
Td = 1.959
Parameterization:
{'P2D'}
Number of free coefficients: 4
Use "getpvec", "getcov" for parameters and their uncertainties.
Status:
Estimated using PROCEST on time domain data "dat2v".
Fit to estimation data: -23.87%
FPE: 24.15, MSE: 23.77

Таким образом, более простая модель способна достаточно хорошо оценивать выходные данные системы. Однако m1x не содержит никакой интеграции, поэтому поведение разомкнутого цикла в дальнем временном диапазоне будет совершенно другим:
step(m0,m2,m2v,m1x) legend('m0','m2','m2v','m1x') bdclose('iddempr2') warning(Warn)
