Этот пример показывает нелинейное моделирование черного ящика динамического поведения магнитореологического жидкого демпфера. Это показывает, как создать Нелинейный ARX и модели Хаммерстайна-Винера демпфера с помощью измерений его скорости и силы затухания.
Данные, используемые в этом примере, были обеспечены доктором Акирой Сано (Университет Кэйо, Япония) и доктором Джиэндонгом Ваном (Пекинский университет, Китай), кто выполнил эксперименты в лаборатории Университета Кэйо. Смотрите следующую ссылку для более подробного описания экспериментальной системы и некоторых связанных исследований.
J.Wang, А. Сано, Т. Чен и Б. Хуан. Идентификация систем Хаммерстайна без явной параметризации нелинейности. Международный журнал Управления, В нажатии, 2008. DOI: 10.1080/00207170802382376.
Магнитореологические (MR) жидкие демпферы являются полуактивными управляющими устройствами, используемыми для сокращения колебаний различных динамических структур. Жидкости MR, вязкости которых зависят от входного напряжения / текущий из устройства, предоставляют управляемым силам затухания.
Чтобы изучить поведение таких устройств, демпфер MR был зафиксирован в одном конце земле и соединился в другом конце таблице шейкера, генерирующей колебания. Напряжение демпфера было установлено в 1,25 против f силы затухания (t), был произведен каждые 0,005 с. Смещение было произведено каждые 0,001 с, который затем использовался, чтобы оценить скорость v (t) в период выборки 0,005 с.
Набор данных, содержащий измерения ввода и вывода, хранился в файле MAT, названном mrdamper.mat. Вход v (t) является скоростью [cm/s] демпфера, и выход f (t) является силой затухания [N]. Файл MAT содержит 3 499 выборок данных, соответствующих частоте дискретизации 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 в два подмножества, сначала 2 000 выборок, которые будут использоваться для оценки (ze) и остальных, чтобы использоваться для валидации результатов (zv).
ze = z(1:2000); % estimation data zv = z(2001:end); % validation data
Давайте построим эти два набора данных вместе, чтобы визуально проверить их области значений времени:
plot(ze, zv) legend('ze','zv')
Первый шаг в оценке моделей черного квадрата должен выбрать порядки модели. Определение порядков зависит от типа модели.
Для линейных и нелинейных моделей ARX порядки представлены тремя числами: na, nb и nk, которые задают количество мимо выходных параметров, прошлых входных параметров и вводят задержки, используемые для предсказания значения выхода в установленный срок. Набор задержанных временем переменных I/O, заданных порядками, называется "регрессорами". Для большей гибкости в создании регрессоров можно использовать объекты спецификации регрессора (см. linearRegressor, polynomialRegressor, customRegressor).
Поскольку Хаммерстайн-Винер моделирует, которые представляют линейные модели статической нелинейностью ввода-вывода, порядки задают количество полюсов и нулей и вводят задержку линейного компонента. Они заданы числами nb (количество нулей +1), nf (количество полюсов), и nk (входная задержка количества задержек).
Порядки модели Typically выбраны методом проб и ошибок. Однако порядки линейной модели 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 выбрал Order = [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).
Для получения дополнительной информации о выборе порядка модели смотрите пример, названный "Выбор Структуры модели: Определение Задержки Порядка и Входа Модели".
Желательно попробовать линейные модели сначала, потому что они более просты создать. Если линейные модели не обеспечивают удовлетворительные результаты, результаты обеспечивают базис для исследования нелинейных моделей.
Давайте оценим линейные модели ARX и Output-Error (OE) порядков, предложенных выходом SELSTRUC выше.
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%-ю подгонку к данным о валидации. Чтобы достигнуть лучших результатов, мы теперь исследуем использование моделей Nonlinear 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 idTreePartition function 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.
Модели Nonlinear ARX могут быть рассмотрены как нелинейные дубликаты моделей ARX, которые обеспечивают большую гибкость моделирования двумя средними значениями:
Регрессоры могут быть объединены с помощью нелинейной функции, а не взвешенной суммы, используемой моделями ARX. Могут использоваться нелинейные функции, такие как сигмоидальная сеть, двоичное дерево и сеть вейвлета. В идентификационном контексте эти функции вызваны "нелинейные функции отображения".
Регрессоры могут самостоятельно быть произвольными (возможно нелинейный) функции переменных I/O в дополнение к задержанным временем значениям переменных, используемым моделями ARX.
Когда линейный с непрерывными задержками, регрессоры наиболее легко создаются с помощью матрицы порядка [na nb nk], аналогичный описанному выше. В наиболее общем случае регрессоров с произвольными задержками, или когда регрессоры основаны на абсолютных значениях переменных, с помощью linearRegressor
объект обеспечивает больше гибкости. В случае, если регрессоры являются полиномами задержанных временем переменных, они могут быть созданы с помощью polynomialRegressor
объект. Для регрессоров, использующих произвольные, заданные пользователями формулы, customRegressor
объекты могут использоваться.
Мы исследуем использующие различные порядки модели и использование различных нелинейных функций отображения. Использование полиномиальных или пользовательских регрессоров не исследуется. Для способов задать пользовательские регрессоры в моделях IDNLARX, смотрите пример, названный, "Создавая Нелинейные Модели ARX с Нелинейными и Пользовательскими Регрессорами".
Чтобы начаться, давайте оценим модель IDNLARX порядка [2 4 1] и сигмоидальная сеть как тип нелинейности. Мы будем использовать MaxIterations = 50, и метод поиска Levenberg-Marquardt как опции оценки для всех оценок ниже.
Options = nlarxOptions('SearchMethod', 'lm'); Options.SearchOptions.MaxIterations = 50; Narx1 = nlarx(ze, [2 4 1], idSigmoidNetwork, 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
команда, используемая для оценки моделей Nonlinear ARX. Narx1 является моделью Nonlinear ARX с регрессорами R: = [f (t-1), f (t-2), v (t-1)... v (t-4)]. Нелинейность является сетью Sigmoid, которая использует комбинацию сигмоидальных модульных функций и линейную взвешенную сумму регрессоров, чтобы вычислить выход. Функция отображения хранится в 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: '<Function inputs>' Output: '<Function output>' LinearFcn: '<Linear function parameters>' NonlinearFcn: '<Sigmoid units and their parameters>' Offset: '<Offset parameters>'
Исследуйте качество модели путем сравнения симулированного выхода с предполагаемыми и подтвержденными наборами данных ze и zv:
compare(ze, Narx1); % comparison to estimation data
compare(zv, Narx1); % comparison to validation data
Мы видим лучшую подгонку по сравнению с линейными моделями тех же порядков. Затем мы можем попробовать другие порядки около предложенных SELSTRUC.
NL = idSigmoidNetwork; Narx2{1} = nlarx(ze, [3 4 1], NL, Options); % use na = 3, nb = 4, nk = 1. Narx2{1}.Name = 'Narx2_1'; Narx2{2} = nlarx(ze, [2 5 1], NL, Options); Narx2{2}.Name = 'Narx2_2'; Narx2{3} = nlarx(ze, [3 5 1], NL, Options); Narx2{3}.Name = 'Narx2_3'; Narx2{4} = nlarx(ze, [1 4 1], NL, Options); Narx2{4}.Name = 'Narx2_4'; Narx2{5} = nlarx(ze, [2 3 1], NL, Options); Narx2{5}.Name = 'Narx2_5'; Narx2{6} = nlarx(ze, [1 3 1], NL, 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)] как набор регрессоров.
Затем давайте исследуем структуру Сигмоидальной Сетевой функции. Самое соответствующее свойство этого средства оценки является количеством сигмоидальных модулей, которые это использует. Создайте тот, который использует 12 сигмоидальных модулей.
Sig = idSigmoidNetwork(12); % create a network 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] здесь), используются нелинейной функцией (сигмоидальная сеть). Если количество регрессоров является большим, это может увеличить сложность модели. Возможно выбрать подмножество регрессоров, которые будут использоваться компонентами сигмоидальной сети, не изменяя порядки модели. Это упрощено свойством под названием 'RegressorUsage'. Его значение является таблицей, которая задает, какой регрессор используются который компоненты. Например, мы можем исследовать использование только те регрессоры, которые внесены входными переменными, которые будут использоваться нелинейным компонентом сигмоидальной функции. Это может быть сделано можно следующим образом:
Sig = idSigmoidNetwork(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) не используется. Обратите внимание на то, что функция idSigmoidNetwork также содержит линейный член, представленный взвешенной суммой всех регрессоров. Линейный член использует полный набор регрессоров.
Создайте другую модель, которая использует регрессоры {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
До сих пор мы исследовали различные порядки модели, количество модулей, которые будут использоваться в Сигмоидальной Сетевой функции и спецификации подмножества регрессоров, которые будут использоваться нелинейным компонентом сигмоидальной сети. Затем мы пытаемся использовать другие типы нелинейных функций.
Используйте функцию Сети Вейвлета со свойствами по умолчанию. Как сигмоидальная сеть, сеть вейвлета сопоставляет регрессоры с выходом при помощи суммы линейных и нелинейных компонентов; нелинейный компонент использует сумму вейвлетов.
NarxInit = idnlarx(ze.OutputName, ze.InputName, [1 3 1], idWaveletNetwork); % Use only regressors 1 and 3 for the nonlinear component of network NarxInit.RegressorUsage.("f:NonlinearFcn")([2 4]) = false; Narx6 = nlarx(ze, NarxInit, Options);
Используйте Древовидный Раздел нелинейная функция с 20 модулями:
TreeNet = idTreePartition; 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
команда, мы можем предварительно выбрать ту, которая обеспечивает лучшие результаты, не добавляя слишком много дополнительной сложности. Выбранная модель может затем анализироваться дальнейшая команда использования, такая как plot
и resid
.
Чтобы получить некоторое понимание природы нелинейности модели, смотрите поперечные сечения нелинейной функции F () в предполагаемой модели f (t) = F (f (t-1), f (t-2), v (t-1)..., v (t-4)). Например, в модели Narx5, функция F () является сигмоидальной сетью. Чтобы исследовать форму выхода F () в зависимости от регрессоров, используйте Команду plot на модели:
plot(Narx5)
Окно графика предлагает инструменты для выбора регрессоров поперечного сечения и их областей значений. Для получения дополнительной информации см. "справку idnlarx/plot".
Остаточный тест может использоваться, чтобы далее смотреть модель. Этот тест показывает, являются ли ошибки предсказания белыми и некоррелироваными к входным данным.
set(gcf,'DefaultAxesTitleFontSizeMultiplier',1,... 'DefaultAxesTitleFontWeight','normal',... 'Position',[100 100 780 520]); resid(zv, Narx3, Narx5)
Отказ остаточного теста может указать на динамику, не полученную моделью. Для модели, Narx3, остаточные значения, кажется, в основном в 99% доверительных границ.
Ранее предполагаемые нелинейные модели являются всем Нелинейным ARX (IDNLARX) тип. Давайте теперь попробуем модели (IDNLHW) Хаммерстайна-Винера. Эти модели представляют последовательную связь статических нелинейных элементов с линейной моделью. Мы можем думать о них как о расширениях линейной ошибки на выходе (OE) модели, где мы подвергаем сигналы ввода и вывода линейной модели к статической нелинейности, такой как насыщение или мертвые зоны.
Линейная модель LinMod2 OE была оценена с помощью порядков nb = 4, nf = 2 и nk = 1. Давайте использовать те же порядки для оценки модели IDNLHW. Мы будем использовать сигмоидальную сеть в качестве нелинейности для обеих нелинейности ввода и вывода. Оценка упрощена nlhw
команда. Это походит на oe
команда используется для линейной оценки модели OE. Однако в дополнение к порядкам модели, мы должны также задать имена, или объекты для, нелинейность ввода-вывода.
Opt = nlhwOptions('SearchMethod','lm'); UNL = idSigmoidNetwork; YNL = idSigmoidNetwork; Nhw1 = nlhw(ze, [4 2 1], UNL, YNL, 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.
Что касается моделей Nonlinear ARX, модели Хаммерстайна-Винера могут смотреться для их характера нелинейности ввода-вывода и поведения линейного компонента с помощью Команды plot. Для получения дополнительной информации введите "справку idnlhw/plot" в командном окне MATLAB.
plot(Nhw1)
По умолчанию входная нелинейность построена, показав, что это может быть просто функция насыщения.
Путем нажатия на значок Y_NL выходная нелинейность похожа на кусочную линейную функцию.
Нажмите на Линейный значок Блока и выберите Pole-Zero Map в выпадающем меню, затем замечено, что нуль и полюс вполне друг близко к другу, указывая, что они могут быть удалены, таким образом, уменьшая порядки модели.
Мы будем использовать эту информацию, чтобы сконфигурировать структуру модели как показано затем.
Используйте насыщение для входной нелинейности и сигмоидальную сеть для выходной нелинейности, сохраняя порядок линейного компонента неизменным:
Nhw2 = nlhw(ze, [4 2 1], idSaturation, idSigmoidNetwork, Opt);
Используйте кусочно-линейную нелинейность для выхода и сигмоидальную сеть для входа:
Nhw3 = nlhw(ze, [4 2 1], idSigmoidNetwork, idPiecewiseLinear, Opt);
Используйте линейную модель более низкоуровневую:
Nhw4 = nlhw(ze, [3 1 1], idSigmoidNetwork, idPiecewiseLinear, Opt);
Мы можем также принять решение "удалить" нелинейность во входе, выходе или обоих. Например, для того, чтобы использовать только входную нелинейность (такие модели называются моделями Хаммерстайна), мы можем задать [] как выходная нелинейность:
Nhw5 = nlhw(ze, [3 1 1],idSigmoidNetwork, [], 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, имеют подобную эффективность.
Мы исследовали различные нелинейные модели для описания отношения между входом напряжения и силой затухания выход. Было замечено, что среди моделей Nonlinear ARX, Narx2 {6} и Narx5 выполнили лучшее, в то время как модель Nhw1 была лучшей среди моделей Хаммерстайна-Винера. Мы также нашли, что модели Nonlinear ARX предоставили наилучшую возможность (лучшие подгонки) для описания динамики демпфера MR.
Narx5.Name = 'Narx5'; Nhw1.Name = 'Nhw1'; compare(zv, LinMod2, Narx2{6}, Narx5, Nhw1)
Мы нашли, что существует несколько опций, доступных с каждым типом модели, чтобы подстроить качество результатов. Для моделей Nonlinear ARX мы можем не только задать порядки модели и тип нелинейных функций, но также и сконфигурировать, как регрессоры используются и настраивают свойства выбранных функций. Поскольку Хаммерстайн-Винер моделирует, мы можем выбрать тип ввода и вывода нелинейные функции, а также порядок линейного компонента. Для обоих типов модели мы имеем много вариантов в наличии нелинейных функций в нашем распоряжении, чтобы попытаться использовать. В отсутствии конкретной настройки структуре модели или знанию базовой динамики, рекомендуется попробовать различный выбор и анализировать их эффект на качестве получившихся моделей.