主要内容

估计非线性灰盒模型

指定非线性灰箱模型结构

你必须将你的系统表示为一阶非线性差分或微分方程:

x __ t F t x t u t p 一个 r 1 p 一个 r 2 ... p 一个 r N y t H t x t u t p 一个 r 1 p 一个 r 2 ... p 一个 r N + e t x 0 x 0

在哪里 x __ t d x t d t 对于连续时间表示和 x __ t x t + T 年代 对于离散时间表示Ts作为样本时间。FH是任意的线性或非线性函数Nx纽约组件,分别。Nx状态数是和吗纽约为输出数。

在为系统建立方程之后,创建一个函数或mex -文件。可以用C语言或Fortran语言创建的mex文件是动态链接的子例程,可由MATLAB加载和执行®.有关mex文件的更多信息,请参见C MEX文件应用程序.这个文件称为ODE文件或模型文件。

模型文件的目的是将状态导数和模型输出作为时间、状态、输入和模型参数的函数返回,如下所示:

(dx, y) = MODFILENAME (t, x, u, p1, p2,...、pN FileArgument)

提示

编写C mex -文件的模板文件,IDNLGREY_MODEL_TEMPLATE.c,位于matlab工具箱/识别/ nlident

输出变量为:

  • dx-表示状态空间方程的右侧。一个列向量Nx条目。静态模型,dx = []

    对于离散时间模型。dx是下一个时间步骤的状态值吗x (t + Ts)

    对连续时间模型。dx是时刻的状态导数吗t,或 d x d t

  • y-表示输出方程的右侧。一个列向量纽约条目。

文件输入如下:

  • t——当前时间。

  • x-时刻状态向量t.对于静态模型,等于[]

  • u-输入时间向量t.对于时间序列模型,等于[]

  • p1, p2,…,pN-参数,可以是实标量、列向量或二维矩阵。N参数对象的个数。对于标量参数,N是参数元素的总数。

  • FileArgument-包含更新状态方程中的常量可能需要的辅助变量。

提示

创建模型文件后,用合理的输入直接从MATLAB软件调用,并验证输出值。还要检查对于期望的输入和参数值范围,模型输出和导数保持有限。

下面是创建灰盒模型文件的示例idnlgrey模型对象,看创建idnlgrey模型文件

有关指定模型结构的代码文件和mex文件的示例,请参阅工具箱/识别/ iddemos /例子文件夹中。例如,文件中描述了直流电机的模型dcmotor_mdcmotor_c

构造idnlgrey对象

在用模型结构创建函数或mex -文件之后,定义一个idnlgrey对象。这个物体有许多线性的特性idgrey模型对象。

使用下面的通用语法来定义idnlgrey模型对象:

m = idnlgrey ('文件名”,命令,参数,InitialStates)

idnlgrey参数定义如下:

  • 文件名-存储模型结构的函数或mex -文件的名称。当您使用此模型对象进行模型估计、预测或仿真时,此文件必须在MATLAB路径上。

  • 订单-有三个元素的向量(纽约νNx),指定模型输出的数量纽约,输入的数量ν,状态数Nx

  • 参数—参数,指定为结构体数组、单元格数组或双数组。

  • InitialStates—与parameters相同。必须是第四个输入idnlgrey构造函数。

属性的其他属性idnlgrey模型,包括仿真方法和相关选项。有关此对象及其属性的详细信息,请参见idnlgrey参考页面。

使用nlgreyestpem来估计你的灰盒模型。在估计之前,建议模拟模型以验证模型文件的编码是否正确。例如,计算模型响应估计数据的输入信号使用sim卡

y = sim(模型、数据)
在那里,模型idnlgrey对象,数据为估计数据(iddata对象)。

使用nlgreyest估计非线性灰盒模型

你可以使用nlgreyest命令估计未知idnlgrey模型参数和初始状态使用测量数据。

属性的输入输出维度必须与指定的输入和输出顺序兼容idnlgrey模型。

使用以下一般的估计语法:

m2 = nlgreyest(数据、米)

在哪里数据估算数据是不是和idnlgrey您构造的模型对象。输出平方米是一个idnlgrey同配置的型号,更新参数和初始状态以适应数据。有关估计的更多信息可以从报告财产。有关报告以及如何使用,请看输出参数nlgreyest参考页,或类型平方米。报告在命令行上。

属性指定其他估计选项nlgreyestOptions选项设置,包括SearchMethodSearchOption

有关验证模型的信息,请参见模型验证

用MATLAB文件表示非线性动力学进行灰盒估计

该实例说明了如何构建、估计和分析非线性灰箱模型。

非线性灰色矩形(idnlgrey)模型适用于估计连续或离散时间内由非线性状态空间结构描述的系统的参数。两者都可以用idgrey(线性灰箱模型)和idnlgrey建模线性系统的对象。但是,您只能使用idnlgrey来表示非线性动力学。学习线性灰盒建模使用idgrey,请参阅使用系统识别工具箱™构建结构化和用户定义模型

对该模型

在这个例子中,您使用idnlgrey对象。

图1:直流电机的原理图。

如果你无视这些干扰,选择y (1)为角位置[rad]和y (2)(参见Ljung, L. System Identification: Theory for the User, Upper Saddle River, NJ, Prentice-Hall PTR, 1999, 2nd ed., p. 95-97)

1 d | 0 | | 0 |——x (t) = | | x (t) + | | u (t) dt | 0 1 /τ| | k /τ|
| 1 0 | y(t) = | | x(t) | 0 1 |

τ电动机的时间常数是[s]和吗k为从输入到角速度的静态增益,单位为[rad/(V*s)]。详情请参阅Ljung (1999)τk与电机的物理参数有关。

关于输入输出数据

1.加载直流电机数据。

负载(fullfile (matlabroot“工具箱”“识别”“iddemos”“数据”“dcmotordata”));

2.将估计数据表示为iddata对象。

Z = iddata(y, u, 0.1,)“名字”直流电机的);

3.指定输入和输出信号名称、启动时间和时间单位。

z.InputName =“电压”;z.InputUnit =“V”;z.OutputName = {角位置的的角速度};z.OutputUnit = {rad的“rad / s”};z.Tstart = 0;z.TimeUnit =“年代”

4.图数据。

数据显示在两个绘图窗口中。

图(“名字”[z。的名字':电压输入->角位置输出']);情节(z (:, 1,1));绘制第一输入-输出对(电压->角位置)。图(“名字”[z。的名字':电压输入->角速度输出']);情节(z (: 2 1));%绘制第二输入输出对(电压->角速度)。

图2:输入输出数据来自直流电机。

直流电机的线性建模

1.表示直流电机结构中的一个函数。

在这个例子中,您使用的是MATLAB®文件,但您也可以使用C MEX-files(以获得计算速度),P-files或函数句柄。有关更多信息,请参见创建IDNLGREY模型文件

调用直流电机功能dcmotor_m.m如下图所示。

函数[dx, y] = dcmotor_m(t, x, u, tau, k, varargin)
%输出方程。y = [x (1);...%角位置。x(2)……%角速度。];
%状态方程。dx = [x (2);...%角速度。-(1 /τ)* x (2) + (k /τ)* u(1)……%角加速度。];

文件的结构必须总是返回以下内容:

输出参数:

  • dx为连续时间状态导数向量,为离散时间状态更新值。

  • y为输出方程

输入参数:

  • 前三个输入参数必须是:t(时间),x(静态系统的状态向量[]),u(时间序列输入向量[])。

  • 下面是有序的参数列表。参数可以是标量、列向量或二维矩阵。

  • 变长度输入宗量用于辅助输入参数

2.表示直流电机的动力学使用idnlgrey对象。

该模型描述了输入如何使用状态方程生成输出。

文件名=“dcmotor_m”描述模型结构的文件。订单= [2 1 2];模型订单[ny nu nx]。参数= [1;0.28);%初始参数。Np = 2。InitialStates = [0;0);%初始状态。t = 0;%的时间连续系统。nlgr = idnlgrey(FileName, Order, Parameters, InitialStates, Ts,...“名字”直流电机的);

实际上,存在影响输出的干扰。一个idnlgrey模型没有明确地对扰动进行建模,但假设这些扰动只是添加到输出中。因此,idnlgrey模型等价于Output-Error (OE)模型。在没有噪声模型的情况下,过去的输出不会影响未来输出的预测,这意味着任何预测层k的预测输出都与模拟输出一致。

3.指定输入和输出名称以及单元。

集(nlgr,“InputName”“电压”“InputUnit”“V”...“OutputName”, {角位置的的角速度},...“OutputUnit”, {rad的“rad / s”},...“TimeUnit”“年代”);

4.指定初始状态和参数的名称和单位。

nlgr = setinit (nlgr,“名字”, {角位置的的角速度});nlgr = setinit (nlgr,“单位”, {rad的“rad / s”});nlgr = setpar (nlgr,“名字”, {的时间常数“静态增益”});nlgr = setpar (nlgr,“单位”, {“年代”“rad / (V * s)”});

你也可以用setinitsetpar同时为所有初始状态或参数指定值、最小值、最大值和估计状态。

5.查看初始模型。

a.获取模型的基本信息。

直流电机有2个(初始)状态和2个模型参数。

大小(nlgr)
具有2个输出、1个输入、2个状态和2个参数(2个自由)的非线性灰箱模型。

b.查看初始状态和参数。

初始状态和参数都是结构数组。字段指定单个初始状态或参数的属性。类型帮助idnlgrey。InitialStates帮助idnlgrey。参数为更多的信息。

nlgr.Parameters nlgr.InitialStates (1) (2)
ans = struct with fields: Name: 'Angular position' Unit: 'rad' Value: 0 Minimum: -Inf Maximum: Inf Fixed: 1 ans = struct with fields: Name: 'Static gain' Unit: 'rad/(V*s)' Value: 0.2800 Minimum: -Inf Maximum: Inf Fixed: 0

c.在一次调用中检索所有初始状态或模型参数的信息。

例如,获取初始状态的信息是固定的(不是估计的)和所有模型参数的最小值。

getinit (nlgr“固定”) getpar (nlgr“最小值”
ans = 2x1 cell array {[-Inf]} {[-Inf]}

d.获取对象的基本信息:

nlgr
nlgr =连续时间非线性灰色矩形模型定义为“dcmotor_m”(MATLAB文件):dx / dt = F (t, u (t) x (t) p1, p2) y (t) = H (t, u (t) x (t) p1, p2) + e (t)与1输入(s)、2 (s), 2输出(s),和2自由参数(s)(2)。名称:直流电机状态:由直接建设或转换。不估计。

使用得到以获取有关模型属性的更多信息。的idnlgrey对象具有参数化线性模型对象的许多特性。

get (nlgr)
FileName: 'dcmotor_m' Order: [1x1 struct] Parameters: [2x1 struct] InitialStates: [2x1 struct] filearguate: {} SimulationOptions: [1x1 struct] TimeVariable: 't' NoiseVariance: [2x2 double] Ts: 0 TimeUnit: 'seconds' InputName: {'Voltage'} InputUnit: {'V'} InputGroup: [1x1 struct] OutputName: {2x1 cell} OutputUnit: {2x1 cell} outpugroup:[1x1 struct] Notes: [0x1 string] UserData: [] Name: 'DC-motor' Report: [1x1 idresults.nlgreyest]

初始直流电机模型的性能评估

在估计参数之前τk,使用默认微分方程求解器(具有自适应步长调整的龙格-库塔45求解器),用参数猜测模拟系统的输出。仿真选项使用“SimulationOptions”模型属性指定。

1.将绝对误差和相对误差公差设为小值(1 e-61 e-5分别)。

nlgr.SimulationOptions.AbsTol = 1 e-6;nlgr.SimulationOptions.RelTol = 1 e-5;

2.将模拟输出与实测数据进行比较。

比较显示一个或多个模型的测量和模拟输出,然而预测,将显示模拟的输出。

模拟输出和测量输出显示在绘图窗口中。

比较(z, nlgr);

图3:直流电机初始模型的实测输出与仿真输出比较。

参数估计

估计参数和初始状态使用nlgreyest,是一种非线性灰盒模型的预测误差最小化方法。使用“nlgreyestOptions”选项集指定评估选项,例如评估进度显示选项。

nlgr = setinit (nlgr,“固定”,{假假});估计初始状态。选择= nlgreyestOptions (“显示”“上”);NLGR = nlgreyest(z, NLGR, opt);

估计直流电机模型的性能评估

1.回顾评估过程的信息。

这个信息存储在报告财产的idnlgrey对象。该属性还包含有关如何估计模型的信息,如求解器和搜索方法、数据集以及为什么终止估计。

nlgr。报告流('\n\n搜索终止条件:\n') nlgr.Report.Termination
ans = Status: 'Estimated using NLGREYEST'方法:'Solver: ode45;搜索:lsqnonlin' Fit: [1x1 struct] Parameters: [1x1 struct] OptionsUsed: [1x1 idoptions.]nlgreyest] RandState: [] DataUsed: [1x1 struct] Termination: [1x1 struct] The search termination condition: ans = struct with fields: WhyStop: 'Change in cost was less than the specified tolerance.' Iterations: 5 FirstOrderOptimality: 1.4013e-04 FcnCount: 6 Algorithm: 'trust-region-reflective'

2.通过比较模拟输出和测量输出来评估模型质量。

拟合率分别为98%和84%,表明该模型较好地描述了直流电机的动态特性。

比较(z, nlgr);

图4:估计的IDNLGREY直流电机模型的实测输出与仿真输出比较。

3.比较性能idnlgrey模型的二阶ARX模型。

Na = [2 2;2 2];nb = [2;2);nk = [1;1);Dcarx = arx(z, [na nb nk]);比较(z, nlgr, dcarx);

图5:估计的IDNLGREY和ARX直流电机模型的测量输出和仿真输出的比较。

4.检查预测错误。

得到的预测误差很小,并且以零为中心(无偏置)。

体育(z, nlgr);

图6:用估计的IDNLGREY直流电机模型得到的预测误差。

5.检查剩菜(“leftover”)。

残差表示模型未解释的部分,对于良好的模型质量残差较小。使用渣油命令查看残差之间的相关性。图的第一列显示了两个输出的残差的自相关性。第二列显示了这些残差与输入“电压”的相互关系。相关性在可接受范围内(蓝色区域)。

图(“名字”, [nlgr。的名字':估计模型的残差']);渣油(z, nlgr);

图7:用估计的IDNLGREY直流电机模型得到的残差。

6.绘制阶跃响应。

一个单位输入阶跃结果在一个角度位置显示斜坡类型的行为和角速度稳定在一个恒定水平。

图(“名字”, [nlgr。的名字“:估计模型的阶跃响应”]);步骤(nlgr);

图8:阶跃响应与估计IDNLGREY直流电机模型。

7.检查模型的协方差。

你可以通过估计协方差矩阵和估计噪声方差来评估估计模型的质量。一个“小”值(我)协方差矩阵的对角元素表示:当使用所选择的模型结构时,模型参数对于解释系统动力学是重要的。小噪声方差(多输出系统的协方差)元素也很好地表明模型以良好的方式捕获估计数据。

getcov nlgr (nlgr)。NoiseVariance
Ans = 0.0010 -0.0000 -0.0000 0.0110

有关估计模型的更多信息,请使用现在显示初始状态和估计参数值,以及估计参数的不确定度(标准差)。

礼物(nlgr);
nlgr =由'dcmotor_m'定义的连续时间非线性灰箱模型(MATLAB文件):dx/dt = F(t, u(t), x(t), p1, p2) y(t) = H(t, u(t), x(t), p1, p2) + e(t)具有1个输入(s), 2个状态(s), 2个输出(s), 2个自由参数(s) (out of 2). Inputs: u(1) Voltage(t) [V] States:初值x(1)角位置(t) [rad] xinit@exp1 0.0302675 (estimated) in [-Inf, Inf] x(2)角速度(t) [rad/s] xinit@exp1 -0.133777 (estimated) in [-Inf, Inf]输出:y(1)角位置(t) [rad] y(2)角速度(t) [rad/s]值标准偏差p1时间常数[s] 0.243649 0.00396671 (estimated) in [-Inf, Inf] p2静态增益[rad/(V*s)] 0.249644 0.000284486 (estimated) in [-Inf, Inf]名称:直流电机状态:终止条件:成本变化小于指定公差。迭代次数:5,函数计算次数:6,使用Solver估计:ode45;搜索:lsqnonlin在时域数据“直流电机”。拟合估计数据:[98.34;84.47]% FPE: 0.001096, MSE: 0.1187

结论

这个例子说明了执行非线性灰盒建模的基本工具。请参阅其他非线性灰箱示例了解:

  • 在更高级的建模情况下使用非线性灰箱模型,如建立非线性连续和离散时间,时间序列和静态模型。

  • 编写和使用C MEX模型文件。

  • 处理nonscalar参数。

  • 某些算法选择的影响。

有关使用“系统识别工具箱”识别动态系统的更多信息,请访问系统辨识工具箱产品信息页面。

非线性灰箱模型的性质和估计选项

idnlgrey基于模型结构和属性创建非线性灰箱模型。所创建的参数和初始状态idnlgrey对象估计使用nlgreyest

以下模型属性和估计选项会影响模型创建和估计结果。

模拟方法

的方法指定模拟方法SimulationOptions结构体)的属性idnlgrey

系统识别工具箱™软件提供了几个可变步长和固定步长求解器用于模拟idnlgrey模型。

对于离散时间系统,默认解算器为“FixedStepDiscrete”.对于连续时间系统,默认解算器为“数值”.默认情况下,SimulationOptions。解算器被设置为“汽车”,它会自动选择其中之一“数值”“FixedStepDiscrete”在估计和仿真过程中——取决于系统在时间上是连续的还是离散的。

要查看可用求解器及其属性的列表,请参见SimulationOptions模型属性idnlgrey参考页面。

搜索方法

属性指定用于估计模型参数的搜索方法SearchMethod选择的nlgreyestOptions选项设置。两种方法可用于非线性灰箱建模。

一类方法包括基于线搜索方法的最小化方案,包括高斯-牛顿型方法、最陡下降法和Levenberg-Marquardt方法。

非线性最小二乘的信赖域反射牛顿法(lsqnonlin),其中成本是测量输出和模拟输出之间的误差平方和,需要Optimization Toolbox™软件。当参数边界不同于默认的+/- Inf时,此搜索方法比基于行搜索的方案更好地处理边界。然而,与基于行搜索的方法不同,lsqnonlin不能处理在多输出情况下由估计噪声方差的逆自动加权。有关更多信息,请参见OutputWeight中的估计选项nlgreyestOptions参考页面。

默认情况下,SearchMethod被设置为汽车,自动从可用的最小化器中选择一种方法。如果已安装“优化工具箱”产品,SearchMethod被设置为“lsqnonlin”.否则,SearchMethod是一种基于线搜索的组合方案。

有关这个和其他的详细信息nlgreyest估计选项,请参阅nlgreyestOptions

梯度的选择

属性指定计算梯度的方法GradientOptions选择的nlgreyestOptions选项设置。梯度是误差对未知参数和初始状态的导数。

梯度的计算是通过数值扰动未知量和测量其对模拟误差的影响。

梯度计算的选项包括选择差分格式(向前、向后或中间),未知数最小扰动的大小,以及梯度是同时计算还是单独计算。

有关这个和其他的详细信息nlgreyest估计选项,请参阅nlgreyestOptions

另请参阅

|

相关的例子

更多关于