В этом примере показано, как использовать полиномиальные и пользовательские регрессоры в моделях нелинейных ARX (IDNLARX).
В модели IDNLARX каждый выход является функцией регрессоров, которые являются преобразованиями прошлых входов и прошлых выходов. Типичные регрессоры являются просто запаздывающими входными или выходными переменными, представленными объектом спецификации linearRegressor, или полиномами запаздывающих переменных, представленными объектом полинома Regessor. Однако, кроме возможности навязывать абсолютное значение (например, abs (y (t-1))), нельзя создавать сложные математические формулы с использованием этих типов регрессоров. Например, если для функции вывода требуется регрессор вида sin (u (t-3)). * exp (-abs (u (t))), необходимо ввести пользовательскую формулу в выражении для регрессора. Этому способствуют объекты customRegressor. Как следует из названия, объект customRegressor используется для включения произвольных пользовательских формул в качестве регрессоров для нелинейной модели ARX.
Рассмотрим пример электрической системы с напряжением V и током I в качестве входных сигналов. Если известно, что электрическая мощность является важной величиной системы, то имеет смысл сформировать пользовательский регрессор V * I. Может быть более эффективным использовать надлежащим образом определенные пользовательские регрессоры, чем использовать только линейные и полиномиальные регрессоры.
Файл icEngine.mat содержит один набор данных с 1500 входно-выходными выборками, собранными с частотой выборки 0,04 секунды. Входной сигнал u (t) представляет собой напряжение [V], управляющее перепускным воздушным клапаном холостого хода (BPAV), а выходной сигнал y (t) представляет собой частоту вращения двигателя [об/мин/100]. Данные загружаются и разделяются на набор данных ze для оценки модели и другой набор данных zv для проверки модели.
load icEngine z = iddata(y,u,0.04); ze = z(1:1000); zv = z(1001:1500); plot(ze,zv) legend('Estimation data','Validation data')

Матрица порядка [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). Выберите линейную выходную функцию, чтобы выходные данные модели были только взвешенной суммой из шести регрессоров плюс смещение.

sys0 = nlarx(ze, [4 2 10], linear);
Имя ввода, имя вывода и список регрессоров этой модели отображаются ниже. Обратите внимание, что используются имена по умолчанию «u1», «y1».
sys0.InputName
ans = 1×1 cell array
{'u1'}
sys0.OutputName
ans = 1×1 cell array
{'y1'}
disp(getreg(sys0))
{'y1(t-1)' }
{'y1(t-2)' }
{'y1(t-3)' }
{'y1(t-4)' }
{'u1(t-10)'}
{'u1(t-11)'}
Это линейные регрессоры. Они хранятся в свойстве модели Regressors как объект linearRegressor.
sys0.Regressors
ans =
Linear regressors in variables y1, u1
Variables: {'y1' 'u1'}
Lags: {[1 2 3 4] [10 11]}
UseAbsolute: [0 0]
TimeVariable: 't'
Regressors described by this set
Свойство «Regressors» хранит информацию о регрессоре неявно, используя объект спецификации регрессии. Матрицу порядка [4 2 10] можно рассматривать как способ быстрого указания линейных регрессоров, где задержки являются смежными, а минимальное отставание выходной переменной фиксируется как 1.
Более гибким способом, который позволяет выбирать переменные с произвольными лагами, является использование объекта linearRegressor. В приведенной выше конфигурации переменная y1 имеет задержки [1 2 3 4], в то время как переменная u1 имеет задержки [10 11]. Используя объект linearRegressor, можно получить такую же конфигурацию следующим образом:
LinReg = linearRegressor({'y1','u1'}, {1:4, [10, 11]});
sys1 = nlarx(ze, LinReg, linear)sys1 = Nonlinear ARX model with 1 output and 1 input Inputs: u1 Outputs: y1 Regressors: Linear regressors in variables y1, u1 List of all regressors Model output is linear in regressors. Sample time: 0.04 seconds Status: Estimated using NLARX on time domain data "ze". Fit to estimation data: 94.35% (prediction focus) FPE: 0.001877, MSE: 0.00183
Сравнение синтаксиса оценки моделей sys1 и sys0; при создании sys1 матрица порядка заменена объектом спецификации линейного регрессора. Результирующие модели sys0 и sys1 идентичны.
[getpvec(sys0), getpvec(sys1)] % estimated parameter vectors of sys0 and sys1ans = 7×2
0.7528 0.7528
0.0527 0.0527
-0.0621 -0.0621
-0.0425 -0.0425
-0.0165 -0.0165
-0.0289 -0.0289
0.2723 0.2723
Объект linearRegressor используется для определения регрессоров вместо матрицы заказов в следующих сценариях:
вы хотите использовать произвольные (несмежные) задержки в переменных, таких как набор (t-11)}
вы хотите, чтобы минимальное отставание в выходных переменных отличалось от 1, например, набор ),...}
необходимо использовать абсолютные значения переменных, например, в наборе ), u (t-2)}, где используется только абсолютное значение переменной 'y1'. Этого можно добиться, сделав
LinRegWithAbs = linearRegressor({'y1','u1'},{[1 10], [0 2]},[true, false])LinRegWithAbs =
Linear regressors in variables y1, u1
Variables: {'y1' 'u1'}
Lags: {[1 10] [0 2]}
UseAbsolute: [1 0]
TimeVariable: 't'
Regressors described by this set
Часто требуются регрессоры, которые являются полиномами переменных с задержкой ввода-вывода. Их можно добавить в модель с помощью объекта polynomiveRegressor. Предположим, что необходимо добавить в модель u1 (t-10) 2, y1 (t-1) 2 в качестве регрессоров. Сначала создается объект спецификации с этими настройками, а затем этот объект добавляется в модель.
% Create order 2 regressors in variables 'u1' and 'y1', with lags 10 and 1 % respectively PolyReg = polynomialRegressor({'u1','y1'},{10, 1},2); % Use LinReg and PolyReg in the model sys2 = nlarx(ze, [LinReg; PolyReg], linear)
sys2 = Nonlinear ARX model with 1 output and 1 input Inputs: u1 Outputs: y1 Regressors: 1. Linear regressors in variables y1, u1 2. Order 2 regressors in variables u1, y1 List of all regressors Model output is linear in regressors. Sample time: 0.04 seconds Status: Estimated using NLARX on time domain data "ze". Fit to estimation data: 94.47% (prediction focus) FPE: 0.001804, MSE: 0.001752
В то время как линейные и полиномиальные регрессоры используются чаще всего, иногда нужно использовать другую формулу, которая не описывается многочленом. Примером являются тригнометрические функции, такие как (),... Другим примером является насыщения
В следующем примере регрессор создается как косинусная функция переменной с именем «u1» и отложенными 10 выборками, другими словами: t-10)). Логическое значение в последнем входном аргументе указывает, является ли пользовательский регрессор векторизированным или нет. Векторизированные регрессоры быстрее в вычислениях, но требуют осторожности в функции, указанной в первом входном аргументе.
x = customRegressor('u1', 10, @cos)x =
Custom regressor: cos(u1(t-10))
VariablesToRegressorFcn: @cos
Variables: {'u1'}
Lags: {[10]}
Vectorized: 1
TimeVariable: 't'
Regressors described by this set
Указанная формула (@ cos здесь) сохраняется в VariablesToRegressorFcn свойство объекта-регрессора. По умолчанию оценка функции предполагается векторизованной, то есть если входным является матрица с N строками, то выходной сигнал функции x.VariablesToRegressorFcn векторизация помогает ускорить оценку регрессора во время процесса оценки модели и моделирования. Однако при необходимости можно отключить его, задав значение Vectorized свойству FALSE.
Можно создать массив регрессоров, совместно использующих одну и ту же базовую формулу, но используя различные значения запаздывания. Например, предположим, что формула x (t-b) |, где «u» и «y» являются двумя переменными, для которых доступны измеренные данные, и задержки (a, b) могут принимать несколько значений в диапазоне 1:10. Можно создать массив этих регрессоров одним вызовомcustomRegressor конструктор
C = customRegressor({'u','y'},{1:10, 1:10}, @(x,y)x.*abs(y))C =
Custom regressor: @(x,y)x.*abs(y)
VariablesToRegressorFcn: @(x,y)x.*abs(y)
Variables: {'u' 'y'}
Lags: {[1 2 3 4 5 6 7 8 9 10] [1 2 3 4 5 6 7 8 9 10]}
Vectorized: 1
TimeVariable: 't'
Regressors described by this set
C представляет набор из 100 регрессоров, генерируемых с использованием формулы t-b)) для всех a и bvalues в диапазоне 1:10.
Предположим, что метод проб/ошибок или физическое понимание предполагает, что нам нужно использовать набор регрессоров (y1 (t-4))} в модели. У нас есть смесь линейных, полиномиальных и тригонометрических формул. Мы действуем следующим образом:
LinReg = linearRegressor('y1',1); PolyReg = polynomialRegressor('u1',[10 11],3); CustomReg = customRegressor('y1',4,@(x)sin(x)); % for now no nonlinearity; output is a linear function of regressors sys3 = nlarx(ze,[LinReg; PolyReg; CustomReg], [])
sys3 = Nonlinear ARX model with 1 output and 1 input Inputs: u1 Outputs: y1 Regressors: 1. Linear regressors in variables y1 2. Order 3 regressors in variables u1 3. Custom regressor: sin(y1(t-4)) List of all regressors Model output is linear in regressors. Sample time: 0.04 seconds Status: Estimated using NLARX on time domain data "ze". Fit to estimation data: 92.11% (prediction focus) FPE: 0.003647, MSE: 0.00357
getreg(sys3)
ans = 4×1 cell
{'y1(t-1)' }
{'u1(t-10)^3' }
{'u1(t-11)^3' }
{'sin(y1(t-4))'}
Мы можем расширить этот рабочий процесс, чтобы включить в модель функции нелинейного отображения, такие как Sigmoid Network, а также назначить только подмножество набора регрессоров, которое будет использоваться в качестве входных данных для его линейных и нелинейных компонентов (примечание: сеть Сигмоида - это сумма 3 компонент - линейная функция, член смещения и нелинейная функция, представляющая собой сумму сигмоидных единиц). В следующем примере мы используем рабочий процесс на основе шаблонной модели, в котором мы серповидно готовим шаблонную модель IDNLARX и набор опций оценки перед использованием их в команде NLARX для оценки параметров.
sys4 = idnlarx(ze.OutputName, ze.InputName, [4 2 10], sigmoidnet); % generate 'u1(t-10)^2', 'y1(t-1)^2', 'u1(t-10)*y1(t-1)' P = polynomialRegressor({'y1','u1'},{1, 10},2, false, true); % generate cos(u1(t-10)) C1 = customRegressor('u1',10,@cos); % generate sin(y1(t-1).*u1(t-10)+u1(t-11)) C2 = customRegressor({'y1','u1','u1'},{1, 10, 11},@(x,y,z)sin(x.*y+z)); % add the polynomial and custom regressors to the model sys2 sys4.Regressors = [sys4.Regressors; P; C1; C2]; % view the regressors and how they are used in the model disp(sys4.RegressorUsage)
y1:LinearFcn y1:NonlinearFcn
____________ _______________
y1(t-1) true true
y1(t-2) true true
y1(t-3) true true
y1(t-4) true true
u1(t-10) true true
u1(t-11) true true
y1(t-1)^2 true true
u1(t-10)^2 true true
cos(u1(t-10)) true true
sin(y1(t-1).*u1(t-10)+u1(t-11)) true true
% designate only the linear regressors to be used in the nonlinear % component of the sigmoid network Usage = sys4.RegressorUsage; Usage{7:end,2} = false; sys4.RegressorUsage = Usage; disp(sys4.RegressorUsage)
y1:LinearFcn y1:NonlinearFcn
____________ _______________
y1(t-1) true true
y1(t-2) true true
y1(t-3) true true
y1(t-4) true true
u1(t-10) true true
u1(t-11) true true
y1(t-1)^2 true false
u1(t-10)^2 true false
cos(u1(t-10)) true false
sin(y1(t-1).*u1(t-10)+u1(t-11)) true false
% Prepapre estimation options: use Levenberg-Marquardt solver with 30 maximum iterations. % Turn progress display on and set estimation focus to 'simulation' opt = nlarxOptions; opt.Focus = 'simulation'; opt.Display = 'on'; opt.SearchMethod = 'lm'; opt.SearchOptions.MaxIterations = 30; % estimate parameters of sys4 to fit data ze sys4 = nlarx(ze, sys4, opt)
sys4 = Nonlinear ARX model with 1 output and 1 input Inputs: u1 Outputs: y1 Regressors: 1. Linear regressors in variables y1, u1 2. Order 2 regressors in variables y1, u1 3. Custom regressor: cos(u1(t-10)) 4. Custom regressor: sin(y1(t-1).*u1(t-10)+u1(t-11)) List of all regressors Output function: Sigmoid Network with 10 units Sample time: 0.04 seconds Status: Estimated using NLARX on time domain data "ze". Fit to estimation data: 87.81% (simulation focus) FPE: 0.001491, MSE: 0.008517
Теперь мы можем проверить модели, сравнивая их ответы с выводом набора данных validata zv.
compare(zv, sys1, sys2, sys3, sys4)

Графики сравнения указывают sys2 как лучшая модель. Следует отметить, что регрессоры, используемые в этом примере, выбирались произвольно, в основном для того, чтобы показать различный способ создания регрессоров и оценки моделей. Лучшие результаты можно получить, выбирая регрессоры более разумно.
Файл motorizedcamera.mat содержит один набор данных со 188 выборками данных, собранными с моторной камеры с частотой дискретизации 0,02 секунды. Входной вектор u (t) состоит из 6 переменных: 3 компоненты скорости перемещения в ортогональной системе координат X-Y-Z, прикрепленной к камере [м/с], и 3 компоненты скорости вращения вокруг оси X-Y-Z [рад/с]. Выходной вектор y (t) содержит 2 переменные: положение (в пикселях) точки, которая является изображением, снятым камерой фиксированной точки в 3D пространстве. Создается объект IDDATA z для хранения загруженных данных:
load motorizedcamera z = iddata(y, u, 0.02, 'Name', 'Motorized Camera', 'TimeUnit', 's'); plot(z)

Использование различных типов регрессоров в случае MIMO не сильно отличается от случая SISO. Все регрессоры используются в динамике для всех выходов системы. RegressorUsage свойство может использоваться для назначения определенных регрессоров, используемых для конкретных выходов.
nanbnk = [ones(2,2), 2*ones(2,6), ones(2,6)];
sysMIMO = idnlarx(z.OutputName, z.InputName, nanbnk, linear);
C = customRegressor({'u5','u6'},{1 1},@(x,y)x.*y);
P1 = polynomialRegressor('u1',1,2);
P2 = polynomialRegressor('y2',1,3);
sysMIMO.Regressors = [sysMIMO.Regressors; C; P1; P2];
getreg(sysMIMO)ans = 17×1 cell
{'y1(t-1)' }
{'y2(t-1)' }
{'u1(t-1)' }
{'u1(t-2)' }
{'u2(t-1)' }
{'u2(t-2)' }
{'u3(t-1)' }
{'u3(t-2)' }
{'u4(t-1)' }
{'u4(t-2)' }
{'u5(t-1)' }
{'u5(t-2)' }
{'u6(t-1)' }
{'u6(t-2)' }
{'u1(t-1)^2' }
{'y2(t-1)^3' }
{'u5(t-1).*u6(t-1)'}
sysMIMO = nlarx(z, sysMIMO)
sysMIMO = Nonlinear ARX model with 2 outputs and 6 inputs Inputs: u1, u2, u3, u4, u5, u6 Outputs: y1, y2 Regressors: 1. Linear regressors in variables y1, y2, u1, u2, u3, u4, u5, u6 2. Order 2 regressors in variables u1 3. Order 3 regressors in variables y2 4. Custom regressor: u5(t-1).*u6(t-1) List of all regressors All model outputs are linear in their regressors. Sample time: 0.02 seconds Status: Estimated using NLARX on time domain data "Motorized Camera". Fit to estimation data: [99.05;98.85]% (prediction focus) FPE: 0.2067, MSE: 0.7496
Сравнение реакции модели с данными оценки.
compare(z,sysMIMO)

Анализ остатков модели на предмет их автокорреляции (тест белизны) и взаимной корреляции с входным сигналом (тест корреляции)
fig = figure;
fig.Position(3) = 2*fig.Position(3);
resid(z,sysMIMO)