主要内容

用非线性和自定义回归器建立非线性ARX模型

这个例子展示了如何在非线性ARX (IDNLARX)模型中使用多项式和自定义回归量。

简介

在IDNLARX模型中,每个输出都是回归函数,回归函数是过去输入和过去输出的转换。类型表示的延迟输入或输出变量是典型的回归函数linearRegressor的延迟变量的多项式表示polynomialRegressor对象。然而,除了施加绝对值的能力(例如,abs (y (t - 1))),您不能使用这些类型的回归器创建复杂的数学公式。例如,如果输出函数需要这种形式的回归函数罪(u(条t - 3)) * exp (abs (u (t))),您需要一种方法在回归函数的表达式中输入您的自定义公式。这是由customRegressor对象。顾名思义,您可以使用customRegressor对象将任意的自定义公式作为非线性ARX模型的回归器。

考虑一个电力系统的例子,有两个电压V而电流作为输入。如果已知电力是系统的一个重要量,那么形成自定义回归函数是有意义的V *我.使用适当定义的自定义回归器可能比只使用线性和多项式回归器更有效。

例子:内燃机建模

文件icEngine。米一个tcont一个我n年代oned一个ta set with 1500 input-output samples collected at the a sampling rate of 0.04 seconds. The input u(t) is the voltage [V] controlling a By-Pass Idle Air Valve (BPAV), and the output y(t) is the engine speed [RPM/100]. The data is loaded and split into a dataset用于模型估计和另一个数据集zv用于模型验证。

负载icEngineZ = iddata(y,u,0.04);Ze = z(1:1000);Zv = z(1001:1500);情节(泽,zv)传说(“估计数据”验证数据的

线性回归函数为ARX阶

阶矩阵[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], idLinear);

该模型的输入名称、输出名称和回归器列表如下所示。注意,这里使用了默认名称‘u1’,‘y1’。

sys0。我nputName
ans =1×1单元格数组{' u1 '}
sys0。OutputName
ans =1×1单元格数组{“日元”}
disp (getreg (sys0))
{“y1 (t - 1)”}{‘y1 (2)} {y1(条t - 3)的}{y1(第四节)的}{的u1 (t-10)}{的u1 (t-11)}

这些都是线性解释变量。它们存储在模型中解释变量属性作为线性回归对象。

sys0。Regressors
ans =变量y1, u1中的线性回归变量:{'y1' 'u1'}滞后:{[1 2 3 4][10 11]}UseAbsolute: [0 0] TimeVariable: 't'由这个集合描述的回归变量

“Regressors”属性使用回归规范对象隐式地存储回归器上的信息。您可以将顺序矩阵[4 2 10]视为指定线性回归器的一种快捷方式,其中滞后是连续的,并且输出变量中的最小滞后固定为1。

线性回归器使用线性回归器规范对象

允许选择具有任意延迟的变量的更灵活的方法是使用linearRegressor对象。在上述配置中,变量y1有滞后[1 2 3 4],而变量u1有滞后[10 11]。使用线性回归对象,同样的配置可以实现如下:

LinReg =线性回归({“日元”‘u1’}, {1:4, [10,11]});sys1 = nlarx(ze, LinReg, idLinear)
sys1 = 1输出1输入的非线性ARX模型输入:u1输出:y1回归:变量y1中的线性回归,u1所有回归的列表输出函数:无采样时间:0.04秒状态:在时域数据“ze”上使用NLARX估计。与估计数据拟合:94.35%(预测焦点)FPE: 0.001877, MSE: 0.00183

比较模型的估计语法sys1而且sys0;当创建sys1您用线性回归规范对象替换了顺序矩阵。得到的模型sys0而且sys1都是相同的。

[getpvec (sys0), getpvec (sys1)]%估计sys0和sys1的参数向量
ans =7×20.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对象来指定回归量来代替顺序矩阵:

  • 您希望在诸如set之类的变量中使用任意(非连续)延迟 y 1 t - 1 y 1 t - 1 0 u t - 3. u t - 1 1

  • 例如,您希望输出变量中的最小延迟不小于1 y 1 t - 4 y 1 t - 5

  • 你想要使用变量的绝对值,比如在集合中 | 日元 t - 1 | | 日元 t - 10 | u t u t - 2 这里只使用变量“y1”的绝对值。这可以通过做来实现

LinRegWithAbs =线性回归({“日元”‘u1’},{[1 10], [0 2]},[true, false])
LinRegWithAbs =变量y1, u1中的线性回归变量变量:{'y1' 'u1'}滞后:{[1 10][0 2]}UseAbsolute: [1 0] TimeVariable: 't'由这个集合描述的回归变量

多项式解释变量

通常需要回归函数作为延迟I/O变量的多项式。属性可以将这些属性添加到模型中polynomialRegressor对象。假设你想加 u 1 t - 1 0 2 y 1 t - 1 2 作为模型的回归量。首先使用这些设置创建一个规范对象,然后将该对象添加到模型中。

在变量“u1”和“y1”中创建2阶回归量,滞后10和1%分别PolyReg =多项式回归({‘u1’“日元”1}},{10日,2);在模型中使用LinReg和PolyRegsys2 = nlarx(ze, [LinReg;PolyReg], idLinear)
sys2 =非线性ARX模型,1输出1输入输入:u1输出:y1回归量:1。变量y1 u1 2中的线性回归。变量u1, y1中的二阶回归量所有回归量列表输出函数:无采样时间:0.04秒状态:在时域数据“ze”上使用NLARX估计。拟合估计数据:94.47%(预测焦点)FPE: 0.001804, MSE: 0.001752

基于自定义公式的回归器

虽然线性回归器和多项式回归器是最常用的,但有时您需要使用不是由多项式描述的不同公式。一个例子是三角函数 年代 n c o 年代 ... 另一个例子是饱和函数 x 一个 x l o w e r B o u n d n x U p p e r B o u n d .在这些情况下,您可以使用customRegressor对象数组来封装特定的数学表达式。

在下面的例子中,回归函数被创建为名为“u1”的变量的余弦函数,并延迟了10个样本,换句话说: x c o 年代 u 1 t - 1 0 .最后一个输入参数处的逻辑值指示自定义回归函数是否向量化。向量化回归器在计算中更快,但需要注意在第一个输入参数处指示的函数。

x = customRegressor(‘u1’, 10, @cos)
x = Custom regressor: cos(u1(t-10)) VariablesToRegressorFcn: @cos Variables: {'u1'}滞后:{[10]}Vectorized: 1 TimeVariable: 't'由这个集合描述的回归

指定的公式(这里是@cos)存储在VariablesToRegressorFcn回归器对象的属性。默认情况下,函数的求值假设是向量化的,也就是说,如果输入是一个N行的矩阵,则函数的输出x.VariablesToRegressorFcn为长度为n的列向量,矢量化有助于在模型估计和模拟过程中加快对回归量的评估。属性的值,可以选择禁用该属性矢量化属性为FALSE。

您可以创建一个回归器数组,这些回归器都共享相同的基础公式,但使用不同的滞后值。例如,假设公式是 x u t - 一个 | y t - b | ,其中“u”和“y”是两个可获得测量数据的变量,滞后(a,b)可以在1:10的范围内取多个值。方法可以创建这些回归器的数组customRegressor构造函数

C = customRegressor({“u”“y”},{1:10, 1:10}, @(x,y)x.*abs(y))
C =自定义回归:@(x,y)x.*abs(y) VariablesToRegressorFcn: @(x,y)x.*abs(y)变量:{'u' 'y'}滞后:{[1 2 3 4 5 6 7 8 9 10][1 2 3 4 5 6 7 8 9 10]}Vectorized: 1 TimeVariable: 't'此集合描述的回归

C表示用公式生成的100个回归量的集合 u t - 一个 一个 b 年代 y t - b 对于所有的组合 一个 而且 b 取值范围为1:10。

在IC发动机动力学模型中使用所有三种类型的回归器

假设试错或物理洞察力表明我们需要使用回归集 R u 1 t - 1 0 3. u 1 t - 1 1 3. y 1 t - 1 年代 n y 1 t - 4 在模型中。我们混合了线性,多项式和三角公式。我们进行如下:

LinReg =线性回归(“日元”1);PolyReg =多项式回归(‘u1’11 [10], 3);CustomReg = customRegressor(“日元”4 @ (x) sin (x));%暂无非线性;输出是回归函数的线性函数sys3 = nlarx(ze,[LinReg;PolyReg;CustomReg], [])
sys3 =非线性ARX模型,1输出1输入输入:u1输出:y1回归量:1。变量y12中的线性回归函数。变量u1 3中的3阶回归量。自定义回归函数:sin(y1(t-4))所有回归函数的列表输出函数:无采样时间:0.04秒状态:使用NLARX对时域数据“ze”进行估计。与估计数据拟合:92.11%(预测焦点)FPE: 0.003647, MSE: 0.00357
getreg (sys3)
ans =4×1细胞{“y1 (t - 1)”}{的u1 (t-10) ^ 3}{的u1 (t-11) ^ 3}{的罪(y1(第四节))}

我们可以扩展这个工作流程,以包括非线性映射函数,例如模型中的Sigmoid网络,并仅指定回归集的一个子集用作其线性和非线性组件的输入(注意:Sigmoid网络是3个组件的和——线性函数、偏置项和是Sigmoid单元的和的非线性函数)。在下面的例子中,我们使用基于模板模型的工作流,其中我们在NLARX命令中使用它们进行参数估计之前,分别准备一个模板IDNLARX模型和估计选项集。

Sys4 = idnlarx(ze。OutputName,泽。InputName,[4 2 10], idSigmoidNetwork);%生成“u1 (t-10) ^ 2”,“y1 (t - 1) ^ 2”,“u1 (t-10) * y1 (t - 1)”P =多项式回归({“日元”‘u1’},{1,10},2, false, true);%生成cos(u1(t-10))C1 = customRegressor(‘u1’10 @cos);生成sin(y1(t-1).*u1(t-10)+u1(t-11))C2 = customRegressor({“日元”‘u1’‘u1’},{1,10,11},@(x,y,z)sin(x.*y+z));将多项式和自定义回归量添加到模型sys2中sys4。Regressors = [sys4.Regressors; P; C1; C2];查看回归量以及它们在模型中的使用方式disp (sys4.RegressorUsage)
y1:线性fcn y1:非线性fcn ____________ _______________ y1(t-1)真真y1(t-2)真真y1(t-3)真真y1(t-4)真真u1(t-10)真真u1(t-1)^2真真u1(t-10)^2真真cos(u1(t-10))真真sin(y1(t-1).*u1(t-10)+u1(t-11))真真真
%仅指定线性回归量用于非线性sigmoid网络的%分量Usage = sys4.RegressorUsage;用法{7:end,2} = false;sys4。RegressorUsage = Usage; disp(sys4.RegressorUsage)
y1:线性fcn y1:非线性fcn ____________ _______________ y1(t-1)真真y1(t-2)真真y1(t-3)真真y1(t-4)真真u1(t-10)真真y (t-1)^2真假u1(t-10)^2真假cos(u1(t-10))真假sin(y1(t-1).*u1(t-10)+u1(t-11))真假
准备估计选项:使用最大迭代30次的Levenberg-Marquardt求解器。%打开进度显示,并将估计焦点设置为“模拟”opt = nlarxOptions;opt.Focus =“模拟”;opt.Display =“上”;opt.SearchMethod =“lm”;opt.SearchOptions.MaxIterations = 30;%估计sys4的参数来拟合数据zeSys4 = nlarx(ze, Sys4, opt)
sys4 =非线性ARX模型,1输出1输入输入:u1输出:y1回归量:1。变量y1 u1 2中的线性回归。变量y1 u1 3中的二阶回归量。自定义回归函数:cos(u1(t-10)) 4。自定义回归器:sin(y1(t-1).*u1(t-10)+u1(t-11))所有回归器列表输出函数:10单位Sigmoid网络采样时间:0.04秒状态:在时域数据“ze”上使用NLARX估计。拟合估计数据:87.81%(模拟焦点)FPE: 0.001491, MSE: 0.008517

我们现在可以通过将模型的响应与validata数据集的输出进行比较来验证模型zv

比较(zv, sys1, sys2, sys3, sys4)

对比图表明sys2作为最好的模范。注意,本例中使用的回归量是任意选择的,主要是为了展示创建回归量和估计模型的不同方式。更明智地选择回归量可以获得更好的结果。

MIMO示例:建模一个机动相机

该文件motorizedcamera.mat包含一个包含188个数据样本的数据集,以0.02秒的采样率从电动摄像机采集。输入向量u(t)由6个变量组成:固定在相机上的X-Y-Z正交坐标系中的3个平移速度分量[m/s],以及围绕X-Y-Z轴的3个旋转速度分量[rad/s]。输出向量y(t)包含两个变量:一个点的位置(像素),这个点是相机在3D空间中一个固定点拍摄的图像。我们创建一个IDDATA对象z来保存加载的数据:

负载motorizedcameraZ = iddata(y, u, 0.02,“名字”“机动相机”“TimeUnit”“年代”);情节(z)

在MIMO情况下使用不同类型的回归器与SISO情况没有太大不同。所有的回归量都用于系统的所有输出的动态。的RegressorUsage属性可用于指定用于特定输出的特定回归器。

Nanbnk = [ones(2,2), 2*ones(2,6), ones(2,6)];sysMIMO = idnlarx(z。OutputName,z.InputName, nanbnk, idLinear); C = customRegressor({“u5”“u6”}, {1}, @ x (x, y)。* y);P1 =多项式回归(‘u1’、1、2);P2 =多项式回归(“日元”, 1, 3);sysMIMO。Regressors = [sysMIMO.Regressors; C; P1; P2]; getreg(sysMIMO)
ans =17×1细胞{y1 (t - 1)的}{y2 (t - 1)的}{u1 (t - 1)的}{的u1(2)}{“u2 (t - 1)”}{“u2(2)”}{u3 (t - 1)的}{‘u3 (2)} {u4 (t - 1)的}{‘u4 (2)} {u5 (t - 1)的}{‘u5 (2)} {u6 (t - 1)的}{‘u6 (2)} {u1 (t - 1) ^ 2的}{‘y2 (t - 1) ^ 3} {u5 (t - 1)。* u6 (t - 1)}
sysMIMO = nlarx(z, sysMIMO)
sysMIMO = 2输出6输入的非线性ARX模型输入:u1, u2, u3, u4, u5, u6输出:y1, y2回归量:1。线性回归变量y1 y2 u1 u2 u3 u4 u5 u6 2。变量u1 3中的二阶回归量。变量y2中的3阶回归量4。自定义回归器:u5(t-1).*u6(t-1)所有回归器列表输出功能:输出1:无输出2:无采样时间:0.02秒状态:使用NLARX对时域数据“机动相机”进行估计。拟合估计数据:[99.05;98.85]%(预测焦点)FPE: 0.2067, MSE: 0.7496

               

比较模型响应和估计数据。

比较(z, sysMIMO)


               

分析模型残差的自相关性(白度检验)和与输入信号的相互相关性(相关检验)

图;fig.Position(3) = 2*fig.Position(3);渣油(z, sysMIMO)