使用系统辨识工具箱构建结构化和用户定义的模型
这个例子展示了如何估计参数定义的模型结构。这样的结构是由IDGREY指定(线性状态方程)或IDNLGREY非线性状态空间模型。我们将研究如何分配结构,修复参数并创建它们之间的依赖关系。
实验数据
我们将调查数据(模拟)产生的直流电机。我们第一次加载数据:
负载dcmdatayu
矩阵y
包含两个输出:日元
电机轴角位置和吗y2
是角速度。有400个数据样本和样品时间是0.1秒。中包含的输入向量u
。这是电机的输入电压。
z = iddata (y、u, 0.1);% IDDATA对象z。InputName =“电压”;z。OutputName = {“角”;“AngVel”};情节(z (: 1:))
图:测量数据:电压角度
情节(z (: 2:))
图:测量数据:电压角速度
模型结构选择
d / dt x = x + u + K B e C y = x + d u + e
我们应当建立一个直流电机的模型。电动机的动态是众所周知的。如果我们选择x1角位置和x2的角速度很容易建立一个下列字符忽视干扰:状态空间模型(见例4.1 Ljung (1999):
1 | 0 | | 0 | d / dt x = | | x + | | u | 0 th1 | | th2 |
1 | 0 | y = | | | x | 0 1
的参数th1
电动机的逆时间常数和吗th2
是这样的,th1 / th2
是静态输入角速度。(见Ljung(1987)如何th1
和th2
与电动机的物理参数)。我们将从观测数据估计这两个参数。上述模型结构(参数化状态空间)可以在MATLAB®使用ids和IDGREY模型。这些模型让你使用实验数据进行参数估计。
规范的名义(初始)模型
如果我们想这th1 = 1, th2 = 0.28我们获得名义或初始模型
(0 = 1;0 1];%初始猜测(2,2)是1B = [0;0.28);%初始猜测B(2)是0.28C =眼(2);D = 0 (2, 1);
我们包成一个ids模型对象:
= idss女士(A, B, C, D);
该模型的特点是它的矩阵,它们的值,哪些元素是免费的(估计)的上限和下限:
ms.Structure.a
ans =名字:A值:[2 x2双]最低:[2 x2双]最大:[2 x2双]自由:[2 x2逻辑]:[2 x2双]信息:[2 x2 struct] 1 x1 param.Continuous
ms.Structure.a。价值ms.Structure.a.Free
= 0 1 0 1岁= 2 x2逻辑数组1 1 1 1
规范的自由(独立)使用IDSS模型参数
所以我们现在应该标记,只有一个(2,2)和B(2, 1)自由参数估计。
ms.Structure.a。自由= [0 0;0 1];ms.Structure.b。自由= [0;1);ms.Structure.c。自由= 0;%标量扩展使用ms.Structure.d。自由= 0;ms.Ts = 0;%这个定义了模型是连续的
最初的模型
女士%初始模型
=连续时间状态空间模型确定女士:dx / dt = x (t) + B u e (t) + K (t) y (t) = C x (t) + D u (t) + e (t) = (x1, x2) x1 0 1 x2 0 1 B = u1 x1 0 x2 0.28 C y2 = (x1, x2)日元1 0 0 1 D = u1 y1 y2 0 K = y₁y2 x1 0 0 x2 0 0参数化:结构化形式(一些固定系数A、B、C)。引线:没有干扰组件:没有很多免费的系数:2使用“idssdata”、“getpvec”、“getcov”参数及其不确定性。状态:由直接建设或转换。不估计。
自由参数估计的IDSS模型
预测误差(最大似然)现在估计的参数计算:
dcmodel = ss (z,女士,ssestOptions (“显示”,“上”));dcmodel
dcmodel =连续时间状态空间模型发现:dx / dt = x (t) + B u e (t) + K (t) y (t) = C x (t) + D u (t) + e (t) = (x1, x2) x1 0 1 x2 0 x1 0 x2 1.002 C = -4.013 B =电压(x1, x2)角1 0 AngVel 0 1 D =电压角0 AngVel 0 K =角AngVel x1 0 0 x2 0 0参数化:结构化形式(一些固定系数A、B、C)。引线:没有干扰组件:没有很多免费的系数:2使用“idssdata”、“getpvec”、“getcov”参数及其不确定性。状态:估计使用党卫军时域数据“z”。适合估算数据:[98.35,84.42]%消防工程:0.001071,MSE: 0.1192
估计的参数值很接近,数据模拟时使用(4和1)。评估模型的质量我们可以模拟模型与实际输入,比较它与实际输出。
比较(z, dcmodel);
我们现在可以,例如情节0和两极地区及其不确定性。我们将画3个标准差对应的区域,由于该模型是相当准确的。注意,钢管在原点是绝对肯定的,因为它是模型结构的一部分;角速度的积分器的位置。
clf showConfidence (iopzplot (dcmodel), 3)
现在,我们可以进行各种修改。1,2-element矩阵(固定为1)告诉我们x2
的导数是x1
。假设传感器没有校准,所以可能会有一个未知的比例常数。包括一个常数的估算我们只是“释放”(1、2)
和重新评估:
dcmodel2 = dcmodel;dcmodel2.Structure.a.Free (1、2) = 1;dcmodel2 = pem (z, dcmodel2);
由此产生的模型
dcmodel2
dcmodel2 =连续时间状态空间模型发现:dx / dt = x (t) + B u e (t) + K (t) y (t) = C x (t) + D u (t) + e (t) = (x1, x2) x1 0.9975 0 x2 0 x1 0 x2 1.004 C = -4.011 B =电压(x1, x2)角1 0 AngVel 0 1 D =电压角0 AngVel 0 K =角AngVel x1 0 0 x2 0 0参数化:结构化形式(一些固定系数A、B、C)。引线:没有干扰组件:没有很多免费的系数:3使用“idssdata”、“getpvec”、“getcov”参数及其不确定性。状态:估计使用PEM时域数据“z”。适合估算数据:[98.35,84.42]%消防工程:0.001077,MSE: 0.1192
我们发现估计(1、2)
接近1。比较两个模型我们使用比较
命令:
比较(z, dcmodel dcmodel2)
规范使用IDGREY对象模型的耦合参数
假设我们准确了解直流电机的静态增益(从输入电压到角速度,如从先前的阶跃响应实验。如果静态增益G
,电动机的时间常数t,然后变成了状态空间模型
1 | 0 | | 0 | d / dt x = | | x + | | u | 0 1 / t | | G / t |
1 | 0 | y = | | | x | 0 1
与G
知道,有一个不同的矩阵中的条目之间的依赖。为了描述,早些时候与“免费”方式使用参数将是不够的。我们因此需要编写一个MATLAB文件生产,B, C和D,也可选K和X0矩阵输出,对于每一个给定的参数向量作为输入。也有辅助参数作为输入,这样用户可以改变某些事情在模型结构,而无需编辑该文件。在这种情况下我们已知的静态增益G
是进入了这样一个论点。已经写的文件名称“motorDynamics.m”。
类型motorDynamics
函数[A, B, C, D, K, X0] = motorDynamics (par, ts,辅助)% motorDynamics ODE文件代表一个发动机的动力。% % [A, B, C, D, K, X0] = motorDynamics(τ,Ts, G) %返回的直流电机的状态空间矩阵%时间常数τ(τ= par)和已知的静态增益G .示例Ts %时间。% %这个文件返回连续时间表示如果输入参数Ts %是零。如果t > 0,将返回一个离散时间表示。让% IDGREY模型,使用这个文件意识到这种灵活性,设置%值的结构。FcnType财产“cd”。这种灵活性是有用的% %连续和离散域之间的转换需要估计和仿真。% %参见IDGREY IDDEMO7。% l . Ljung %版权1986 - 2015 MathWorks公司t =(1)相当;G =辅助(1);A = (0 0 1; 1 / t);B = (0; G / t); C = eye(2); D = [0;0]; K = zeros(2); X0 = [0;0]; if ts>0 % Sample the model with sample time Ts s = expm([[A B]*ts; zeros(1,3)]); A = s(1:2,1:2); B = s(1:2,3); end
现在我们创建一个IDGREY模型对象对应于该模型结构:假定的时间常数
par_guess = 1;
我们也给0.25辅助变量的值G
(增益)和样品时间。
辅助= 0.25;dcmm = idgrey (“motorDynamics”par_guess,“cd”辅助0);
目前估计时间常数
dcmm =感动(z, dcmm greyestOptions (“显示”,“上”));
我们现在就直接估计电机的时间常数。它的值是在良好的协议与以前的估计。
dcmm
dcmm =连续时间线性灰箱模型定义为“motorDynamics”功能:dx / dt = x (t) + B u e (t) + K (t) y (t) = C x (t) + D u (t) + e (t) = (x1, x2) x1 0 1 x2 0 x1 0 x2 1.001 C = -4.006 B =电压(x1, x2)角1 0 AngVel 0 1 D =电压角0 AngVel 0 K =角AngVel x1 0 0 x2 0 0模型参数:Par1 = 0.2496参数化:颂歌功能:motorDynamics(用参数表示连续和离散方程)干扰组件:由ODE函数参数化的初始状态:参数化ODE功能很多免费的系数:1使用“getpvec”、“getcov”参数及其不确定性。状态:估计使用老龄化最严重的时域数据“z”。适合估算数据:[98.35,84.42]%消防工程:0.00107,MSE: 0.1193
这个模型我们可以继续测试各个方面。所有命令的语法与以前相同的情况。例如,我们可以比较idgrey模型状态空间模型与其他:
比较(z, dcmm dcmodel)
他们显然是非常接近。
估计多元ARX模型
状态方程的一部分工具箱还处理多变量(几个输出)ARX模型。由多元ARX-model我们指的是以下几点:
(问)y (t) = B (q) u (t) + e (t)
在这里(q)是纽约|纽约在延迟算子多项式矩阵的条目1 / q。k-l元素用:
地点:
因此一个多项式1 /问
的程度nakl
。
同样B (q)是一个纽约|ν矩阵,其kj-element是:
因此推迟nkkj
从输入数j
输出数量k
。最常见的方式来创建这些是使用ARX-command。指定的订单:nn = (na nb nk)
与na
作为一个ny-by-ny
矩阵的kj
进口是nakj
;注
和nk
类似的定义。
让我们来测试一些ARX-models dc-data。首先我们可以简单地建立一个一般的二阶模型:
dcarx1 = arx (z,“na”,2,2,2,2,“注”(2,2),“朝鲜”(1,1))
dcarx1 =离散ARX模型:模型输出“角”:一个(z) y_1 (t) = - ai (z) y_i (t) + B (z) u (t) + e_1 (t) (z) = 1 - 0.5545 z ^ 1 - 0.4454 z ^ 2 A₂(z) = -0.03548 z ^ 1 - 0.06405 z ^ 2 B (z) = 0.004243 z ^ 1 + 0.006589 z ^ 2模型输出“AngVel”:一个(z) y_2 (t) = - ai (z) y_i (t) + B (z) u (t) + e_2 (t) (z) = 1 - 0.2005 z ^ 1 - 0.2924 z ^ 2 A_1 (z) = 0.01849 z ^ 1 - 0.01937 z ^ 2 B (z) = 0.08642 z ^ 1 + 0.03877 z ^ 2样品时间:0.1秒参数化:多项式订单:na = [2 2; 2 2] nb = (2, 2) nk =[1; 1]很多免费的系数:12使用“polydata”、“getpvec”、“getcov”参数及其不确定性。状态:估计使用ARX时域数据“z”。适合估算数据:[97.87,83.44]%(预测聚焦)消防工程:0.002157,MSE: 0.1398
结果,dcarx1
存储为一个IDPOLY模型,和以前所有命令适用。例如我们可以显式地列出ARX-polynomials:
dcarx1.a
ans = 2 x2单元阵列{[1 -0.5545 - -0.4454]}{[0 -0.0355 - -0.0640]}{[0 0.0185 - -0.0194]}{[1 -0.2005 - -0.2924]}
细胞阵列,如dcarx1的{1,2}元素。是多项式(1、2)所述,有关y2日元。
我们也可以测试结构,我们知道日元
通过过滤y2
通过一阶滤波器。(角是角速度的积分)。我们还可以假设一阶动力学从输入到输出2号:
na = [1 1;0 1];nb = [0;1);nk = [1;1);dcarx2 = arx (z, (na nb nk))
dcarx2 =离散ARX模型:模型输出“角”:一个(z) y_1 (t) = - ai (z) y_i (t) + B (z) u (t) + e_1 (t) (z) = 1 - 0.9992 z ^ 1 A₂(z) = -0.09595 z ^ 1 B (z) = 0模型输出“AngVel”:一个(z) y_2 B (t) = (z) u (t) + e_2 (t) (z) = 1 - 0.6254 z ^ 1 B (z) = 0.08973 z ^ 1样品时间:0.1秒参数化:多项式订单:na = [1 1; 0 1] nb = [0, 1] nk =[1; 1]很多免费的系数:4使用“polydata”、“getpvec”、“getcov”参数及其不确定性。状态:估计使用ARX时域数据“z”。适合估算数据:[97.52,81.46]%(预测聚焦)消防工程:0.003452,MSE: 0.177
我们使用比较不同模型获得
比较(z, dcmodel dcmm dcarx2)
最后,我们可以比较bodeplots从输入到输出获得通过使用一个不同的模型波德
:首先输出:
dcmm2 = ids (dcmm);%转换为subreferencing IDSS波德(dcmodel (1, 1),“r”dcmm2 (1,1),“b”dcarx2 (1,1),‘g’)
第二个输出:
波德(dcmodel (2, 1),“r”dcmm2 (1),“b”dcarx2 (1),‘g’)
一分之二的模型或多或少在具体协议。ARX-models不太好,由于偏见造成的非白人方程误差噪声。(我们在模拟测量白噪声)。
结论
估计模型与预先确定的结构可以使用系统辨识工具箱。在状态空间形式,参数可能对他们的已知值或固定约束躺在规定的范围内。如果需要指定参数之间的关系或其他约束,IDGREY对象可以使用。IDGREY模型评估用户指定的MATLAB文件状态空间系统参数估计。多元ARX模型提供另一种选择与指定的快速估算多输出模型结构。