Этот пример показывает нелинейное моделирование черного ящика динамического поведения магнитореологического демпфера жидкости. Он показывает, как создать нелинейные модели ARX и Hammerstein-Wiener демпфера с помощью измерений его скорости и силы демпфирования.
Данные, использованные в этом примере, были предоставлены доктором Акирой Сано (Университет Кэйо, Япония) и доктором Цзяньдун Ван (Пекинский университет, Китай), которые провели эксперименты в лаборатории Университета Кэйо. См. следующую ссылку для более подробного описания экспериментальной системы и некоторых связанных с ней исследований.
J.Wang, A. Sano, T. Chen, and B. Huang. Идентификация систем Гаммерштейна без явной параметризации нелинейности. International Journal of Control, In press, 2008. DOI: 10,1080/ 00207170802382376.
Магнитореологические (МР) демпферы жидкости являются полуактивными устройствами управления, используемыми для уменьшения вибраций различных динамических структур. Жидкости MR, вязкость которых зависит от входного напряжения/тока устройства, обеспечивают управляемые демпфирующие силы.
Чтобы изучить поведение таких устройств, демпфер MR был закреплен на одном конце на земле и соединен на другом конце с шейкерной таблицей, генерирующим вибрации. Напряжение демпфера было установлено равным 1,25 против Демпфирующее усилие f (t) отбирали каждые 0,005 с. Водоизмещение отбирали каждые 0,001 с, который затем использовали для оценки скорости v (t) в период дискретизации 0,005 с.
Набор данных, содержащий входные и выходные измерения, хранился в файле MAT под названием mrdamper.mat. Вход v (t) является скоростью [см/с] демпфера, а выход f (t) является демпфирующей силой [N]. Файл MAT содержит 3499 выборок данных, соответствующих частоте дискретизации 0,005 с. Эти данные будут использоваться для всех задач оценки и валидации, выполненных в этом примере.
% Let us begin by loading and inspecting the data. load(fullfile(matlabroot, 'toolbox', 'ident', 'iddemos', 'data', 'mrdamper.mat')); who
Your variables are: F Ts V
Упакуйте загруженные переменные F (выход сила), V (вход скорость) и Ts (шаг расчета) в объект IDDATA.
z = iddata(F, V, Ts, 'Name', 'MR damper', ... 'InputName', 'v', 'OutputName', 'f',... 'InputUnit', 'cm/s', 'OutputUnit', 'N');
Разделите этот набор данных z на два подмножества, первые 2000 выборок, которые будут использоваться для оценки (ze), а остальные будут использоваться для валидации результатов (zv).
ze = z(1:2000); % estimation data zv = z(2001:end); % validation data
Давайте построим два набора данных вместе, чтобы визуально проверить их временные области значений:
plot(ze, zv) legend('ze','zv')
Первым шагом в оценке моделей черного ящика является выбор порядков моделей. Определение порядков зависит от типа модели.
Для линейных и нелинейных моделей ARX порядки представлены тремя числами: na, nb и nk, которые определяют количество прошлых выходов, прошлых входов и входных задержек, используемых для предсказания значения вывода в установленный момент времени. Набор переменных ввода-вывода с задержкой по времени, заданный в порядках, называется «регрессорами».
Для моделей Гаммерштейна-Винера, которые представляют линейные модели со статическими нелинейностями ввода-вывода, порядки задают количество полюсов и нулей и входную задержку линейного компонента. Они заданы числами nb (число нулей + 1), nf (количество полюсов) и nk (входная задержка в количестве лагов).
Обычно порядки моделей выбираются методом проб и ошибок. Однако порядки линейной модели ARX могут быть вычислены автоматически с помощью таких функций, как arxstruc
и selstruc
. Полученные таким образом порядки дают намек на возможные порядки, которые можно использовать и для нелинейных моделей. Так что давайте сначала попробуем определить лучший порядок для линейной модели ARX.
V = arxstruc(ze,zv,struc(1:5, 1:5,1:5)); % try values in the range 1:5 for na, nb, nk Order = selstruc(V,'aic') % selection of orders by Akaike's Information Criterion
Order = 2 4 1
Критерий AIC выбрал порядок = [na nb nk] = [2 4 1], что означает, что в выбранной структуре модели ARX сила демпфера f (t) предсказывается 6 регрессорами f (t-1), f (t-2), v (t-1), v (t-2), v (t-3) и v (t-4)
Для получения дополнительной информации о выборе порядка модели смотрите пример под названием «Выбор структуры модели: определение порядка модели и вход» (iddemo4.m).
Желательно сначала попробовать линейные модели, потому что их проще создать. Если линейные модели не дают удовлетворительных результатов, результаты обеспечивают базис для исследования нелинейных моделей.
Давайте оценим линейные модели ARX и Output-Error (OE) порядков, предложенных выходом SELSTRUN выше.
LinMod1 = arx(ze, [2 4 1]); % ARX model Ay = Bu + e LinMod2 = oe(ze, [4 2 1]); % OE model y = B/F u + e
Точно так же мы можем создать линейную модель пространства состояний, порядок (= количество состояний) которой будет определен автоматически:
LinMod3 = ssest(ze); % creates a state-space model of order 3
Теперь давайте сравним ответы этих моделей с измеренными выходными данными в ze:
compare(ze, LinMod1, LinMod2, LinMod3) % comparison to estimation data
Лучшим тестом для качества модели является проверка его на соответствие независимому набору данных. Следовательно, мы сравниваем ответы модели с набором данных zv.
compare(zv, LinMod1, LinMod2, LinMod3) % comparison to validation data
Как наблюдалось, лучшая из этих линейных моделей имеет подгонку 51% на наборе данных валидации.
Идентификация линейной модели показала, что модель ARX обеспечивала менее 50% подгонки данным валидации. Для достижения лучших результатов мы теперь исследуем использование нелинейных моделей ARX (IDNLARX). Необходимость нелинейных моделей для этих данных также предлагается advice
утилита, которая может использоваться для проверки данных на потенциальное преимущество использования нелинейной модели по сравнению с линейной моделью.
advice(ze, 'nonlinearity')
There is an indication of nonlinearity in the data. A nonlinear ARX model of order [4 4 1] and treepartition nonlinearity estimator performs better prediction of output than the corresponding ARX model of the same order. Consider using nonlinear models, such as IDNLARX, or IDNLHW. You may also use the "isnlarx" command to test for nonlinearity with more options.
Нелинейные модели ARX могут быть рассмотрены как нелинейные аналоги моделей ARX, которые обеспечивают большую гибкость моделирования двумя способами:
Регрессоры могут быть объединены с использованием нелинейной функции, а не взвешенной суммы, используемой моделями ARX. Могут использоваться нелинейные функции, такие как сигмоидная сеть, двоичное дерево и вейвлет. В контексте идентификации эти функции называются «нелинейными функциями отображения».
Регрессоры могут сами быть произвольными (возможно нелинейными) функциями переменных ввода-вывода в дополнение к задержанным во времени значениям переменных, используемым моделями ARX.
Когда линейный с смежными лагами, регрессоры легче всего создать с помощью матрицы порядка [na nb nk], как описано выше. В самом общем случае регрессоров с произвольными лагами или когда регрессоры основаны на абсолютных значениях переменных, используя linearRegressor
объект обеспечивает большую гибкость. В случае, если регрессоры являются полиномами задержанных по времени переменных, они могут быть созданы с помощью polynomialRegressor
объект. Для регрессоров, использующих произвольные, заданные пользователем формулы, customRegressor
можно использовать объекты.
Мы рассмотрим использование различных порядков моделей и использование различных нелинейных функций отображения. Использование полиномиальных или пользовательских регрессоров не исследуется. Для способов определения пользовательских регрессоров в моделях IDNLARX, смотрите пример под названием «Построение нелинейных моделей ARX с нелинейными и пользовательскими регрессорами».
Для начала давайте оценим модель порядка [2 4 1] IDNLARX и сигмоидную сеть как тип нелинейности. Мы будем использовать MaxIterations = 50, и метод поиска Левенберга-Марквардта в качестве опций оценки для всех приведенных ниже оценок.
Options = nlarxOptions('SearchMethod', 'lm'); Options.SearchOptions.MaxIterations = 50; Narx1 = nlarx(ze, [2 4 1], 'sigmoidnet',Options)
Narx1 = <strong>Nonlinear ARX model with 1 output and 1 input</strong> Inputs: v Outputs: f Regressors: Linear regressors in variables f, v Output function: Sigmoid Network with 10 units Sample time: 0.005 seconds Status: Estimated using NLARX on time domain data "MR damper". Fit to estimation data: 95.8% (prediction focus) FPE: 6.648, MSE: 6.08
nlarx
- команда, используемая для оценки нелинейных моделей ARX. Narx1 является нелинейной моделью ARX с регрессорами R: = [f (t-1), f (t-2), v (t-1)... v (t-4)]. Нелинейность является sigmoidnet
который использует комбинацию сигмоидных единичных функций и линейную взвешенную сумму регрессоров, чтобы вычислить выход. Функция отображения сохранена в OutputFcn
свойство модели.
disp(Narx1.OutputFcn)
<strong>Sigmoid Network</strong> Inputs: f(t-1), f(t-2), v(t-1), v(t-2), v(t-3), v(t-4) Output: f Nonlinear Function: Sigmoid network with 10 units. Linear Function: initialized to [48.3 -3.38 -3.34 -2.7 -1.38 2.15] Output Offset: initialized to -18.9 Input: [1×1 idpack.Channel] Output: [1×1 idpack.Channel] LinearFcn: [1×1 nlident.internal.UseProjectedLinearFcn] NonlinearFcn: [1×1 nlident.internal.RidgenetFcn] Offset: [1×1 nlident.internal.ChooseableOffset]
Исследуйте качество модели путем сравнения моделируемого выхода с оцененными и проверенными наборами данных ze и zv:
compare(ze, Narx1); % comparison to estimation data
compare(zv, Narx1); % comparison to validation data
Мы видим лучшую подгонку по сравнению с линейными моделями тех же порядков. Далее мы можем попробовать другие порядки в непосредственной близости от тех, которые предложены SELSTRUTRY.
Narx2{1} = nlarx(ze, [3 4 1], 'sigmoidnet',Options); % use na = 3, nb = 4, nk = 1. Narx2{1}.Name = 'Narx2_1'; Narx2{2} = nlarx(ze, [2 5 1], 'sigmoidnet',Options); Narx2{2}.Name = 'Narx2_2'; Narx2{3} = nlarx(ze, [3 5 1], 'sigmoidnet',Options); Narx2{3}.Name = 'Narx2_3'; Narx2{4} = nlarx(ze, [1 4 1], 'sigmoidnet',Options); Narx2{4}.Name = 'Narx2_4'; Narx2{5} = nlarx(ze, [2 3 1], 'sigmoidnet',Options); Narx2{5}.Name = 'Narx2_5'; Narx2{6} = nlarx(ze, [1 3 1], 'sigmoidnet',Options); Narx2{6}.Name = 'Narx2_6';
Оцените эффективность этих моделей на наборах данных оценки и валидации:
compare(ze, Narx1, Narx2{:}); % comparison to estimation data
compare(zv, Narx1, Narx2{:}); % comparison to validation data
Модельный Narx2 {6}, по-видимому, обеспечивает хорошую подгонку как к наборам данных оценки, так и к наборам данных валидации, в то время как его порядки меньше, чем у Narx1. Основываясь на этом наблюдении, давайте будем использовать [1 3 1] как порядки для последующих испытаний и сохранять Nlarx2 {6} для подгонки сравнений. Этот выбор порядков соответствует использованию [f (t-1), v (t-1), v (t-2), v (t-3)] в качестве набора регрессоров.
Далее давайте исследуем структуру функции Sigmoid Network. Наиболее релевантным свойством этой оценки является количество используемых им сигмоидных модулей. Чтобы иметь возможность задать количество модулей, зададим нелинейность в команде NLARX (третий входной параметр), используя объект, созданный при помощи его конструктора: sigmoidnet
. В форме объекта мы можем запросить и сконфигурировать различные свойства оценщика.
Sig = sigmoidnet(12); % create a SIGMOIDNET object that uses 12 units
Narx3 = nlarx(ze, [1 3 1], Sig, Options);
Мы сравниваем эту модель с Narx1 и Narx2 {6}, на наборах данных оценки и валидации:
compare(ze, Narx3, Narx1, Narx2{6}); % comparison to estimation data
compare(zv, Narx3, Narx1, Narx2{6}); % comparison to validation data
Новый Narx3 модели обеспечивает не лучшую подгонку, чем Narx2 {6}. Следовательно, мы сохраняем количество модулей до 10 в последующих испытаниях.
Обычно все регрессоры, заданные выбранными порядками ([1 3 1] здесь), используются нелинейной функцией (sigmoidnet). Если количество регрессоров большое, это может увеличить сложность модели. Возможно выбрать подмножество регрессоров, которые будут использоваться компонентами sigmoidnet, не изменяя порядки модели. Этому способствует свойство под названием 'RegressorUsage'. Его значение является таблицей, которая определяет, какой регрессор используется какими компонентами. Для примера мы можем исследовать использование только тех регрессоров, которые вносятся переменными входами, которые используются нелинейным компонентом сигмоидной функции. Это может быть сделано следующим образом:
Sig = sigmoidnet(10);
NarxInit = idnlarx(ze.OutputName, ze.InputName, [1 3 1], Sig);
NarxInit.RegressorUsage.("f:NonlinearFcn")(1) = false;
disp(NarxInit.RegressorUsage)
Narx4 = nlarx(ze, NarxInit, Options);
f:LinearFcn f:NonlinearFcn ___________ ______________ f(t-1) true false v(t-1) true true v(t-2) true true v(t-3) true true
Это заставляет регрессоры v (t-1), v (t-2) и v (t-3) использоваться сигмоидными единичными функциями. Регрессор f (t-1) на основе выходных переменных не используется. Обратите внимание, что оценка sigmoidnet также содержит линейный термин, представленный взвешенной суммой всех регрессоров. Линейный термин использует полный набор регрессоров.
Создайте другую модель, которая использует регрессоры {y1 (t-1), u1 (t-2), u1 (t-3)} для своего нелинейного компонента.
Use = false(4,1); Use([1 3 4]) = true; NarxInit.RegressorUsage{:,2} = Use; Narx5 = nlarx(ze, NarxInit, Options);
Модельный Narx5, по-видимому, очень хорошо работает как для наборов данных оценки, так и для валидации.
compare(ze, Narx5); % comparison to estimation data
compare(zv, Narx5); % comparison to validation data
До сих пор мы исследовали различные порядки моделей, количество модулей для использования в оценке Sigmoid Network и спецификацию подмножества регрессоров для использования нелинейным компонентом сигмоидной сети. Далее мы пытаемся использовать другие типы нелинейных функций. Для использования функций со свойствами по умолчанию, мы можем задать его имя как вектор символов к команде оценки, для примера 'wavenet'
. Однако, если мы хотим настроить свойства этих функций (таких как количество модулей или начальные значения его параметров), необходимо использовать форму объекта - создать объект, инкапсулирующий нелинейную функцию отображения, и затем задать ее свойства.
Используйте функцию Wavelet Network с свойствами по умолчанию. Как и сигмоиднет, вавенет отображает регрессоры на выход с помощью суммы линейных и нелинейных компонентов; нелинейный компонент использует сумму вейвлетов.
NarxInit = idnlarx(ze.OutputName, ze.InputName, [1 3 1], 'wavenet'); % Use only regressors 1 and 3 for the nonlinear component of wavenet NarxInit.RegressorUsage.("f:NonlinearFcn")([2 4]) = false; Narx6 = nlarx(ze, NarxInit, Options);
Используйте нелинейную функцию Древовидного разбиения с 20 модулями:
TreeNet = treepartition; TreeNet.NonlinearFcn.NumberOfUnits = 20; NarxInit.OutputFcn = TreeNet; Narx7 = nlarx(ze, NarxInit, Options);
Сравните результаты с Narx3 и Narx5
compare(ze, Narx3, Narx5, Narx6, Narx7) % comparison to estimation data
compare(zv, Narx3, Narx5, Narx6, Narx7) % comparison to validation data
Модели Narx6 и Narx7, по-видимому, работают хуже Narx5, хотя мы не исследовали все опции, связанные с их оценкой (такие как выбор нелинейных регрессоров, количество модулей и другие порядки моделей).
Как только модель была идентифицирована и подтверждена с помощью compare
команда, мы можем предварительно выбрать тот, который обеспечивает лучшие результаты, не добавляя слишком много дополнительной сложности. Выбранная модель может затем быть проанализирована далее с помощью команды, такой как ГРАФИК и resid
.
Чтобы получить некоторое представление о природе нелинейностей модели, смотрите сечения нелинейной функции F () в оценочной модели f (t) = F (f (t-1), f (t-2), v (t-1),..., v (t-4)). Для примера в модели Narx5 функция F () является сигмоидной сетью. Чтобы исследовать форму выхода F () как функции регрессоров, используйте команду PLOT на модели:
plot(Narx5)
Окно plot предлагает инструменты для выбора регрессоров поперечного сечения и их областей значений. Для получения дополнительной информации смотрите «help idnlarx/plot».
Остаточный тест может использоваться, чтобы дополнительно проверить модель. Этот тест показывает, являются ли ошибки предсказания белыми и некоррелированными к входным данным.
set(gcf,'DefaultAxesTitleFontSizeMultiplier',1,... 'DefaultAxesTitleFontWeight','normal',... 'Position',[100 100 780 520]); resid(zv, Narx3, Narx5)
Отказ остаточного теста может указать на динамику, не захваченную моделью. Для модели, Narx3, невязки, по-видимому, находятся в основном в пределах 99% доверительных границ.
Ранее оцененные нелинейные модели являются типом Nonlinear ARX (IDNLARX). Теперь попробуем модели Hammerstein-Wiener (IDNLHW). Эти модели представляют последовательное соединение статических нелинейных элементов с линейной моделью. Мы можем думать о них как о расширениях линейных моделей выходной ошибки (OE), где мы подвергаем входные и выходные сигналы линейной модели статическим нелинейностям, таким как насыщение или мертвые зоны.
Линейная модель OE LinMod2 была оценена с использованием порядков nb = 4, nf = 2 и nk = 1. Давайте будем использовать те же порядки для оценки модели IDNLHW. Мы будем использовать сигмоидную сеть как нелинейность как для входной, так и для выходной нелинейности. Оценке способствует nlhw
команда. Это аналогично oe
команда, используемая для оценки линейной модели OE. Однако в дополнение к порядкам моделей мы должны также задать имена или объекты нелинейностей ввода-вывода.
Opt = nlhwOptions('SearchMethod','lm'); Nhw1 = nlhw(ze, [4 2 1], 'sigmoidnet', 'sigmoidnet', Opt)
Nhw1 = Hammerstein-Wiener model with 1 output and 1 input Linear transfer function corresponding to the orders nb = 4, nf = 2, nk = 1 Input nonlinearity: Sigmoid Network with 10 units Output nonlinearity: Sigmoid Network with 10 units Sample time: 0.005 seconds Status: Estimated using NLHW on time domain data "MR damper". Fit to estimation data: 83.72% FPE: 97.72, MSE: 91.2
Сравните ответ этой модели с наборами данных оценки и валидации:
clf
compare(ze, Nhw1); % comparison to estimation data
compare(zv, Nhw1); % comparison to validation data
Мы наблюдаем около 70% подгонки данным валидации с помощью Nhw1 модели.
Что касается нелинейных моделей ARX, модели Гаммерштейна-Винера могут быть проверены на их природу нелинейности ввода-вывода и поведение линейного компонента с помощью команды PLOT. Для получения дополнительной информации введите «help idnlhw/plot» в Командном окне MATLAB.
plot(Nhw1)
По умолчанию строится график входа сигнала, показывающий, что это может быть просто функция насыщения.
Нажимая на значок Y_NL, выход нелинейность выглядит как кусочно-линейная функция.
Нажмите на значок Linear Block и выберите Pole-Zero Map в раскрывающемся меню, затем наблюдается, что нуль и полюс находятся довольно близко друг к другу, что указывает на то, что они могут быть удалены, тем самым снижая порядки модели.
Мы будем использовать эту информацию, чтобы сконфигурировать структуру модели, как показано далее.
Используйте насыщение для входной нелинейности и сигмоидную сеть для выходной нелинейности, сохраняя порядок линейного компонента неизменным:
Nhw2 = nlhw(ze, [4 2 1], 'saturation', 'sigmoidnet', Opt);
Используйте кусочно-линейную нелинейность для выхода и сигмоидную сеть для входа:
Nhw3 = nlhw(ze, [4 2 1],'sigmoidnet', 'pwlinear', Opt);
Используйте линейную модель нижнего порядка:
Nhw4 = nlhw(ze, [3 1 1],'sigmoidnet', 'pwlinear', Opt);
Мы также можем принять решение «удалить» нелинейность на входе, выходе или обоих. Для примера, в порядок использования только входа нелинейности (такие модели называются моделями Гаммерштейна), мы можем задать [] как выход нелинейность:
Nhw5 = nlhw(ze, [3 1 1],'sigmoidnet', [], Opt);
Сравните все модели
compare(ze, Nhw1, Nhw2, Nhw3, Nhw4, Nhw5) % comparison to estimation data
compare(zv, Nhw1, Nhw2, Nhw3, Nhw4, Nhw5) % comparison to validation data
Nhw1 остается лучшим среди всех моделей, что показано сравнением с данными валидации, но другие модели, кроме Nhw5, имеют сходную эффективность.
Мы исследовали различные нелинейные модели для описания зависимости между входным напряжением и выходным усилием демпфирования. Было видно, что среди нелинейных моделей ARX Narx2 {6}, и Narx5 показали лучшие результаты, в то время как Nhw1 модели была лучшей среди моделей Гаммерштейна-Винера. Мы также обнаружили, что нелинейные модели ARX предоставили оптимальную опцию (лучшие подгонки) для описания динамики демпфера MR.
Narx5.Name = 'Narx5'; Nhw1.Name = 'Nhw1'; compare(zv, LinMod2, Narx2{6}, Narx5, Nhw1)
Мы обнаружили, что существует несколько опций, доступных для каждого типа модели, чтобы точно настроить качество результатов. Для нелинейных моделей ARX мы можем не только задать порядки модели и тип нелинейных функций, но и сконфигурировать, как используются регрессоры, и настроить свойства выбранных функций. Для моделей Гаммерштейна-Винера мы можем выбрать тип входа и выходных нелинейных функций, а также порядок линейных компонентов. Для обоих типов модели у нас есть много вариантов нелинейных функций, доступных в нашем распоряжении, чтобы попробовать и использовать. В отсутствие определенного выбора структуры модели или знания базовой динамики рекомендуется попробовать различные варианты и проанализировать их эффект на качество полученных моделей.