Этот пример показывает, как создать, оценить и проанализировать нелинейные модели серого ящика.
Нелинейный серый ящик (idnlgrey
) модели пригодны для оценки параметров систем, которые описаны нелинейными структурами пространства состояний за непрерывное или дискретное время. Можно использовать обе idgrey
(линейная модель «серый ящик») и idnlgrey
объекты для моделирования линейных систем. Однако можно использовать только idnlgrey
для представления нелинейной динамики. Чтобы узнать о линейном серо-кубическом моделировании с помощью idgrey
, см. Создание структурированных и пользовательских моделей с использованием System Identification Toolbox™.
В этом примере вы моделируете динамику линейного двигателя постоянного тока, используя idnlgrey
объект.
Фигура 1. Принципиальная схема двигателя постоянного тока.
Если вы игнорируете нарушения порядка и выбираете y(1)
как угловое положение [рад] и y(2)
в качестве скорости вращения [рад/с] двигателя можно задать линейную структуру пространства состояний следующей формы (см. Ljung, L. System Identification: Theory for the User, Upper Saddle River, NJ, Prentice-Hall PTR, 1999, 2nd ed., p. 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
является временной константой двигателя в [с] и k
- статический коэффициент усиления от входа до скорости вращения в [рад/( V * s)]. Смотрите 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 ®, но можете также использовать MEX-файлы на C (для увеличения вычислительной скорости), 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
(входной вектор, [] для timeseries).
Следуйте упорядоченному списку параметров. Параметрами могут быть скаляры, векторы-столбцы или 2-мерные матрицы.
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. Просмотрите начальную модель.
A. Получите базовую информацию о модели.
Двигатель постоянного тока имеет 2 (начальные) состояния и 2 параметра модели.
size(nlgr)
Nonlinear grey-box model with 2 outputs, 1 inputs, 2 states and 2 parameters (2 free).
б. Просмотрите начальные состояния и параметры.
И начальные состояния, и параметры являются массивами структур. Поля задают свойства отдельного начального состояния или параметра. Тип 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
для получения дополнительной информации о свойствах модели. The 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 с адаптивной регулировкой длины шага). Опции симуляции заданы с помощью свойства модели «SimulationOptions».
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 DC-двигателя.
4. Проверьте ошибки предсказания.
Полученные ошибки предсказания малы и сосредоточены вокруг нуля (не смещены).
pe(z, nlgr);
Фигура 6: Ошибки предсказания, полученные с помощью предполагаемой модели двигателя постоянного тока IDNLGREY.
5. Проверьте невязки («остатки»).
Невязки указывают, что остается необъясненным моделью и малы для хорошего качества модели. Используйте resid
команда для просмотра корреляций между невязками. В первом столбце графиков показаны автокорреляции невязок для двух выходов. Во втором столбце показана перекрестная корреляция этих невязок с входом «Voltage». Корреляции находятся в пределах допустимых границ (синяя область).
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.
Этот пример иллюстрирует основные инструменты для выполнения нелинейного серого ящика. Смотрите другие нелинейные примеры серого, чтобы узнать о:
Использование нелинейных серых серых ящиков в более совершенных ситуациях моделирования, таких как создание нелинейных непрерывных и дискретных моделейtimeseries и статических моделей.
Запись и использование C MEX model-файлов.
Обработка нескалярных параметров.
Влияние определенных вариантов алгоритма.
Для получения дополнительной информации об идентификации динамических систем с помощью System Identification Toolbox, посетите информационную страницу System Identification Toolbox.