Оценка моделей Гаммерштейна-Винера в командной строке

Можно оценить модели Гаммерштейна-Винера после выполнения следующих задач:

Оцените модель используя nlhw

Использовать nlhw для построения и оценки модели Гаммерштейна-Винера. После каждой оценки проверяйте модель, сравнивая ее с другими моделями и моделируя или прогнозируя реакцию модели.

Базовая оценка

Начните с самой простой оценки, используя m = nlhw(data,[nb nf nk]). Для примера:

load iddata3;
% nb = nf = 2 and nk = 1 
m = nlhw(z3,[2 2 1])
m =
Hammerstein-Wiener model with 1 output and 1 input
 Linear transfer function corresponding to the orders nb = 2, nf = 2, nk = 1
 Input nonlinearity: Piecewise Linear
 Output nonlinearity: Piecewise Linear
Sample time: 1 seconds

Status:                                       
Estimated using NLHW on time domain data "z3".
Fit to estimation data: 75.31%                
FPE: 2.019, MSE: 1.472

Второй входной параметр [nb nf nk] устанавливает порядок линейной передаточной функции, где nb количество нулей плюс 1, nf количество полюсов и nk - это вход задержка. По умолчанию и входная, и выходная оценки нелинейности являются кусочно-линейными функциями (см. pwlinear страница с описанием). m является idnlhw объект.

Для систем MIMO, nb, nf, и nk ny -by - nu матрицы. См. nlhw страница с описанием для получения дополнительной информации об оценке MIMO.

Сконфигурируйте оценки нелинейности

Можно задать другую оценку нелинейности, чем кусочно-линейные оценки по умолчанию.

m = nlhw(data,[nb,nf,nk],InputNL,OutputNL)

InputNL и OutputNL являются объектами оценки нелинейности. Если ваш входной сигнал двоичен, установите InputNL кому unitgain.

Чтобы использовать оценки нелинейности с настройками по умолчанию, задайте InputNL и OutputNL использование векторов символов (таких как 'wavenet' для вейвлет или 'sigmoidnet' для сигмоидной сети).

load iddata3;
m = nlhw(z3,[2 2 1],'sigmoidnet','deadzone');

Если необходимо сконфигурировать свойства нелинейного оценщика, используйте его представление объекта. Для примера, оценить модель Гаммерштейна-Винера, которая использует насыщение как вход нелинейность и одномерный полином степени 3 как выход нелинейность:

m = nlhw(z3,[2 2 1],'saturation',poly1d('Degree',3));

Третий входной 'saturation' задает нелинейность насыщения со значениями свойств по умолчанию. poly1d('Degree',3) создает одномерный полиномиальный объект степени 3.

Для моделей MIMO задайте нелинейности, используя объекты, если вы не хотите использовать ту же нелинейность с строением по умолчанию для всех каналов.

Эта таблица суммирует значения, которые задают оценки нелинейности.

НелинейностьЗначение (по умолчанию Строение нелинейности)Класс
Кусочно-линейный
(по умолчанию)
'pwlinear' pwlinear
Один слой сигмоидная сеть'sigmoidnet' sigmoidnet
Вейвлет'wavenet' wavenet
Насыщение'saturation' saturation
Мертвая зона'deadzone' deadzone
Один -
размерный полином
'poly1d' poly1d
Единичный коэффициент усиления'unitgain' или [ ]unitgain

Дополнительные доступные нелинейности включают пользовательские сети, которые вы создаете. Задайте пользовательскую сеть путем определения функции, вызываемой gaussunit.m, как описано в customnet страница с описанием. Определите пользовательский сетевой объект CNetw как:

Для получения дополнительной информации см. «Доступные оценки нелинейности для моделей Гаммерштейна-Винера».

Исключить входную или выходную нелинейность

Исключить нелинейность для определенного канала путем определения unitgain значение для InputNonlinearity или OutputNonlinearity свойства.

Если входной сигнал является двоичным, установите InputNL кому unitgain.

Для получения дополнительной информации об оценке модели и свойствах см. nlhw и idnlhw страницы с описанием.

Для описания каждой оценки нелинейности смотрите Доступные оценки нелинейности для моделей Гаммерштейна-Винера.

Итерационное уточнение модели

Оцените модель Гаммерштейна-Винера и затем используйте nlhw команда итерационного уточнения модели.

load iddata3;
m1 = nlhw(z3,[2 2 1],'sigmoidnet','wavenet');
m2 = nlhw(z3,m1);

Кроме того, используйте pem для уточнения модели.

m2 = pem(z3,m1);

Проверьте критерий завершения поиска в m.Report.Termination.WhyStop. Если WhyStop указывает, что оценка достигла максимального количества итераций, попробуйте повторить оценку и, возможно, указать большее значение для MaxIterations.

Запустите еще 30 итераций, начиная с m1 модели.

opt = nlhwOptions;
opt.SearchOptions.MaxIterations = 30;
m2 = nlhw(z3,m1,opt);

Когда m.Report.Termination.WhyStop значение Near (local) minimum, (norm(g) < tol или No improvement along the search direction with line search, проверьте свою модель, чтобы увидеть, соответствует ли эта модель данным. Если нет, решение может застрять в локальном минимуме поверхности функции затрат. Попробуйте настроить SearchOptions.Tolerance или SearchMethod опция nlhw набор опций и повторите оценку.

Можно также попробовать возмущать параметры последней модели, используя init, а затем доработать модель используя nlhw команда.

Случайным образом возмущают параметры исходных m1 модели об номинальных значениях.

m1p = init(m1);

Оцените параметры возмущенной модели.

M2 = nlhw(z3,m1p);

Обратите внимание, что использование init не гарантирует лучшего решения по дальнейшей доработке.

Улучшите результаты оценки, используя начальные состояния

Если ваша оцененная модель Гаммерштейна-Винера обеспечивает плохую подгонку к измеренным данным, можно повторить оценку, используя начальные значения состояния, оцененные из данных. По умолчанию начальные состояния, соответствующие линейному блоку модели Гаммерштейна-Винера, равны нулю.

Чтобы задать оценивающие начальные состояния во время оценки модели:

load iddata3;
opt = nlhwOptions('InitialCondition', 'estimate');
m = nlhw(z3,[2 2 1],sigmoidnet,[],opt);

Поиск и устранение проблем с оценкой

Если вы не получите удовлетворительную модель после многих испытаний с различными структурами модели и опциями оценки, возможно, что данные плохие. Например, ваши данные могут отсутствовать важные входные или выходные переменные и недостаточно охватывают все рабочие точки системы.

Нелинейная черно-коробочная система идентификации обычно требует больше данных, чем линейная идентификация модели, чтобы получить достаточную информацию о системе. Смотрите также Поиск и устранение проблем Оценки Модели.

Оценка нескольких моделей Гаммерштейна-Винера

Этот пример показывает, как оценить и сравнить несколько моделей Гаммерштейна-Винера с использованием измеренных входно-выходных данных.

Данные оценки и валидации нагрузки.

load twotankdata
z = iddata(y,u,0.2);
ze = z(1:1000); 
zv = z(1001:3000);

Оцените несколько моделей с помощью данных оценки ze и различные порядки моделей, задержки и настройки нелинейности.

m1 = nlhw(ze,[2 3 1]);
m2 = nlhw(ze,[2 2 3]);
m3 = nlhw(ze,[2 2 3],pwlinear('NumberofUnits',13),pwlinear('NumberofUnits',10));
m4 = nlhw(ze,[2 2 3],sigmoidnet('NumberofUnits',2),pwlinear('NumberofUnits',10));

Альтернативный способ выполнения оценки - сначала сконфигурировать структуру модели с помощью idnlhw, и затем оцените модель.

m5 = idnlhw([2 2 3],'deadzone','saturation');
m5 = nlhw(ze,m5);

Сравните получившиеся модели путем построения графиков выходов модели и измеренного результата в данных валидации zv.

compare(zv,m1,m2,m3,m4,m5)

Figure contains an axes. The axes contains 6 objects of type line. These objects represent zv (y1), m1: 25.42%, m2: 13.19%, m3: -9.551%, m4: 70.3%, m5: 35.13%.

Улучшите линейную модель, используя структуру Гаммерштейна-Винера

В этом примере показано, как использовать структуру модели Гаммерштейна-Винера для улучшения ранее оцененной линейной модели.

После оценки линейной модели вставьте ее в структуру Гаммерштейна-Винера, которая включает входные или выходные нелинейности.

Оцените линейную модель.

load iddata1
LM = arx(z1,[2 2 1]);

Извлеките коэффициенты передаточной функции из линейной модели.

[Num,Den] = tfdata(LM);

Создайте модель Гаммерштейна-Винера, где вы инициализируете свойства линейного блока B и F использование Num и Den, соответственно.

nb = 1;       % In general, nb = ones(ny,nu)
              % ny is number of outputs and nu is number of inputs
nf = nb;
nk = 0;       % In general, nk = zeros(ny,nu)
              % ny is number of outputs and nu is number of inputs
M = idnlhw([nb nf nk],[],'pwlinear');
M.B = Num;
M.F = Den;

Оцените коэффициенты модели, который уточняет коэффициенты линейной модели в Num и Den .

M = nlhw(z1,M);

Сравните отклики линейной и нелинейной модели с измеренными данными.

compare(z1,LM,M);

Figure contains an axes. The axes contains 3 objects of type line. These objects represent z1 (y1), LM: 54.22%, M: 70.56%.

Похожие темы