主要内容

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

这个例子展示了如何构造、估计和分析非线性灰盒模型。

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

关于模型

在本例中,您将使用idnlgrey对象。

图1:直流电机原理图。

如果你忽略干扰并选择y (1)作为角位置[rad]和y (2)作为电机的角速度[rad/s],可以建立如下形式的线性状态空间结构(推导参见Ljung, L.系统识别:用户的理论,Upper Saddle River, NJ, Prentice-Hall PTR, 1999,第2版,第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。的名字':电压输入->角位置输出']);Plot (z(:, 1,1));绘制第一个输入输出对(电压->角位置)。图(“名字”[z。的名字':电压输入->角速度输出']);Plot (z(:, 2,1));绘制第二个输入输出对(电压->角速度)。

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

直流电机的线性建模

1.用函数表示直流电机的结构。

在本例中,您使用MATLAB®文件,但您也可以使用C mex文件(以获得计算速度)、p文件或函数句柄。有关更多信息,请参见创建IDNLGREY模型文件

调用DC-motor函数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维矩阵。

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

2.表示直流电机的动态idnlgrey对象。

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

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

在实践中,有干扰会影响输出。一个idnlgreyModel没有显式地对干扰进行建模,而是假设这些干扰只是被添加到输出中。因此,idnlgrey模型等价于输出误差(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)”});

你也可以用setinit而且setpar同时为所有初始状态或参数赋值、极小值、极大值和估计状态。

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'单位:'rad'值:0最小值:-Inf最大值:Inf固定:1 ans = struct with fields: Name: 'Static gain'单位:'rad/(V*s)'值:0.2800最小值:-Inf最大值:Inf固定:0

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

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

getinit (nlgr“固定”) getpar (nlgr“最小值”
ans = 2x1 cell array {[1]} {[1]} 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个)。名称:DC-motor状态:通过直接构建或转换创建。不估计。

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

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

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

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

1.将绝对和相对误差容差设置为较小的值(1 e-6而且1 e-5分别)。

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

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

比较显示一个或多个模型的测量和模拟输出,而预测,用相同的输入参数调用,显示模拟的输出。

模拟和测量输出显示在一个图形窗口。

比较(z, nlgr);

图3:测量输出与初始直流电机模型模拟输出的比较。

参数估计

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

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

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

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

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

nlgr。报告流(\n\n搜索终止条件:\n') nlgr.Report.Termination
ans = Status: 'Estimated using NLGREYEST' Method: 'Solver: ode45;搜索:lsqnonlin' Fit: [1x1 struct]参数:[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.检查剩余(“剩菜”)。

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

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

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

6.画出阶跃响应。

单位输入步长会导致显示坡道类型行为的角位置和稳定在恒定水平的角速度。

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

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

7.检验模型协方差。

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

getcov nlgr (nlgr)。NoiseVariance
Ans = 1.0e-04 * 0.1573 0.0021 0.0021 0.0008 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)。输入:u(1)电压(t) [V]状态:初始值x(1)角位置(t) [rad] xinit@exp1 0.0302675(估计)in [-Inf, Inf] x(2)角速度(t) [rad/s] xinit@exp1 -0.133777(估计)in [-Inf, Inf]输出:y(1)角位置(t) [rad] y(2)角速度(t) [rad/s]参数:值标准差p1时间常数[s] 0.243649 0.00396671(估计)in [-Inf, Inf] p2静态增益[rad/(V*s)] 0.249644 0.000284486(估计)in [-Inf, Inf]名称:dc -电机状态:终止条件:成本变化小于规定公差。迭代次数:5,函数计算次数:6使用Solver: ode45估计;在时域数据“DC-motor”上搜索lsqnonlin。拟合估计数据:[98.34;84.47]% FPE: 0.001096, MSE: 0.1187模型“报告”属性中的更多信息。< a href = " matlab:如果存在(“nlgr”、“var”),如果isa (nlgr idnlgrey”),disp (' ');Disp (get(nlgr)),否则Disp (' ');disp('无法显示变量nlgr的属性,因为它不再是/一个idnlgrey对象。');,end, else matlab.graphics.internal.getForDisplay('nlgr'), end">模型属性 . properties

结论

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

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

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

  • 处理非标量参数。

  • 某些算法选择的影响。

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

Baidu
map