主要内容

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

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

输入-输出数据集

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

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

负载Twotankdata.Z = iddata(y, u, 0.2,)“名字”“两舱系统”);

数据分割和绘图

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

我们将用z1,并对其进行评估z2z3z1类似于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}。更复杂的、任意的延迟变量公式也是可能的。

在System Identification Toolbox™中,不必显式地创建回归器集;只需指定它们的形式(如多项式顺序)、贡献变量和它们的滞后,就可以隐式地生成一个大型集合。规范的对象linearRegressorpolynomialRegressorcustomRegressor用于此目的。例如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模型的最优阶数arxstrucSelstruc

V = arxstruc(z1,z2, strc (1:5, 1:5,1:5));%通过Akaike的信息标准(AIC)选择最佳订单nn = selstruc (V,“另类投资会议”
n = 5 1 3

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

非线性ARX模型

在IDnlarx模型中,模型输出是回归的非线性函数,如y(t)= fcn(y(t-1),y(t-1),...,y(t-5),u(T-3))。

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

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

它类似于线性ARX命令,其中附加参数“FCN”指定非线性函数的类型。非线性ARX模型通过使用2级变换产生其输出:1。将培训数据(输入 - 输出信号)映射到一组回归。在数值上,回归集是双矩阵r,每个回归负载一列数据。2.将回收器映射到单个输出,y =fcn®,其中fcn()是标量非线性函数。

要估算IDnlarx模型,在选择模型订单之后,我们需要选择要使用的非线性映射函数fcn()的类型。让我们首先尝试小波网络(IDWaveletNetWork)功能。

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

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

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

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

比较(z1, mw1);

使用模型属性

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

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

已使用默认的InputName和OutputName。

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

可以使用getReg命令查看IDnlarx模型的回归。回归器由对象。InputName对象。OutputName和时间延迟。

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

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

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

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

为映射函数分配回归器

IDNLARX模型的输出是其回归器的静态函数。通常这个映射函数有一个线性块,一个非线性块,加上一个偏置项(输出偏移)。模型输出是这些块的输出和偏差的总和。为了降低模型复杂度,只能选择一部分回归器进入非线性块和线性块。使用模型的RegressorUsage属性将回归器分配给映射函数的线性和非线性组件。

RegUseTable =对象。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;我=包含(RegNames,'U1');RegUseTable。(“日元:NonlinearFcn”)(〜i)= false;

作为一个例子,考虑一个模型,除了使用线性回归器之外,还使用二阶多项式回归器MW2..首先,生成一个多项式回归器规范集。

P = polynomialRegressor ({“日元”'U1'},{1:2,0:3},2)
P = Order 2 regressors in variables y1, u1 Order: 2 variables: {'y1' 'u1'}时滞:{[1 2][0 1 2 3]}UseAbsolute: [0 0] AllowVariableMix: 0 AllowLagMix: 0 TimeVariable: 't'

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

mw3 =对象;%从mw2结构开始进行新的估算mw3。解释变量= [mw3.Regressors;P];将多项式集添加到模型结构中

最后,通过最小化一步预测误差,更新模型参数以拟合数据。

Mw3 = nlarx(z1, Mw3)
mw3 =  1 output 1 input的非线性ARX模型变量y1 u1 2的线性回归。输出函数: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,MW2,MW3)传奇显示

残留物都不相关,输入信号z2(z2.InputData)。然而,它们对模型显示出一些自相关性mlinMW3..该模型MW2.在(自动和互相关)测试中表现更好。

函数图可用来观察各种IDNLARX模型的非线性响应。该图实质上显示了非线性映射函数Fcn()的特征。

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

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

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

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

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

比较(z2, ms1);

在数据集z3上。

比较(ms1 z3);

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

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

类型gaussunit.m
函数[f,g,a] = gaussUnit(x)%gaussUnit单位函数用于IDcustomnetwork(示例)%%[f,g,a] = gaussUnit(x)%x:单位函数变量%f:单位函数value % g: df/dx % a: unit active range (g(x) is significantly non zero in the interval [-a a]) % % The unit function must be "vectorized": for a vector or matrix x, the output % arguments f and g must have the same size as x, computed element-by-element. % Copyright 2005-2021 The MathWorks, Inc. % Author(s): Qinghua Zhang f = exp(-x.*x); if nargout>1 g = - 2*x .* f; a = 0.2; end

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

mc1_ini = idnlarx (“日元”'U1', [5 1 3], idCustomNetwork(@gaussunit));使用= false (6,1);使用([3 5 6])= true;mc1_ini。RegressorUsage{: 2} =使用;哪= 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 =警告(“关闭”'统计:套索:maxiterreached');mp1 = nlarx(z1, [5 1 3], idGaussianProcess(“Matern32”))%创建增强的200个回归树集合en = iDtreeysemble;en.estimationOptions.fitmethod =.“lsboost-resampled”;En.EstimationOptions.NumLearningCycles = 200;En.EstimationOptions.ResampleFraction = 1;mp2 = nlarx(z1, [0 70 3], En)%比较模型符合估计数据警告(警告)结束
 Inputs: u1 Outputs: y1 regression: variables y1, u1 output function: Gaussian process function using a Matern32 kernel. mp1 = 状态:使用NLARX对时域数据“两罐系统”进行估计。拟合估计数据:97.1%(预测焦点)FPE: 2.738e-05, MSE: 2.675e-05 mp2 =  1 output 1 input非线性ARX模型 Inputs: u1 Outputs: y1 Regression sors:变量中的线性回归变量u1 output function: Bagged Regression Tree Ensemble样本时间:0.2秒状态:用NLARX对时域数据“两罐系统”进行估计。拟合估计数据:91.14% MSE: 0.0002503

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

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

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

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

Hammerstein-Wiener (IDNLHW)模型

Hammerstein-Wiener模型由多达3个块组成:线性传输功能块之前是非线性静态块和/或后跟另一个非线性静态块。如果第一个非线性静态块不存在,则称为维纳模型,如果不存在第二非线性静态块,则为HammerStein模型。

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

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

Orders = [NB BF NK]指定了线性传输函数的订单和延迟。InputNonlinitity和OutputNonlinity指定了线性块的输入和输出端的两个非线性块的非线性函数。m是@idnlhw模型。线性输出误差(OE)模型对应于微型(单位增益)非线性的情况,即,如果IDNLWW模型的输入和输出非线性函数都是单位增益,则模型结构相当于线性OE模型。

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

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

请注意,在ORDERS = [NB NF NK]中,NF指定线性传递函数的极数,与IDNLAR型模型的“NA”顺序有关。“NB”与零的数字有关。

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

与以前一样,可以使用COMPARE来评估结果。

比较(Z1,MHW1)

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

点击方框图选择输入非线性(UNL)、线性方框图或输出非线性(YNL)的视图。

对于线性块,可以在阶梯响应,BODE图,脉冲响应和极零地图中选择图的类型。

情节(mhw1)

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

mhw1.InputNonlinearity.BreakPoints
ans =列1至7 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列8至10 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.Serointerval MHW2.OutputNonlinearity.LinearInterval.
Ans = 0.9982 4.7565

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

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

Hammerstein-Wiener模型-指定属性

估计算法选项可以通过NLHWOPTIONS命令指定。

选择= 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模型 - 使用其他非线性功能

非线性函数分段线性(IDPICEWISELINEAR),饱和度(IDSATURATUS)和死区(IDDEDZONE)主要设计用于IDNLHW模型。它们只能估计单变非线性。其他更一般的非线性函数,SIGMOID网络(IDSIGMoidNetwork),自定义网络(IDcustomnetwork)和小波网络(IDWaveletNetWork)也可以在IDNLHW模型中使用(除Idnlarx模型之外)。然而,不能使用非可微分功能树分区(IDTreeVeation),多层神经网络(IDFeedforwornetwork),高斯进程功能(IDGaussianProcess)和回归树集合(IDTreeSeneMble),因为IDNLHW模型的估计需要可差的非线性函数。