В этом примере показано, как идентифицировать один вход один выход (SISO) нелинейные модели черного квадрата с помощью измеренных данных ввода - вывода. Пример использует результаты измерений от системы 2D бака, чтобы исследовать различные структуры модели и идентификационный выбор.
В этом примере переменные данных сохранены в twotankdata.mat
файл будет использоваться. Это содержит 3 000 выборок данных ввода - вывода системы 2D бака, сгенерированной с помощью интервала выборки 0,2 секунд. Вход u (t) является напряжением [V], применился к насосу, который генерирует приток в верхний бак. Довольно маленькое отверстие в нижней части этого верхнего бака дает к оттоку, который входит в более низкий бак, и выход y (t) двух систем бака является затем уровнем жидкости [m] более низкого бака. Мы создаем объект IDDATA z
инкапсулировать загруженные данные:
Этот набор данных также используется в нелинейном сером примере поля "Две Системы Бака: Моделирование Файла MEX на C Непрерывной Системы SISO", где физические уравнения, описывающие систему, приняты. Этот пример о моделях черного квадрата, таким образом никакое физическое уравнение не принято.
load twotankdata z = iddata(y, u, 0.2, 'Name', 'Two tank system');
Давайте построим целые 3 000 выборок данных, в течение времени в пределах от от 0 до 600 секунд.
Вход является многоступенчатым сигналом с различными уровнями.
plot(z)
Разделите этот набор данных в 3 подмножества равного размера, каждый содержащий 1 000 выборок.
Согласно графику данных, сигналы ввода и вывода z2 (средняя треть графика) похожи на сигналы z1, но те z3 очень отличаются, немного вне областей значений ввода и вывода z1.
Мы оценим модели с z1 и оценим их на z2 и z3. В некотором смысле z2 позволяет оценивать способность к интерполяции моделей, и z3 позволяет оценивать их способность к экстраполяции в некоторой степени.
z1 = z(1:1000); z2 = z(1001:2000); z3 = z(2001:3000);
Первый шаг в оценке нелинейных моделей черного квадрата должен выбрать порядки модели. Для модели IDNLARX Порядки = [na nb nk], задавая количества мимо выходных параметров, прошлых входных параметров и входной задержки раньше предсказывали текущую производительность.
Порядки модели Usually выбраны испытаниями и ошибками. Иногда полезно попробовать линейные модели ARX сначала для того, чтобы получить подсказки о порядках модели. Таким образом давайте сначала попробуем инструмент для линейного выбора порядков модели ARX.
V = arxstruc(z1,z2,struc(1:5, 1:5,1:5)); nn = selstruc(V,'aic') % selection of nn=[na nb nk] by Akaike's information criterion (AIC)
nn = 5 1 3
Критерий AIC выбрал nn = [na nb nk] = [5 1 3], означая, что в выбранной структуре модели ARX y (t) предсказан этими 6 регрессорами y (t-1), y (t-1)..., y (t-5) и u (t-3). Мы попытаемся использовать эти значения в нелинейных моделях.
В модели IDNLARX выход модели является нелинейной функцией регрессоров, как model_output (t) = F (y (t-1), y (t-1)..., y (t-5), u (t-3)).
Модели IDNLARX обычно оцениваются с синтаксисом:
M = NLARX(Data, Orders, Nonlinearity).
Это похоже на линейную команду ARX с дополнительным аргументом Nonlinearity, задающим тип средства оценки нелинейности.
Чтобы оценить модель IDNLARX, после выбора порядков модели, мы должны выбрать средство оценки нелинейности, которое будет использоваться. Давайте сначала попробуем средство оценки WAVENET.
mw1 = nlarx(z1,[5 1 3], wavenet);
Количество модулей (wavenet функции) в средстве оценки WAVENET было автоматически выбрано. К этому можно получить доступ как показано ниже.
mw1.Nonlinearity.NumberOfUnits
ans = 3
Исследуйте результат путем сравнения выхода, симулированного с предполагаемой моделью и выходом в данных об оценке z1:
compare(z1,mw1);
Первая модель была не совсем удовлетворительной, таким образом давайте попытаемся изменить некоторые свойства модели. Вместо того, чтобы позволить алгоритму оценки автоматически выбрать количество модулей в средстве оценки WAVENET, может быть явным образом задан этот номер.
mw2 = nlarx(z1,[5 1 3], wavenet('NumberOfUnits',8));
InputName по умолчанию и OutputName использовались.
mw2.InputName mw2.OutputName
ans = 1x1 cell array {'u1'} ans = 1x1 cell array {'y1'}
Регрессоры модели IDNLARX могут быть просмотрены с командой getreg. Регрессоры сделаны из mw2.InputName
, mw2.OutputName
и задержки.
getreg(mw2)
Regressors: y1(t-1) y1(t-2) y1(t-3) y1(t-4) y1(t-5) u1(t-3)
Важным свойством моделей IDNLARX является NonlinearRegressors. Выход модели IDNLARX является функцией регрессоров. Обычно эта функция имеет линейный блок и нелинейный блок. Выход модели является суммой выходных параметров двух блоков. Для того, чтобы уменьшать сложность модели, подмножество регрессоров может быть выбрано, чтобы ввести нелинейный блок. Эти регрессоры упоминаются как "нелинейные регрессоры".
Нелинейные регрессоры могут быть заданы как вектор индексов регрессора в порядке регрессоров, возвращенных GETREG. Для примера mw2 целый список регрессоров отображен ниже, и NonlinearRegressors = [1 2 6] соответствует y1 (t-1), y1 (t-2) и u1 (t-3) в следующем списке.
getreg(mw2)
Regressors: y1(t-1) y1(t-2) y1(t-3) y1(t-4) y1(t-5) u1(t-3)
Нелинейные регрессоры могут быть обозначены парой Значения свойства как в следующем примере. Заметьте сокращение 'nlreg' = 'NonlinearRegressors'.
%mw3 = nlarx(z1,[5 1 3], wavenet, 'NonlinearRegressors', [1 2 6]); mw3 = nlarx(z1,[5 1 3], wavenet, 'nlreg', [1 2 6]); % using short-hand notation getreg(mw3, 'nonlinear') % get nonlinear regressors
Nonlinear regressors: y1(t-1) y1(t-2) u1(t-3)
Вместо индексов регрессора некоторые ключевые слова могут также использоваться, чтобы указать на нелинейные регрессоры: 'введите' для регрессоров, состоящих из задержанных входных параметров, и 'выведите' для регрессоров, состоящих из задержанных выходных параметров. В следующем примере 'вход' указывает на единственный входной регрессор u1 (t-3).
mw4 = nlarx(z1,[5 1 3],wavenet,'nlreg','input'); mw4.nlreg % 'nlreg' is the short-hand of 'NonlinearRegressors' getreg(mw4,'nonlinear') % get nonlinear regressor
ans = 6 Nonlinear regressors: u1(t-3)
Чтобы автоматически попробовать все возможные подмножества регрессоров как нелинейные регрессоры и выбрать тот, приводящий к самой низкой ошибке симуляции, используйте значение NonlinearRegressors ='search'. Этот исчерпывающий поиск обычно занимает много времени. Рекомендуется включить отображение итерации при использовании параметра поиска.
Этот пример может занять время.
opt = nlarxOptions('Display','on'); mws = nlarx(z1,[5 1 3], wavenet, 'nlreg', 'search', opt);
К результату поиска можно получить доступ в mws.nlreg, получившееся значение mws.nlreg = [4 6] означает, что 4-е и 6-е регрессоры нелинейны в следующем списке регрессоров. Другими словами, y1 (t-4) и u1 (t-3) используются в качестве нелинейных регрессоров.
mws.nlreg getreg(mws)
ans = 4 6 Regressors: y1(t-1) y1(t-2) y1(t-3) y1(t-4) y1(t-5) u1(t-3)
Различные модели, и линейные и нелинейные, могут быть сравнены вместе в той же команде COMPARE.
mlin = arx(z1,[5 1 3]); compare(z1,mlin,mw2,mws);
Теперь давайте смотреть, как mws ведет себя на наборе данных z2.
compare(z2,mws);
и на наборе данных z3.
compare(z3,mws);
График функций может использоваться, чтобы просмотреть ответы нелинейности различных моделей IDNLARX.
plot(mw2,mws) % plot nonlinearity response as a function of selected regressors
В месте WAVENET могут использоваться другие средства оценки нелинейности. Попробуйте средство оценки SIGMOIDNET.
ms1 = nlarx(z1,[5 1 3], sigmoidnet('NumberOfUnits', 8));
compare(z1,ms1)
Теперь оцените новую модель на наборе данных z2.
compare(z2,ms1);
и на наборе данных z3.
compare(z3,ms1);
CUSTOMNET похож на SIGMOIDNET, но вместо сигмоидальной модульной функции, пользователь может задать другие модульные функции в файлах MATLAB. Этот пример использует gaussunit функцию, определяемую в функции gaussunit.m.
TREEPARTITION является другим средством оценки нелинейности.
mc1 = nlarx(z1,[5 1 3], customnet(@gaussunit),'nlreg',[3 5 6]);
mt1 = nlarx(z1,[5 1 3], treepartition);
Если у вас есть лицензия Deep Learning Toolbox™, можно также использовать нейронную сеть в оценке.
Здесь, мы создадим сеть одно выхода с неизвестным количеством входных параметров (обозначьте входным размером нуля в сетевом объекте). Номер входных параметров определяется к количеству регрессоров (как определено порядками модели) в модели IDNLARX во время процесса оценки автоматически.
Сравните ответы моделей mc1
и mt1
к данным z1
compare(z1, mc1, mt1) if exist('feedforwardnet','file')==2 % Run only if Deep Learning Toolbox is available ff = feedforwardnet([5 20]); ff.layers{2}.transferFcn = 'radbas'; ff.trainParam.epochs = 50; mn1 = nlarx(z1,[5 1 3], neuralnet(ff)); % estimation with neuralnet nonlinearity compare(z1, mn1) % compare fit to estimation data end
Модель Хаммерстайна-Винера состоит максимум из 3 блоков: линейному блоку передаточной функции предшествует нелинейный статический блок и/или сопровождает другой нелинейный статический блок. Это называется Винеровской моделью, если первый нелинейный статический блок отсутствует, и модель Хаммерстайна, если второй нелинейный статический блок отсутствует.
Модели IDNLHW обычно оцениваются с синтаксисом:
M = NLHW(Data, Orders, InputNonlinearity, OutputNonlinearity).
где Порядки = [nb bf nk] задают порядки и задержку линейной передаточной функции, InputNonlinearity и OutputNonlinearity задают средства оценки нелинейности для двух нелинейных блоков. Линейная модель ошибки на выходе (OE) соответствует случаю тривиальной единичной нелинейности.
PWLINEAR (кусочный линейный) средство оценки нелинейности полезен в общих моделях IDNLHW.
Заметьте, что, в Порядках = [nb nf nk], nf задает количество полюсов линейной передаточной функции, несколько связанной с na
порядок модели IDNLARX
mhw1 = nlhw(z1, [1 5 3], pwlinear, pwlinear);
Результат может быть оценен с COMPARE как прежде.
compare(z1,mhw1)
Свойства модели могут визуализироваться Командой plot.
Нажмите на блок-схему, чтобы выбрать представление входной нелинейности (UNL), линейного блока или выходной нелинейности (YNL).
Для линейного блока возможно выбрать тип графиков в Переходном процессе, Диаграммы Боде, Импульсной характеристики и нулевой полюсом карты.
plot(mhw1)
Точки останова двух кусочных линейных средств оценки могут быть исследованы (заметьте, что сокращения 'u' = 'Вход', 'y' = 'Выход', 'nl' = 'Нелинейность' могут использоваться). Это - две матрицы строки, первая строка соответствует входу и второй строке к выходу средства оценки PWLINEAR.
mhw1.unl.BreakPoints
ans = Columns 1 through 7 2.6503 3.4087 4.1672 4.9256 5.6313 6.3589 7.0864 -2.1860 -1.6530 -0.0922 1.8048 3.2388 4.3227 5.0454 Columns 8 through 10 7.8140 8.3078 9.1655 5.4403 5.5084 7.6771
НАСЫЩЕНИЕ и средства оценки DEADZONE могут использоваться, если такая нелинейность, как предполагается, присутствует в системе.
mhw2 = nlhw(z1, [1 5 3], deadzone, saturation); compare(z1,mhw2)
Отсутствие нелинейности обозначается объектом UNITGAIN, или пустым" []" значение. Сокращенные имена средств оценки нелинейности могут также использоваться.
mhw3 = nlhw(z1, [1 5 3], 'dead',unitgain); mhw4 = nlhw(z1, [1 5 3], [],'satur');
Предельные значения DEADZONE и НАСЫЩЕНИЯ могут быть соответственно исследованы.
mhw2.unl.ZeroInterval mhw2.ynl.LinearInterval
ans = 0.9856 3.5657 ans = 0.0274 0.5660
Исходное предположение ZeroInterval для DEADZONE или LinearInterval для НАСЫЩЕНИЯ может быть обозначено в средствах оценки:
mhw5 = nlhw(z1, [1 5 3], deadzone([0.1 0.2]), saturation([-1 1]));
Опции алгоритма оценки могут быть заданы с помощью команды NLHWOPTIONS.
opt = nlhwOptions();
opt.SearchMethod = 'gna';
opt.SearchOptions.MaxIterations = 3;
mhw6 = nlhw(z1, [1 5 3], deadzone, saturation, opt);
Уже предполагаемая модель может быть усовершенствована большим количеством итераций оценки
Оцененный на данных об оценке z1, mhw7 должен иметь лучшую подгонку, чем mhw6.
mhw7 = nlhw(z1, mhw6, opt); compare(z1, mhw6, mhw7)
Средства оценки нелинейности PWLINEAR, НАСЫЩЕНИЕ и DEADZONE были в основном спроектированы для использования в моделях IDNLHW. Они могут только оценить одну переменную нелинейность. Другие более общие средства оценки нелинейности, SIGMOIDNET, CUSTOMNET и WAVENET, могут также использоваться в моделях IDNLHW. Однако недифференцируемый TREEPARTITION средств оценки и NEURALNET не применимы, потому что для оценки моделей IDNLHW нужны производные средств оценки нелинейности в итеративных алгоритмах. Введите "idprops idnlestimators" для сводных данных средств оценки нелинейности.