使用系统识别工具箱建立和估计过程模型
此示例展示如何使用System Identification Toolbox™构建简单的流程模型。描述了使用实验数据创建这些模型和估计其参数的技术。本例需要Simulink®。金宝app
简介
这个例子说明了如何构建流程工业中常用的简单流程模型。简单的低阶连续时间传递函数通常被用来描述过程行为。这些模型由IDPROC对象描述,IDPROC对象以极点零增益形式表示传递函数。
过程模型的基本类型是“静态增益+时间常数+时间延迟”。它们可以表示为:
或作为一个综合的过程:
其中用户可以确定实极的数量(0,1,2或3),以及分子中是否存在零,积分项(1 / s
)和存在时间延迟(道明
).此外,一个欠阻尼(复杂)极点对可以取代实极点。
使用IDPROC对象表示流程模型
IDPROC对象使用字母定义流程模型P
(流程模型),D
(对于时间延迟),Z
(对于零)和我
(集成商)。一个整数将表示极点的数量。模型是通过调用生成的idproc
用这些字母创建一个字符向量。
例如:
idproc (“P1”)只有一个极点的%传递函数(无零或延迟)idproc (“P2DIZ”)%模型与2极,延迟积分器和延迟idproc (“P0ID”)%模型,没有极点,但积分器和延迟
ans =带传递函数的过程模型:Kp G(s) = ---------- 1+Tp1*s Kp = NaN Tp1 = NaN参数化:{'P1'}自由系数数:2使用"getpvec", "getcov"表示参数及其不确定性。现状:由直接构建或改造而产生。不估计。ans =带传递函数的过程模型:1+Tz*s G(s) = Kp * ------------------- * exp(-Td*s) s(1+Tp1*s)(1+Tp2*s) Kp = NaN Tp1 = NaN Tp2 = NaN Td = NaN Tz = NaN参数化:{'P2DIZ'}自由系数数:5参数及其不确定性用"getpvec"、"getcov"表示。现状:由直接构建或改造而产生。不估计。ans =带传递函数的过程模型:Kp G(s) =——* exp(-Td*s) s Kp = NaN Td = NaN参数化:{'P0DI'}自由系数数:2参数及其不确定性用"getpvec"、"getcov"表示。现状:由直接构建或改造而产生。不估计。
创建IDPROC对象(以Simulink模型为例)金宝app
考虑由以下Simulink模型描述的系统:金宝app
open_system (“iddempr1”) set_param (“iddempr1 /随机数”,“种子”,' 0 ')
红色部分是系统,蓝色部分是控制器,参考信号是扫描正弦信号(啁啾信号)。数据采样时间设置为0.5秒。正如所观察到的,系统是一个连续时间传递函数,因此可以使用系统识别工具箱中的模型对象进行描述,例如中的难点
,idpoly
或idproc
.
让我们描述使用的系统idpoly
而且idproc
对象。使用idpoly
对象时,系统可以描述为:
M0 = idpoly(1,0.1,1,1,[1 0.5],“t”0,“InputDelay”, 1.57,“NoiseVariance”, 0.01);
上面使用的IDPOLY形式对于描述任意阶的传递函数是有用的。由于我们在这里考虑的系统非常简单(一个极点,没有零),并且是连续时间的,我们可以使用更简单的IDPROC对象来捕获它的动态:
M0p = idproc(“p1d”,“金伯利进程”, 0.2,“Tp1”2,“Td”, 1.57)%一极+延时,带初始值%为增益,极点和延迟指定。
m0p =带传递函数的过程模型:Kp G(s) = ---------- * exp(-Td*s) 1+Tp1*s Kp = 0.2 Tp1 = 2 Td = 1.57参数化:{'P1D'}自由系数数:3参数及其不确定性用"getpvec"、"getcov"表示。现状:由直接构建或改造而产生。不估计。
IDPROC模型参数估计
一旦系统被模型对象(如IDPROC)描述,就可以使用测量数据对其参数进行估计。作为一个例子,我们考虑了利用仿真数据估计Simulink模型系统(红色部分)参数的问题。金宝app我们首先获取用于估计的数据:
sim卡(“iddempr1”) dat1e = iddata(y,u,0.5);用于存储测量数据的IDDATA对象
让我们看看数据:
情节(dat1e)
我们可以使用过程
命令,通过提供用于创建IDPROC模型的相同结构信息。例如,1极+延迟模型可以通过调用来估计过程
如下:
M1 =进程(dat1e,“p1d”);% idproc模型使用数据“dat1e”的估计。检查估计结果:m1
m1 =带传递函数的过程模型:Kp G(s) = ---------- * exp(-Td*s) 1+Tp1*s Kp = 0.20045 Tp1 = 2.0431 Td = 1.499参数化:{'P1D'}自由系数数:3使用"getpvec", "getcov"表示参数及其不确定性。状态:在时域数据“dat1e”上使用PROCEST进行估计。拟合估计数据:87.34% FPE: 0.01069, MSE: 0.01062
要获得关于不确定性的信息,请使用
礼物(m1)
m1 =带传递函数的过程模型:Kp G(s) = ---------- * exp(-Td*s) 1+Tp1*s Kp = 0.20045 +/- 0.00077275 Tp1 = 2.0431 +/- 0.061216 Td = 1.499 +/- 0.040854参数化:{'P1D'}自由系数数:3使用"getpvec", "getcov"表示参数及其不确定性。状态:终止条件:接近(局部)最小值,(范数(g) < tol)..迭代次数:4,函数求值次数:9使用PROCEST对时域数据“dat1e”进行估计。拟合估计数据:87.34% FPE: 0.01069, MSE: 0.01062更多信息在模型的“报告”属性。
模型参数,K
,Tp1
而且道明
现在显示的是一个标准偏差不确定范围。
IDPROC模型的时间响应和频率响应计算
该模型m1
上面估计的是一个IDPROC模型对象,所有工具箱的模型命令都可以应用到它:
步骤(m1, m0)模型m1(估计)和m0(实际)的阶跃响应%传奇('m1(估计参数)','m0(已知参数)',“位置”,“西北”)
可通过如下方式计算置信区域为3个标准差的波德响应:
H = bodeploy (m1,m0);showConfidence (h, 3)
同样,测量数据可以与模型输出进行比较比较
如下:
比较(dat1e、m0、m1)
其他操作,例如sim卡
,冲动
,汇集
也是可用的,就像对其他模型对象一样。
bdclose (“iddempr1”)
在估计中容纳样本间行为的影响
考虑输入数据的样本间行为可能很重要(至少对于慢采样而言)。为了说明这一点,让我们研究与以前相同的系统,但没有采样和保持电路:
open_system (“iddempr5”)
用相同的采样时间对该系统进行模拟:
sim卡(“iddempr5”) dat1f = iddata(y,u,0.5);模拟数据的IDDATA对象
我们估计了一个IDPROC模型data1f
同时还对允许的延迟值施加了上界。我们将使用'lm'作为搜索方法,也选择查看估计进度。
M2_init = idproc(“P1D”);m2_init.Structure.Td。最大值= 2;opt = procestOptions(“SearchMethod”,“lm”,“显示”,“上”);M2 = procest(dat1f,m2_init,opt);平方米
m2 =带传递函数的过程模型:Kp G(s) = ---------- * exp(-Td*s) 1+Tp1*s Kp = 0.20038 Tp1 = 2.01 Td = 1.31参数化:{'P1D'}自由系数数:3参数及其不确定性用"getpvec"、"getcov"表示。状态:在时域数据“dat1f”上使用PROCEST进行估计。拟合估计数据:87.26% FPE: 0.01067, MSE: 0.01061
这个模型对延迟的估计比之前的m1稍微差一些:
[m0p。道明,m1.Td, m2。道明] step(m0,m1,m2) legend(“m0(实际)”,'m1(用ZOH估计)','m2(不含ZOH的估算)',“位置”,“东南”)
Ans = 1.5700 1.4990 1.3100
然而,通过告诉估计过程样本间行为是一阶保持(对真正连续的近似)输入,我们做得更好:
dat1f。我nterSample =“呸”;M3 = procest(dat1f,m2_init,opt);
比较四个模型m0(正确)m1(从zoh输入获得)m2(连续输入获得,zoh假设)和m3(从相同输入获得,但采用foh假设)
[m0p。道明,m1.Td, m2。Td, m3。道明] compare(dat1e,m0,m1,m2,m3)
Ans = 1.5700 1.4990 1.3100 1.5570
步骤(m0、m1、m2、m3)传说(“m0”,“m1”,“平方米”,“m3”) bdclose (“iddempr5”)
闭环系统建模
现在让我们考虑一个更复杂的过程,有集成,在闭环中运行:
open_system (“iddempr2”)
真实的系统可以表示为:
M0 = idproc(“P2ZDI”,“金伯利进程”, 1“Tp1”, 1“Tp2”5,' Tz '3,“Td”, 2.2);
该过程由一个具有有限输入幅度的PD调节器和一个零级保持装置控制。采样时间为1秒。
set_param (“iddempr2 /随机数”,“种子”,' 0 ') sim卡(“iddempr2”) dat2 = iddata(y,u,1);用于估计的% IDDATA对象
进行了两个不同的模拟,第一个用于估计,第二个用于验证。
set_param (“iddempr2 /随机数”,“种子”,“13”) sim卡(“iddempr2”) dat2v = iddata(y,u,1);用于验证目的的IDDATA对象
让我们看看数据(估计和验证)。
情节(dat2 dat2v)传说(“dat2(估算),“dat2v(验证)”)
现在让我们执行评估使用dat2
.
警告=警告(“关闭”,鉴别:估计:underdampedIDPROC);M2_init = idproc(“P2ZDI”);m2_init.Structure.Td。最大值= 5;m2_init.Structure.Tp1。最大值= 2;opt = procestOptions(“SearchMethod”,“lsqnonlin”,“显示”,“上”);opt.SearchOptions.MaxIterations = 100;M2 = procest(dat2, m2_init, opt)
m2 =带传递函数的过程模型:1+Tz*s G(s) = Kp * ------------------- * exp(-Td*s) s(1+Tp1*s)(1+Tp2*s) Kp = 0.98412 Tp1 = 2 Tp2 = 1.4838 Td = 1.713 Tz = 0.027244参数化:{'P2DIZ'}自由系数数:5参数及其不确定性用"getpvec"、"getcov"表示。状态:在时域数据“dat2”上使用PROCEST进行估计。拟合估计数据:91.51% FPE: 0.1128, MSE: 0.1092
比较(dat2v, m2, m0)%与数据有很好的一致性
波德(m2, m0)传说({“m2(美国东部时间)”,“m0(实际)”},“位置”,“西方”)
冲动(m2, m0)传说({“m2(美国东部时间)”,“m0(实际)”})
并与真实系统的参数进行比较:
Present (m2) [getpvec(m0), getpvec(m2)]
m2 =带传递函数的过程模型:1+Tz*s G(s) = Kp * ------------------- * exp(-Td*s) s(1+Tp1*s)(1+Tp2*s) Kp = 0.98412 +/- 0.013672 Tp1 = 2 +/- 8.2231 Tp2 = 1.4838 +/- 10.193 Td = 1.713 +/- 63.703 Tz = 0.027244 +/- 65.516参数化:{'P2DIZ'}自由系数数:5参数及其不确定性使用"getpvec"、"getcov"。状态:终止条件:成本变化小于规定的公差。迭代次数:3,函数求值次数:4在时域数据“dat2”上使用PROCEST估计。拟合估计数据:91.51% FPE: 0.1128, MSE: 0.1092更多信息在模型的“报告”属性。Ans = 1.0000 0.9841 1.0000 2.0000 5.0000 1.4838 2.2000 1.7130 3.0000 0.0272
提醒一句。多个实时常数的识别有时可能是一个病态问题,特别是当数据是在闭环中收集时。
为了说明这一点,让我们根据验证数据估计一个模型:
M2v = procest(dat2v, m2_init, opt) [getpvec(m0), getpvec(m2), getpvec(M2v)]
m2v =带传递函数的过程模型:1+Tz*s G(s) = Kp * ------------------- * exp(-Td*s) s(1+Tp1*s)(1+Tp2*s) Kp = 0.95747 Tp1 = 1.999 Tp2 = 0.60819 Td = 2.314 Tz = 0.0010561参数化:{'P2DIZ'}自由系数数:5参数及其不确定性用"getpvec"、"getcov"表示。状态:使用PROCEST对时域数据“dat2v”进行估计。拟合估计数据:90.65% FPE: 0.1397, MSE: 0.1353 ans = 1.0000 0.9841 0.9575 1.0000 2.0000 1.9990 5.0000 1.4838 0.6082 2.2000 1.7130 2.3140 3.0000 0.0272 0.0011
这个模型的参数值更差。另一方面,当在另一个数据集dat2上测试时,它的执行几乎与真实系统m0相同:
比较(dat2 m0, m2, m2v)
在估计过程中固定已知参数
假设我们从其他来源知道一个时间常数是1:
m2v.Structure.Tp1。Value = 1;m2v.Structure.Tp1。Free = false;
我们可以固定这个值,同时估计其他参数:
M2v = procest(dat2v, M2v)%
m2v =带传递函数的过程模型:1+Tz*s G(s) = Kp * ------------------- * exp(-Td*s) s(1+Tp1*s)(1+Tp2*s) Kp = 1.0111 Tp1 = 1 Tp2 = 5.3014 Td = 2.195 Tz = 3.231参数化:{'P2DIZ'}自由系数数:4参数及其不确定性用"getpvec"、"getcov"表示。状态:使用PROCEST对时域数据“dat2v”进行估计。拟合估计数据:92.05% FPE: 0.09952, MSE: 0.09794
如前所述,固定Tp1
对其已知值的估计极大地提高了模型中其余参数的估计m2v
.
这也表明,简单的近似应该在数据上表现良好:
M1x_init = idproc(“P2D”);%结构更简单(无零,无积分器)m1x_init.Structure.Td。最大值= 2;M1x = procest(dat2v, m1x_init) compare(dat2,m0,m2,m2v, M1x)
m1x =带传递函数的过程模型:Kp G(s) = ----------------- * exp(-Td*s) (1+Tp1*s)(1+Tp2*s) Kp = -1.2554 Tp1 = 1.0249e-06 Tp2 = 0.077945 Td = 1.958参数化:{'P2D'}自由系数数:4参数及其不确定性使用"getpvec", "getcov"。状态:使用PROCEST对时域数据“dat2v”进行估计。拟合估计数据:-23.87% FPE: 24.15, MSE: 23.77
因此,更简单的模型能够很好地估计系统输出。然而,m1x
不包含任何积分,所以开环长时间范围内的行为会有很大的不同:
步骤(m0, m2, m2v m1x)传说(“m0”,“平方米”,“m2v”,“m1x”) bdclose (“iddempr2”警告(警告)