В этом примере показано, как использовать пользовательские регрессоры в нелинейных моделях ARX (IDNLARX), включая системы одного входа одного выхода (SISO) и много входа много выхода (MIMO).
В модели IDNLARX каждый выход является функцией регрессоров, которые являются преобразованиями прошлых входных параметров и мимо выходных параметров. Типичные регрессоры являются просто задержанными переменными ввода или вывода. Они упоминаются как STANDARD REGRESSORS. Также возможно использовать более усовершенствованные регрессоры в форме произвольных пользовательских функций задержанных переменных ввода и вывода. Такие регрессоры упоминаются как ПОЛЬЗОВАТЕЛЬСКИЕ REGRESSORS.
Рассмотрите пример электрической системы и с напряжением V и с током я как входные параметры. Если известно, что электроэнергия является важным количеством системы, то это целесообразно формировать пользовательский регрессор V*I. Может быть более эффективно использовать соответственно заданные пользовательские регрессоры, чем использовать стандартные регрессоры только.
Файл 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 регрессора более мощен для создания произвольных регрессоров.
В следующем примере регрессор создается как, потому что функция переменной, названной '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)
Файл 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)