主要内容

识别非线性ARX和Hammerstein-Wiener模型的教程

这个例子展示了单输入单输出(SISO)非线性黑箱模型的识别使用测量的输入输出数据。该示例使用了一个双罐系统的测量数据来探索各种模型结构和识别选择。

输入输出数据集

在本例中,数据变量存储在twotankdata.mat文件将被使用。它包含了一个使用0.2秒采样时间生成的双槽系统的3000个输入输出数据样本。输入u(t)是施加在泵上的电压[V],它产生了流入上部油箱的流量。在这个上罐底部有一个相当小的洞,流出的水进入下罐,两个罐系统的输出y(t)就是下罐的液位[m]。我们创建一个IDDATA对象z封装加载的数据:

该数据集也用于非线性灰盒示例“双槽系统:时间连续SISO系统的C MEX-File建模”,其中假设了描述系统的物理方程。这个例子是关于黑箱模型的,因此没有假设实际物理定律的知识。

负载twotankdataZ = iddata(y, u, 0.2,“名字”“双罐系统”);

分割数据和绘图

将这个数据集分成3个大小相等的子集,每个子集包含1000个样本。

我们将用z1,并对其进行评估z2而且z3z1类似于z2,但不是z3.因此在某种意义上,z2将有助于我们评估模型的插值能力,而z3可以帮助我们评估他们的推断能力。

Z1 = z(1:1000);Z2 = z(1001:2000);Z3 = z(2001:3000);情节(z1、z2 z3)传说(“估计”“验证1”《验证2》)

回归量选择

估计非线性黑盒模型的第一步是选择回归集。回归器是基于时滞输入/输出变量的简单公式,最简单的情况是变量被一小组连续值滞后。例如,如果"u"是一个输入变量的名称,"y"是一个输出变量的名称,那么一个示例回归集可以是{y(t-1), y(t-2), u(t), u(t-1), u(t-2)},其中"t"表示时间变量。另一个涉及多项式项的例子是{abs(y(t-2)), y(t-2)*u(t-1), u(t-4)^2}。延迟变量中更复杂的任意公式也是可能的。

在系统标识工具箱™中,不需要显式地创建回归器集;大型集合可以通过指定它们的形式(如多项式顺序)、贡献变量及其滞后来隐式生成。规范的对象linearRegressorpolynomialRegressor而且customRegressor都用于此目的。例如R = linearRegressor ({' y ', ' u '},{[1 2 4],[2] 10})意味着回归量集{y y (t - 1), (2), y(第四节),u (2), u (t-10)}。类似地,R =多项式回归器({'y'},{[1 2]},3)表示变量'y'中滞后1和2的三阶多项式回归器,即集合{y(t-1)^3, y(t-2)^3}。还有更多的配置选择,比如只使用绝对值,和/或允许在回归公式中混合滞后。

使用顺序矩阵的线性回归函数说明

当模型只使用基于连续滞后的线性回归量时,使用顺序矩阵而不是使用linearRegressor对象。阶矩阵[na nb nk]定义了回归公式中使用的过去输出、过去输入和输入延迟的数量。这与估计线性ARX模型(参见ARX, IDPOLY)时使用的思想是相同的。例如,NN =[2 3 4]意味着输出变量使用滞后(1,2),输入变量使用滞后(4,5,6),导致回归集{y(t-1), y(t-2), u(t-4), u(t-5), u(t-6)}。

通常模型顺序是通过试错来选择的。有时,为了得到关于最佳订单的提示,首先尝试线性ARX模型是有用的。让我们先用函数来确定线性ARX模型的最优阶arxstruc而且selstruc

V = arxstruc(z1,z2,struc(1:5, 1:5,1:5));%根据赤池信息准则(AIC)选择最佳顺序nn = selstruc(V,“另类投资会议”)
Nn = 5 1 3

AIC准则选择nn = [na nb nk] =[5 1 3],这意味着在所选的ARX模型结构中,y(t)由6个回归量y(t-1),y(t-1),…,y(t-5)和u(t-3)预测。在估计非线性模型时,我们将尝试使用这些值。

非线性ARX (IDNLARX)模型

在IDNLARX模型中,模型输出是回归量的非线性函数,如y(t) = Fcn(y(t-1),y(t-1),…,y(t-5), u(t-3))。

IDNLARX模型通常使用以下语法进行估计:

M = NLARX(数据,订单,Fcn)。

它类似于线性ARX命令,附加参数“Fcn”指定非线性函数的类型。一个非线性ARX模型通过使用两个阶段的转换产生它的输出:将训练数据(输入输出信号)映射到一组回归器。从数值上讲,回归量集是一个双矩阵R,每个回归量都有一列数据。2.将回归函数映射到单个输出y = Fcn®,其中Fcn()是一个标量非线性函数。

为了估计一个IDNLARX模型,在选择了模型阶数之后,我们需要选择使用的非线性映射函数Fcn()的类型。让我们首先尝试一个小波网络(idWaveletNetwork)函数。

mw1 = nlarx(z1,[5 1 3], idWaveletNetwork);

小波网络使用组合小波单元将回归量映射到模型的输出。该模型mw1是@idnalrx对象。它将非线性映射函数(这里是idwaveetnetwork对象)存储在OutputFcn财产。使用这些单元的数量可以提前指定,或者我们可以让估计算法自动确定最优值。属性NonlinearFcn。NumberOfUnits存储模型中选择的单元数量。

NLFcn = mw1.OutputFcn;NLFcn.NonlinearFcn.NumberOfUnits
Ans = 3

通过比较模型的响应来检验结果mw1到数据集中的测量输出z1

比较(z1, mw1);

使用模型属性

第一个模型不太令人满意,因此让我们尝试修改模型的一些属性。可以显式指定这个数字,而不是让估计算法自动选择idWaveletNetwork函数中的单元数量。

mw2 = nlarx(z1,[5 1 3], idWaveletNetwork(8));

默认的InputName和OutputName已经被使用。

对象。InputName对象。OutputName
Ans = 1×1 cell array {'u1'} Ans = 1×1 cell array {'y1'}

IDNLARX模型的回归器可以使用GETREG命令查看。回归量由对象。InputName对象。OutputName还有时间延迟。

getreg(对象)
ans = 6×1单元阵列{y1 (t - 1)的}{‘y1 (2)} {y1(条t - 3)的}{y1(第四节)的}{‘y1 (t-5)} {u1(条t - 3)的}

注意,顺序矩阵等价于使用规范对象创建的线性回归集,如:

R =线性回归([z1.OutputName;z1。InputName] {1:5, 3});mw2_a = nlarx(z1, R, idWaveletNetwork(8));getreg (mw2_a)
ans = 6×1单元阵列{y1 (t - 1)的}{‘y1 (2)} {y1(条t - 3)的}{y1(第四节)的}{‘y1 (t-5)} {u1(条t - 3)的}

mw2_a本质上是相同的模型对象.使用规范对象允许更大的灵活性;当您不想使用连续延迟,或者输出变量的最小延迟大于1时,可以使用它。

给映射函数赋回归函数

IDNLARX模型的输出是其回归量的静态函数。通常这个映射函数有一个线性块,一个非线性块,外加一个偏置项(输出偏移量)。模型输出是这些块的输出和偏置的总和。为了降低模型的复杂性,只可以选择一个回归量子集进入非线性块和线性块。将回归量赋值给映射函数的线性和非线性组件是使用模型的RegressorUsage属性执行的。

RegUseTable = mw2。RegressorUsage
RegUseTable = 6×2 table y1:LinearFcn y1:NonlinearFcn ____________ _______________ y1(t-1) true true y1(t-2) true true y1(t-3) true true y1(t-4) true true y1(t-5) true true u1(t-3) true true

RegUseTable是一个表,它显示了哪些回归器被用作小波网络的线性和非线性组件的输入。每一行对应一个回归量。假设我们只想使用非线性分量中输入变量u1的函数回归量。该配置可以通过以下方式实现。

RegNames = RegUseTable.Properties.RowNames;I = contains(RegNames,‘u1’);RegUseTable。(“日元:NonlinearFcn”)(~I) = false;

作为一个例子,考虑一个模型,它使用2阶的多项式回归量,并使用线性回归量对象.首先,生成一个多项式回归函数规范集。

P =多项式回归器({“日元”‘u1’0:3}}, {1:2, 2)
P = Order 2 regressors in variables y1, u1 Order: 2 variables: {'y1' 'u1'} lag: {[1 2] [0 1 2 3]} UseAbsolute: [0 0] AllowVariableMix: 0 AllowLagMix: 0 TimeVariable: 't'

现在添加规范P模型的regressor属性。

Mw3 = mw2;%从mw2结构开始进行新的估计mw3。regresors = [mw3. regresors;P];%将多项式集添加到模型结构中

最后,对模型参数进行更新,使模型参数拟合数据,使提前1步预测误差最小化。

Mw3 = nlarx(z1, Mw3)
1输出1输入的非线性ARX模型输入:u1输出:y1回归量:1。变量y1 u1 2的线性回归量。变量y1, u1中的二阶回归量输出函数:8单位小波网络采样时间:0.2秒状态:使用时域数据NLARX估计“双槽系统”。与估计数据拟合:96.76%(预测焦点)FPE: 3.499e-05, MSE: 3.338e-05

评估估计模型

不同的模型,包括线性的和非线性的,可以在同一个COMPARE命令中一起比较。

Mlin = arx(z1,[5 1 3]);%线性ARX模型%对象,比较(z1, mlin mw3)

模型验证可以通过在验证数据集上运行COMPARE命令来进行。首先,通过检查它们的模拟响应与测量输出信号的匹配程度来验证模型z2

对象,比较(z2 mlin mw3)

类似地,根据数据集z3验证估计的模型。

对象,比较(z3 mlin mw3)

还可以对模型残差进行分析,以验证模型质量。我们期望残差是白色的(除了在滞后0处,与自身不相关),并且与输入信号不相关。残差是超前一步的预测误差。通过使用RESID命令,可以用不重要值的边界可视化残数。例如在验证数据集上z2,三个识别模型的残差如下所示。

对象,渣油(z2 mlin mw3)传奇显示

的残数都与输入信号不相关z2(z2.InputData)。然而,它们对模型表现出一些自相关性mlin而且mw3.该模型对象在两个(自动和相互相关)测试中都表现更好。

函数图(Function PLOT)可用于查看各种IDNLARX模型的非线性响应。该图本质上显示了非线性映射函数Fcn()的特征。

mw3情节(对象)%绘制非线性响应作为所选回归量的函数

具有Sigmoid网络的非线性ARX模型

模型中可以使用其他非线性函数来代替小波网络。尝试idSigmoidNetwork函数,它使用sigmoid单位的和(加上一个线性项和一个偏移项)将回归函数映射到输出。将网络配置为使用8个单位的sigmoid(按不同的数量展开和转换)。

ms1 = nlarx(z1,[5 1 3], idSigmoidNetwork(8));比较(z1, ms1)

现在在数据集z2上评估新模型。

比较(z2, ms1);

在数据集z3上。

比较(ms1 z3);

IDNLARX模型中的其他非线性映射函数

idCustomNetwork类似于idSigmoidNetwork,但用户可以在MATLAB文件中定义自己的单位函数,而不是sigmoid单位函数。这个例子使用了gaussunit函数。

类型gaussunit.m
函数(f, g) = gaussunit (x) % gaussunit单位函数用于idCustomNetwork(例子)% % (f, g) = gaussunit (x) % % x:单位函数变量% f:单位函数值% g: df / dx %:单位活跃的范围(g (x)显著不为零的区间[-])% %单位函数必须“矢量”:对于一个向量或矩阵x,输出% f和g参数必须具有相同的大小x,计算中的元素。版权所有The MathWorks, Inc. %作者(s):张清华f = exp(-x.*x);如果nargout>1 g = - 2*x .* f;A = 0.2;结束

对于基于定制网的模型,只使用第三、第五和第六个回归量作为定制网函数非线性分量的输入。

Mc1_ini = idnlarx(“日元”‘u1’, [5 1 3], idCustomNetwork(@gaussunit));使用= false(6,1);Use([3 5 6]) = true;mc1_ini。RegressorUsage{:,2} =使用;MC1 = nlarx(z1,mc1_ini);

树配分函数是非线性ARX模型中可以使用的另一个映射函数。使用idTreePartition函数估计一个模型:

mt1 = nlarx(z1, [5 1 3], idTreePartition);

比较模型的响应而且mt1数据z1

比较(z1, MC1, mt1)

使用统计和机器学习工具箱中的回归算法

如果您可以访问统计和机器学习工具箱™,您还可以使用高斯过程(GP)函数和袋装或增强树集成来创建您的非线性ARX模型。GPs由idGaussianProcess对象表示,而回归树集合由idTreeEnsemble对象表示。GPs默认使用指数平方核。在创建对象时可以指定其他内核类型。在本例中,我们使用'Matern32'内核。

如果存在(“fitrgp”“文件”==2 Warn = warning(警告)“关闭”“统计数据:套索:MaxIterReached”);mp1 = nlarx(z1, [5 1 3], idGaussianProcess(“Matern32”))创建200个回归树的增强集合。En = idTreeEnsemble;En.EstimationOptions.FitMethod =“lsboost-resampled”;n. estimationoptions . numlearningcycles = 200;resamplefraction = 1;mp2 = nlarx(z1, [0 70 3], En) compare(z1, mp1, mp2)%比较模型拟合估计数据警告(警告)结束
mp1 = <强> 1输出1输入的非线性ARX模型输入:u1输出:y1回归量:变量y1, u1的线性回归量输出函数:使用Matern32核的高斯过程函数。采样时间:0.2秒状态:使用NLARX对时域数据“双罐系统”进行估计。拟合估计数据:97.1%(预测焦点)FPE: 2.738e-05, MSE: 2.675e-05 mp2 = <强> 1输出1输入的非线性ARX模型输入:u1输出:y1回归量:变量中的线性回归量u1输出函数:袋装回归树集合采样时间:0.2秒状态:使用时域数据NLARX估计“双坦克系统”。拟合估计数据:91.14% MSE: 0.0002503

使用深度学习工具箱中的网络对象

如果您有深度学习工具箱™可用,还可以使用神经网络来定义IDNLARX模型的映射函数Fcn()。这个网络必须是前馈网络(没有循环组件)。

在这里,我们将创建一个单输出网络,其输入数量未知(通过网络对象中的输入大小为零表示)。在估计过程中,输入的数量被自动设置为回归量的数量。

如果存在(“feedforwardnet”“文件”) = = 2%仅在“深度学习工具箱”可用时运行Ff =前馈网络([5 20]);%使用前馈网络将回归量映射到输出ff.layers{2}。transferFcn =“radbas”;ff. trainparam .epoch = 50;创建一个包裹前馈网络的神经网络映射函数。OutputFcn = idFeedforwardNetwork(ff);mn1 = nlarx(z1,[5 1 3], OutputFcn);%估计网络参数比较(z1, mn1)%比较适合估计数据结束

Hammerstein-Wiener (IDNLHW)模型

Hammerstein-Wiener模型最多由3个块组成:一个线性传递函数块前面是一个非线性静态块和/或后面是另一个非线性静态块。如果第一个非线性静态块不存在,则称为Wiener模型,如果第二个非线性静态块不存在,则称为Hammerstein模型。

IDNLHW模型通常使用以下语法进行估计:

M = NLHW(数据,订单,输入非线性,输出非线性)。

其中Orders = [nb bf nk]表示线性传递函数的阶数和时延。input非线性和output非线性为两个非线性块指定了非线性函数,在线性块的输入和输出端。M是一个@idnlhw模型。线性输出误差(OE)模型对应于平凡(单位增益)非线性的情况,即如果IDNLHW模型的输入和输出非线性函数都是单位增益,则模型结构等价于线性OE模型。

分段线性非线性函数的Hammerstein-Wiener模型

idpiecewislinear(分段线性)非线性函数在一般的IDNLHW模型中是有用的。

注意,在Orders = [nb nf nk]中,nf指定线性传递函数的极点数,这与IDNLARX模型的“na”阶有一定关系。“nb”与0时的数字有关。

mhw1 = nlhw(z1, [1 5 3], idpiecewislinear, idpiecewislinear);

可以像以前一样用COMPARE来计算结果。

比较(z1, mhw1)

模型属性可以通过PLOT命令可视化。

单击框图,选择输入非线性(UNL)视图、线性块视图或输出非线性(YNL)视图。

对于线性块,可以在阶跃响应、波德图、脉冲响应和极零映射中选择图形类型。

情节(mhw1)

两个分段线性函数的断点可以检验。这是一个两行矩阵,第一行对应idpiecewislinear函数的输入,第二行对应idpiecewislinear函数的输出。

mhw1.InputNonlinearity.BreakPoints
ans =第一至第七列2.6795 3.4262 4.1729 4.9195 5.6324 6.3599 7.0874 -2.0650 -1.6316 -0.2396 1.4602 2.7554 3.6889 4.2632第八至第十列7.8148 8.3543 9.1260 4.5074 4.4653 6.2634

含饱和和死区非线性的Hammerstein-Wiener模型

饱和函数和死区函数是受物理启发的非线性函数。它们可以用来描述执行器/传感器饱和场景和干摩擦效应。

mhw2 = nlhw(z1, [1 5 3], idDeadZone, idSaturation);比较(z1, mhw2)

非线性的缺失由IDUNITGAIN对象或空的“[]”值表示。单位增益就是一个输入信号到输出的馈通,没有任何修改。

mhw3 = nlhw(z1, [1 5 3], idDeadZone, idUnitGain);%无输出非线性mhw4 = nlhw(z1, [1 5 3], [],idSaturation);%无输入非线性

估计后可检验死区和饱和函数的极限值。

mhw2.InputNonlinearity。ZeroInterval mhw2.OutputNonlinearity.LinearInterval
Ans = -0.9982 4.7565 Ans = 0.2601 0.5848

在估计模型时,可以确定死区零区间或饱和函数线性区间的初始估计值。

mhw5 = nlhw(z1, [1 5 3], idDeadZone([0.1 0.2]), idSaturation([-1 1]));

Hammerstein-Wiener模型-指定属性

可以使用NLHWOPTIONS命令指定估计算法选项。

opt = nlhwOptions();opt.SearchMethod =“玲娜”;opt.SearchOptions.MaxIterations = 7;mhw6 = nlhw(z1, [1 5 3], idDeadZone, idSaturation, opt);

一个已经估计的模型可以通过更多的估计迭代来细化。

根据估计数据进行评估z1mhw7应该有一个比mhw6

opt.SearchOptions.MaxIterations = 30;Mhw7 = nlhw(z1, mhw6, opt);比较(z1, mhw6, mhw7)

Hammerstein-Wiener模型-使用其他非线性函数

分段线性(idpiecewislinear)、饱和(idSaturation)和死区(idDeadZone)的非线性函数主要设计用于IDNLHW模型。它们只能估计单变量非线性。其他更通用的非线性函数,Sigmoid网络(idSigmoidNetwork),自定义网络(idCustomNetwork)和小波网络(idWaveletNetwork)也可以用于IDNLHW模型(除了IDNLARX模型)。然而,由于IDNLHW模型的估计需要可微非线性函数,因此不能使用不可微函数树分区(idTreePartition)、多层神经网络(idFeedforwardNetwork)、高斯过程函数(idGaussianProcess)和回归树集合(idTreeEnsemble)。