В этом примере показано, как создавать, оценивать и анализировать нелинейные серые модели.
Нелинейная серая коробка (idnlgrey) модели пригодны для оценки параметров систем, которые описываются нелинейными государственными пространственными структурами за непрерывное или дискретное время. Вы можете использовать оба idgrey (линейная серая модель) и idnlgrey объекты для моделирования линейных систем. Однако можно использовать только idnlgrey для представления нелинейной динамики. Для получения сведений о линейном моделировании в сером ящике с помощью idgreyсм. раздел Построение структурированных и пользовательских моделей с использованием Toolbox™ идентификации системы.
В этом примере моделируется динамика линейного двигателя постоянного тока с помощью idnlgrey объект.

Рис. 1. Принципиальная схема двигателя постоянного тока.
Если вы игнорируете нарушения и выбираете y(1) в качестве углового положения [рад] и y(2) в качестве угловой скорости [рад/с] двигателя можно настроить линейную структуру состояния-пространства следующей формы (см. Ljung, L. System Identification: Theory for the User, Upper Saddle River, NJ, Prentice-Hall PTR, 1999, 2-е изд., стр. 95-97 для деривации):
d | 0 1 | | 0 | -- x(t) = | | x(t) + | | u(t) dt | 0 -1/tau | | k/tau |
| 1 0 |
y(t) = | | x(t)
| 0 1 |tau - постоянная времени двигателя в [s] и k - статический коэффициент усиления от входного до угловой скорости в [рад/( В * с)]. См. Ljung (1999) о том, какtau и k относятся к физическим параметрам двигателя.
1. Загрузите данные двигателя постоянного тока.
load(fullfile(matlabroot, 'toolbox', 'ident', 'iddemos', 'data', 'dcmotordata'));
2. Представление оценочных данных в виде iddata объект.
z = iddata(y, u, 0.1, 'Name', 'DC-motor');
3. Укажите имена входных и выходных сигналов, единицы времени и времени начала.
z.InputName = 'Voltage'; z.InputUnit = 'V'; z.OutputName = {'Angular position', 'Angular velocity'}; z.OutputUnit = {'rad', 'rad/s'}; z.Tstart = 0; z.TimeUnit = 's';
4. Постройте график данных.
Данные отображаются в двух окнах печати.
figure('Name', [z.Name ': Voltage input -> Angular position output']); plot(z(:, 1, 1)); % Plot first input-output pair (Voltage -> Angular position). figure('Name', [z.Name ': Voltage input -> Angular velocity output']); plot(z(:, 2, 1)); % Plot second input-output pair (Voltage -> Angular velocity).


Рис. 2: Входные-выходные данные двигателя постоянного тока.
1. Представление структуры двигателя постоянного тока в функции.
В этом примере используется файл MATLAB ®, но можно также использовать C MEX-файлы (для увеличения вычислительной скорости), P-файлы или дескрипторы функций. Дополнительные сведения см. в разделе Создание файлов модели IDNLGREY.
Функция двигателя постоянного тока называется dcmotor_m.m и показан ниже.
function [dx, y] = dcmotor_m(t, x, u, tau, k, varargin)
% Output equations.
y = [x(1); ... % Angular position.
x(2) ... % Angular velocity.
]; % State equations.
dx = [x(2); ... % Angular velocity.
-(1/tau)*x(2)+(k/tau)*u(1) ... % Angular acceleration.
];Файл всегда должен быть структурирован, чтобы возвращать следующее:
Выходные аргументы:
dx - вектор производных состояний в случае непрерывного времени и значений обновления состояний в случае дискретного времени.
y - выходное уравнение
Входные аргументы:
Первые три входных аргумента должны быть: t (время), x (вектор состояния, [] для статических систем), u (входной вектор, [] для временных рядов).
Ниже приведен упорядоченный список параметров. Параметрами могут быть скаляры, векторы столбцов или двумерные матрицы.
varargin для дополнительных входных аргументов
2. Представление динамики двигателя постоянного тока с помощью idnlgrey объект.
Модель описывает, как входные данные генерируют выходные данные с использованием уравнения (уравнений) состояния.
FileName = 'dcmotor_m'; % File describing the model structure. Order = [2 1 2]; % Model orders [ny nu nx]. Parameters = [1; 0.28]; % Initial parameters. Np = 2. InitialStates = [0; 0]; % Initial initial states. Ts = 0; % Time-continuous system. nlgr = idnlgrey(FileName, Order, Parameters, InitialStates, Ts, ... 'Name', 'DC-motor');
На практике существуют нарушения, влияющие на выходные данные. Один idnlgrey модель явно не моделирует возмущения, но предполагает, что они только что добавлены к выходам. Таким образом ,idnlgrey модели эквивалентны моделям Output-Error (OE). Без шумовой модели прошлые выходные сигналы не влияют на прогноз будущих выходных сигналов, что означает, что прогнозируемые выходные сигналы для любого горизонта k прогнозирования совпадают с моделируемыми выходными сигналами.
3. Укажите входные и выходные имена и единицы измерения.
set(nlgr, 'InputName', 'Voltage', 'InputUnit', 'V', ... 'OutputName', {'Angular position', 'Angular velocity'}, ... 'OutputUnit', {'rad', 'rad/s'}, ... 'TimeUnit', 's');
4. Укажите имена и единицы измерения начальных состояний и параметров.
nlgr = setinit(nlgr, 'Name', {'Angular position' 'Angular velocity'}); nlgr = setinit(nlgr, 'Unit', {'rad' 'rad/s'}); nlgr = setpar(nlgr, 'Name', {'Time-constant' 'Static gain'}); nlgr = setpar(nlgr, 'Unit', {'s' 'rad/(V*s)'});
Также можно использовать setinit и setpar для одновременного назначения значений, минимумов, максимумов и состояния оценки для всех начальных состояний или параметров.
5. Просмотр исходной модели.
а. Получить основную информацию о модели.
Двигатель постоянного тока имеет 2 (начальные) состояния и 2 параметра модели.
size(nlgr)
Nonlinear grey-box model with 2 outputs, 1 inputs, 2 states and 2 parameters (2 free).
b. Просмотр начальных состояний и параметров.
Как начальные состояния, так и параметры являются структурными массивами. Поля определяют свойства отдельного начального состояния или параметра. Напечатать help idnlgrey.InitialStates и help idnlgrey.Parameters для получения дополнительной информации.
nlgr.InitialStates(1) nlgr.Parameters(2)
ans =
struct with fields:
Name: 'Angular position'
Unit: 'rad'
Value: 0
Minimum: -Inf
Maximum: Inf
Fixed: 1
ans =
struct with fields:
Name: 'Static gain'
Unit: 'rad/(V*s)'
Value: 0.2800
Minimum: -Inf
Maximum: Inf
Fixed: 0
c. Получение информации для всех начальных состояний или параметров модели в одном вызове.
Например, получить информацию о фиксированных (не оцененных) начальных состояниях и минимумах всех параметров модели.
getinit(nlgr, 'Fixed') getpar(nlgr, 'Min')
ans =
2x1 cell array
{[1]}
{[1]}
ans =
2x1 cell array
{[-Inf]}
{[-Inf]}
d. Получите основные сведения об объекте:
nlgr
nlgr =
Continuous-time nonlinear grey-box model defined by 'dcmotor_m' (MATLAB file):
dx/dt = F(t, u(t), x(t), p1, p2)
y(t) = H(t, u(t), x(t), p1, p2) + e(t)
with 1 input(s), 2 state(s), 2 output(s), and 2 free parameter(s) (out of 2).
Name: DC-motor
Status:
Created by direct construction or transformation. Not estimated.
Использовать get для получения дополнительной информации о свойствах модели. idnlgrey объект имеет множество свойств объектов параметрической линейной модели.
get(nlgr)
FileName: 'dcmotor_m'
Order: [1x1 struct]
Parameters: [2x1 struct]
InitialStates: [2x1 struct]
FileArgument: {}
SimulationOptions: [1x1 struct]
TimeVariable: 't'
NoiseVariance: [2x2 double]
Ts: 0
TimeUnit: 'seconds'
InputName: {'Voltage'}
InputUnit: {'V'}
InputGroup: [1x1 struct]
OutputName: {2x1 cell}
OutputUnit: {2x1 cell}
OutputGroup: [1x1 struct]
Notes: [0x1 string]
UserData: []
Name: 'DC-motor'
Report: [1x1 idresults.nlgreyest]
Перед оценкой параметров tau и k, смоделировать выходные данные системы с использованием предположений параметров с помощью решателя дифференциальных уравнений по умолчанию (решатель Runge-Kutta 45 с адаптивной регулировкой длины шага). Параметры моделирования задаются с помощью свойства модели «Параметры моделирования».
1. Установите абсолютные и относительные допуски ошибок на малые значения (1e-6 и 1e-5соответственно).
nlgr.SimulationOptions.AbsTol = 1e-6; nlgr.SimulationOptions.RelTol = 1e-5;
2. Сравните смоделированные выходные данные с измеренными данными.
compare отображает как измеренные, так и смоделированные выходы одной или нескольких моделей, тогда как predict, вызываемый с теми же входными аргументами, отображает смоделированные выходы.
Смоделированные и измеренные выходные данные отображаются в окне графика.
compare(z, nlgr);

Рис. 3: Сравнение измеренных выходов и моделируемых выходов исходной модели двигателя постоянного тока.
Оценка параметров и начальных состояний с помощью nlgreyest, который является методом минимизации ошибок прогнозирования для нелинейных моделей серых полей. Параметры оценки, такие как выбор отображения хода выполнения оценки, определяются с помощью набора опций «nlgreyestOptions».
nlgr = setinit(nlgr, 'Fixed', {false false}); % Estimate the initial states. opt = nlgreyestOptions('Display', 'on'); nlgr = nlgreyest(z, nlgr, opt);

1. Просмотрите информацию о процессе оценки.
Эта информация хранится в Report имущества idnlgrey объект. Свойство также содержит сведения о том, как оценивалась модель, такие как решатель и метод поиска, набор данных и причины завершения оценки.
nlgr.Report
fprintf('\n\nThe search termination condition:\n')
nlgr.Report.Termination
ans =
Status: 'Estimated using NLGREYEST'
Method: 'Solver: ode45; Search: lsqnonlin'
Fit: [1x1 struct]
Parameters: [1x1 struct]
OptionsUsed: [1x1 idoptions.nlgreyest]
RandState: []
DataUsed: [1x1 struct]
Termination: [1x1 struct]
The search termination condition:
ans =
struct with fields:
WhyStop: 'Change in cost was less than the specified tolerance.'
Iterations: 5
FirstOrderOptimality: 1.4013e-04
FcnCount: 6
Algorithm: 'trust-region-reflective'
2. Оцените качество модели путем сравнения моделируемых и измеряемых выходных данных.
Посадки составляют 98% и 84%, что свидетельствует о том, что расчетная модель хорошо фиксирует динамику двигателя постоянного тока.
compare(z, nlgr);

Рис. 4: Сравнение измеренных выходов и смоделированных выходов расчетной модели двигателя постоянного тока IDNLGREY.
3. Сравните производительность idnlgrey с ARX-моделью второго порядка.
na = [2 2; 2 2]; nb = [2; 2]; nk = [1; 1]; dcarx = arx(z, [na nb nk]); compare(z, nlgr, dcarx);

Рис. 5: Сравнение измеренных выходов и смоделированных выходов расчетных моделей двигателей постоянного тока IDNLGREY и ARX.
4. Проверьте ошибки прогнозирования.
Полученные ошибки прогнозирования малы и центрированы вокруг нуля (без смещения).
pe(z, nlgr);

Рис. 6: Ошибки прогнозирования, полученные при расчетной модели двигателя постоянного тока IDNLGREY.
5. Проверьте остатки («остатки»).
Остатки указывают на то, что остается необъяснимым моделью и малы для хорошего качества модели. Используйте resid для просмотра корреляций между остатками. В первом столбце графиков показаны автокорреляции остатков для двух выходов. Во втором столбце показана взаимная корреляция этих остатков с входным значением «Напряжение». Корреляции находятся в пределах допустимых границ (синяя область).
figure('Name',[nlgr.Name ': residuals of estimated model']); resid(z,nlgr);

Рис. 7: Остатки, полученные с помощью расчетной модели двигателя постоянного тока IDNLGREY.
6. Постройте график ответа на шаг.
Шаг единичного ввода приводит к угловому положению, показывающему поведение наклонного типа, и к угловой скорости, которая стабилизируется на постоянном уровне.
figure('Name', [nlgr.Name ': step response of estimated model']); step(nlgr);

Рис. 8: Пошаговая реакция с расчетной моделью двигателя постоянного тока IDNLGREY.
7. Проверьте ковариацию модели.
Оценить качество оценочной модели можно в некоторой степени, посмотрев на матрицу оценочной ковариации и оценочную дисперсию шума. «Малое» значение (i, i) диагональный элемент ковариационной матрицы указывает, что iПараметр th модели важен для объяснения динамики системы при использовании выбранной структуры модели. Малая дисперсия шума (ковариация для систем с множеством выходов) также является хорошим показателем того, что модель хорошо фиксирует данные оценки.
getcov(nlgr) nlgr.NoiseVariance
ans =
1.0e-04 *
0.1573 0.0021
0.0021 0.0008
ans =
0.0010 -0.0000
-0.0000 0.0110
Дополнительные сведения о расчетной модели см. в разделе present отображение начальных состояний и оценочных значений параметров, а также оценочной неопределенности (стандартного отклонения) для параметров.
present(nlgr);
nlgr =
Continuous-time nonlinear grey-box model defined by 'dcmotor_m' (MATLAB file):
dx/dt = F(t, u(t), x(t), p1, p2)
y(t) = H(t, u(t), x(t), p1, p2) + e(t)
with 1 input(s), 2 state(s), 2 output(s), and 2 free parameter(s) (out of 2).
Inputs:
u(1) Voltage(t) [V]
States: Initial value
x(1) Angular position(t) [rad] xinit@exp1 0.0302675 (estimated) in [-Inf, Inf]
x(2) Angular velocity(t) [rad/s] xinit@exp1 -0.133777 (estimated) in [-Inf, Inf]
Outputs:
y(1) Angular position(t) [rad]
y(2) Angular velocity(t) [rad/s]
Parameters: Value Standard Deviation
p1 Time-constant [s] 0.243649 0.00396671 (estimated) in [-Inf, Inf]
p2 Static gain [rad/(V*s)] 0.249644 0.000284486 (estimated) in [-Inf, Inf]
Name: DC-motor
Status:
Termination condition: Change in cost was less than the specified tolerance..
Number of iterations: 5, Number of function evaluations: 6
Estimated using Solver: ode45; Search: lsqnonlin on time domain data "DC-motor".
Fit to estimation data: [98.34;84.47]%
FPE: 0.001096, MSE: 0.1187
More information in model's "Report" property.
Этот пример иллюстрирует основные инструменты для выполнения нелинейного моделирования «серого ящика». См. другие нелинейные серые примеры, чтобы узнать о:
Использование нелинейных серых моделей в более сложных ситуациях моделирования, таких как построение нелинейных непрерывных и дискретно-временных, временных и статических моделей.
Запись и использование файлов моделей C MEX.
Обработка нескалярных параметров.
Влияние определенных вариантов алгоритма.
Дополнительные сведения об идентификации динамических систем с помощью инструментария идентификации систем см. на информационной странице инструментария идентификации систем.