Нелинейные модели ARX с пользовательскими регрессорами

В этом примере показано, как использовать пользовательские регрессоры в нелинейных моделях ARX (IDNLARX), включая системы одного входа одного выхода (SISO) и много входа много выхода (MIMO).

Введение

В модели IDNLARX каждый выход является функцией регрессоров, которые являются преобразованиями прошлых входных параметров и мимо выходных параметров. Типичные регрессоры являются просто задержанными переменными ввода или вывода. Они упоминаются как STANDARD REGRESSORS. Также возможно использовать более усовершенствованные регрессоры в форме произвольных пользовательских функций задержанных переменных ввода и вывода. Такие регрессоры упоминаются как ПОЛЬЗОВАТЕЛЬСКИЕ REGRESSORS.

Рассмотрите пример электрической системы и с напряжением V и с током я как входные параметры. Если известно, что электроэнергия является важным количеством системы, то это целесообразно формировать пользовательский регрессор V*I. Может быть более эффективно использовать соответственно заданные пользовательские регрессоры, чем использовать стандартные регрессоры только.

Пример SISO: моделирование двигателя внутреннего сгорания

Файл icEngine.mat содержит один набор данных с 1 500 выборками ввода - вывода, собранными в частота дискретизации 0,04 секунд. Вход u (t) является напряжением [V] управление Обходным Неактивным Воздушным Клапаном (BPAV), и выход y (t) является скоростью вращения двигателя [RPM/100]. Данные загружаются и разделены в набор данных ze для оценки модели и другого набора данных zv для проверки допустимости модели.

load icEngine
z = iddata(y,u, 0.04);
ze = z(1:1000); 
zv = z(1001:1500);

Порядки модели

Порядки модели [na nb nk], которые также используются в линейной модели ARX, позволяют легко задавать стандартные регрессоры. Выбор порядков модели требует испытаний и ошибок. Поскольку этот пример позволил нам использовать [na nb nk] = [4 2 10], соответствуя стандартным регрессорам y (t-1), y (t-2), y (t-3), y (t-4), u (t-10), u (t-11).

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

m0 = nlarx(ze, [4 2 10], linear);

Входное имя, выходное имя и список регрессоров этой модели отображены ниже. Заметьте, что имена по умолчанию 'u1', 'y1' используются.

m0.InputName
ans = 1x1 cell array
    {'u1'}

m0.OutputName
ans = 1x1 cell array
    {'y1'}

getreg(m0)
Regressors:
    y1(t-1)
    y1(t-2)
    y1(t-3)
    y1(t-4)
    u1(t-10)
    u1(t-11)

Простые регрессоры, заданные векторами символов

Простые пользовательские регрессоры могут быть созданы в форме вектора символов как в следующем примере.

m1 = nlarx(ze, [4 2 10], linear, 'customreg', {'u1(t-10)^2', 'y1(t-1)^2'});

Общий список регрессоров, и стандартных и пользовательских, возвращен GETREG.

getreg(m1)
Regressors:
    y1(t-1)
    y1(t-2)
    y1(t-3)
    y1(t-4)
    u1(t-10)
    u1(t-11)
    u1(t-10)^2
    y1(t-1)^2

Давайте сравним эти две модели на наборе данных валидации zv.

compare(zv,m0,m1)

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

m2 = nlarx(ze, [0 0 0], 'linear', 'customreg', ...
           {'u1(t-10)^3', 'u1(t-11)^3', 'y1(t-1)', 'sin(y1(t-4))'});
getreg(m2)
Regressors:
    u1(t-10)^3
    u1(t-11)^3
    y1(t-1)
    sin(y1(t-4))

Полиномиальные регрессоры

Полиномиальные регрессоры могут быть легко созданы с командой POLYREG.

m3 = nlarx(ze, [4 2 10], 'lin');
pr = polyreg(m3, 'maxpower', 2, 'crossterm', 'off');
m3 = addreg(m3, pr);
m3 = nlarx(ze, m3);

getreg(m3)
Regressors:
    y1(t-1)
    y1(t-2)
    y1(t-3)
    y1(t-4)
    u1(t-10)
    u1(t-11)
    y1(t-1).^2
    y1(t-2).^2
    y1(t-3).^2
    y1(t-4).^2
    u1(t-10).^2
    u1(t-11).^2

Пользовательский конструктор Object регрессора

Форма вектора символов удобна для создания простых пользовательских регрессоров. Пользовательский конструктор Object регрессора более мощен для создания произвольных регрессоров.

В следующем примере регрессор создается как, потому что функция переменной, названной 'u1' и, задержала 10 выборок, другими словами: r1 = because(u1 (t-10)). Логическое значение в последнем входном параметре указывает, векторизован ли пользовательский регрессор или нет. Векторизованные регрессоры быстрее в расчетах, но требуют уходов в функции, обозначенной в первом входном параметре.

r1 = customreg(@cos, 'u1', 10, true)
Custom Regressor:
Expression: cos(u1(t-10))
        Function: @cos
       Arguments: {'u1'}
          Delays: 10
      Vectorized: 1
    TimeVariable: 't'

В этом примере включены 3 переменные. Заметьте оператор ".*" вместо "*" для векторизованного регрессора.

F = @(x1,x2,x3)sin(x1.*x2+x3); % Anonymous function
r2 = customreg(F, {'y1', 'u1', 'u1'}, [1 10 11], true)
Custom Regressor:
Expression: sin(y1(t-1).*u1(t-10)+u1(t-11))
        Function: @(x1,x2,x3)sin(x1.*x2+x3)
       Arguments: {'y1'  'u1'  'u1'}
          Delays: [1 10 11]
      Vectorized: 1
    TimeVariable: 't'

Два созданных пользовательских регрессора могут использоваться в модели IDNLARX.

m4 = nlarx(ze, [4 2 10], 'lin', 'customreg',  [r1;r2]);
getreg(m4)
Regressors:
    y1(t-1)
    y1(t-2)
    y1(t-3)
    y1(t-4)
    u1(t-10)
    u1(t-11)
    cos(u1(t-10))
    sin(y1(t-1).*u1(t-10)+u1(t-11))

Используя пользовательские регрессоры со средствами оценки нелинейности

Обычно средство оценки LINEAR используется с пользовательскими регрессорами, как в предыдущих примерах. Также возможно применить средства оценки нелинейности.

m5 = nlarx(ze, [4 2 10], 'wavenet', 'customreg',  [r1;r2]);
getreg(m5)
Regressors:
    y1(t-1)
    y1(t-2)
    y1(t-3)
    y1(t-4)
    u1(t-10)
    u1(t-11)
    cos(u1(t-10))
    sin(y1(t-1).*u1(t-10)+u1(t-11))

Поскольку пользовательские регрессоры обычно нелинейны, существует таким образом сокращение нелинейности, когда средство оценки нелинейности применяется к пользовательским регрессорам. Чтобы избежать такого сокращения, пользовательские регрессоры могут быть исключены из нелинейного блока модели IDNLARX путем указывания, что только стандартные регрессоры нелинейны.

m6 = nlarx(ze, [4 2 10], 'wavenet', 'customreg',  [r1;r2], 'nlreg', 'standard');
m6.nlreg % Indices of nonlinear regressors in the following list.
ans = 1×6

     1     2     3     4     5     6

getreg(m6)
Regressors:
    y1(t-1)
    y1(t-2)
    y1(t-3)
    y1(t-4)
    u1(t-10)
    u1(t-11)
    cos(u1(t-10))
    sin(y1(t-1).*u1(t-10)+u1(t-11))

Различные модели могут быть сравнены вместе (может занять много времени).

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

Пример MIMO: моделирование моторизованной камеры

Файл motorizedcamera.mat содержит один набор данных с 188 выборками данных, собранными из моторизованной камеры на частоте дискретизации 0,02 секунд. Входной вектор u (t) состоит из 6 переменных: 3 скоростных компонента перевода в ортогональной системе координат X-Y-Z, зафиксированной к камере [m/s] и 3 скоростным компонентам вращения вокруг X-Y-Z [rad/s]. Выходной вектор y (t) содержит 2 переменные: положение (в пикселе) точки, которая является изображением, взятым камерой фиксированной точки на 3D пробеле. Мы создаем объект IDDATA z, чтобы содержать загруженные данные:

load motorizedcamera
z = iddata(y, u, 0.02, 'Name', 'Motorized Camera', 'TimeUnit', 's');

Используя пользовательские регрессоры в MIMO случай не очень отличается от случая SISO. Это по существу должно знать, что каждый выход имеет свои собственные регрессоры. Пользовательские регрессоры всех выходных параметров упаковываются в массив ячеек прежде чем быть вставленным в модель MIMO IDNLARX.

Когда форма вектора символов используется, пользовательские регрессоры даны как ny-1 массив ячеек массивов ячеек из символьных векторов, ny, являющийся количеством выходных параметров модели.

nanbnk = [ones(2,2), 2*ones(2,6), ones(2,6)];
m11 = nlarx(z, nanbnk, 'lin', 'customreg', ...
      {{'u1(t-1)^2', 'y2(t-1)^3'};{'u5(t-1)*u6(t-1)'}});

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

F1 = @(x)x.^2;
r1 = customreg(F1, 'u1', 1, true);
F2 = @(x)x.^3;
r2 = customreg(F2, 'y2', 1, true);
F3 = @(x1,x2)x1.*x2;
r3 = customreg(F3, {'u5','u6'}, [1 1], true);

m12 = nlarx(z, nanbnk, 'lin', 'customreg', {[r1; r2], r3});

Числовая эквивалентность этих двух моделей может проверяться путем сравнения их с данными.

compare(z,m11,m12)

Для просмотра документации необходимо авторизоваться на сайте