主要内容

两个柜系统:C MEX-File建模的时间连续的输出系统

这个例子展示了如何执行IDNLGREY建模基于C墨西哥人模型文件。它使用一个简单的系统,非线性状态空间模型是有回报的。

两个柜系统

目标是模型下水箱的液位实验室规模的两个柜系统,示意图如图1所示。

图1:两个柜系统的示意图。

输入输出数据

我们开始建模工作通过加载可用的输入-输出数据,使用以下IDNLGREY模型模拟结构,与噪声添加到输出。twotankdata。垫文件包含一个数据集有3000输入输出样本,生成使用采样率(Ts)的0.2秒。输入电压u (t)是[V]应用于泵,它生成一个流入到上面的坦克。的底部,而小洞上坦克收益率流出,进入低柜,和输出y (t)的两个柜系统然后下水箱的液位[m]。我们创建一个IDDATA对象z坦克数据。用于记账和文档我们也指定通道名称和单位。这一步是可选的。

负载(fullfile (matlabroot“工具箱”,“识别”,“iddemos”,“数据”,“twotankdata”));z = iddata (y, u, 0.2,“名字”,“两个坦克”);集(z,“InputName”,“泵电压”,“InputUnit”,“V”,“OutputName”,水箱水位低的,“OutputUnit”,“米”,“Tstart”0,“TimeUnit”,“年代”);

的输入-输出数据将用于评估图所示窗口。

图(“名字”,(z.Name:输入输出数据的]);情节(z);

图2:从两个柜系统输入-输出数据。

建模的两个槽系统

下一步是指定一个描述两个柜系统的模型结构。要做到这一点,让x1 (t)和x2 (t)表示上部和下部水箱中的水位,分别。对于每一个坦克,基础物理(质量平衡)指出,水量的变化取决于之间的区别——和流出(i = 1、2):

d / dt (Ai * xi (t)) = Qini (t) - Qouti (t)

在Ai (m ^ 2)的横截面积是坦克我和Qini (t)和Qouti (t) (m ^ 3 / s)的流入和流出罐我在时间t。

上罐,流入被认为是成正比的电压泵,即。Qin1 (t) = k * u (t)。自上水箱的出口孔很小,可以应用伯努利定律,说明流出的平方根成正比的水位,或更准确地说:

Qout1 (t = a1 *√(2 * g * x1 (t))

在a1出口孔的横截面积和g是重力常数。低柜,等于流入流出上罐,即。秦氏(t) = Qout1 (t)和流出是由伯努利定律:

Qout2 (t = a2 *√(2 * g * x2 (t))

在a2出口孔的横截面积。

完全把这些事实导致以下状态空间结构:

d / dt x1 (t) = 1 / A1 * (k * u (t) - A1 * sqrt (2 * g * x1 (t))) d / dt x2 (t) = 1 / A2 * (A1 * 12 + (2 * g * x1 (t)) - A2 * 12 + (2 * g * x2 (t))) y (t) = x2 (t)

两个柜C墨西哥人模型文件

这些方程参数下放入C MEX-file 6(或常数),A1, k, A1, A2和A2。C MEX-file通常是更多的参与比使用MATLAB语言编写相应的文件,但C墨西哥人建模通常提供了一个明显的优势在执行速度方面,尤其是对于更复杂的模型。提供一个模板C MEX-file(见下文),帮助用户结构的代码。对于大多数应用程序,它可以定义的输出和输入的代码行数来描述dx和y向该模板。一个IDNLGREY C MEX-file应该结构化返回两个输出:

dx:右边(s)的状态空间方程(s) y:右边(s)的输出方程(s)

它应该采取3 +禁食(+ 1)输入参数指定如下:

t:当前时间x:状态向量在时间t([]为静态模型)u:输入向量在时间t(时间序列模型[])p1, p2,…pNpo:单个参数(可以真正的标量,列向量或矩阵二维);非营利组织在这里参数对象的数量,与标量模型参数与参数的数量Np FileArgument:可选的输入模型文件

在我们两个柜系统有6标量参数的数量,因此输入参数C墨西哥人建模文件应该是3 + Npo = 3 + 6 = 9。落后10:th论点在这里可以省略可选FileArgument受雇于这个应用程序。

编写一个C墨西哥人建模文件通常是在四个步骤完成:

1。包含c库和定义的输出。2。编写函数计算状态方程的右边(s) (s), compute_dx。3所示。编写函数计算输出方程的右边(s) (s), compute_y。4所示。编写主界面功能,包括基本的错误检查功能,代码用于创建和处理输入和输出参数,并调用compute_dx compute_y。
让我们查看源文件C墨西哥人(除了一些评论)两个柜系统,在此基础上在一些更详细地讨论这四个项目。

图3:C墨西哥人两罐系统的源代码。

1。两个c库墨西哥人。h和数学。h通常包括提供一系列MEX-related以及数学函数。输出的数量也宣布每使用标准C-define建模文件:

/ *包括库。* / # include”墨西哥人。h math.h“# include
/ *这里指定输出的数量。* / # define纽约1

2 - 3。接下来在文件中找到更新的功能状态,compute_dx, compute_y和输出。这两个函数参数列表,输出的计算(dx或y)在位置1,之后,之前所有的变量和参数要求计算右边(s)的状态和输出方程,分别。

这些函数的第一步是将模型参数将用于随后的方程。任何有效的变量名(除了那些用于输入参数列表)可用于提供个人的身体有意义的名称参数。

在C语言中,一样一个数组的第一个元素存储在位置0。因此,dx[0]在C语言中对应于dx(1)在MATLAB®(或者只是dx,以防它是一个标量),输入u[0]对应于(或u(1)),参数A1[0]对应A1,等等。

两个水箱模型文件涉及计算平方根。这是通过将数学math.h C库。数学库实现最常见的三角函数(罪恶,因为,棕褐色,asin、治疗状况,世界,等等),指数(exp)和对数(日志,log10),平方根(√)和功能(战俘)的力量,和绝对值计算(晶圆厂)。的数学。h图书馆必须包括任何数学。h函数;否则可以省略。看到“教程在非线性灰色框模型标识:创建IDNLGREY模型文件“关于C数学库的更多细节。

4所示。主界面功能应该几乎总是有相同的内容,对于大多数应用程序不需要任何修改。原则上,唯一的一部分,可能会考虑更改调用compute_dx和compute_y。对于静态系统,人们可以省去compute_dx的电话。在其他情况下,它可能是想只通过引用的变量和参数的状态和输出方程。例如,在两个柜系统的输出方程,只使用一个状态,一个很可能缩短输入参数列表:

空白compute_y(双* y,双* x)

并调用compute_y:

compute_y (y、x);

compute_dx的输入参数列表和compute_y也可能扩展到包括接口函数,进一步推断变量的状态数和参数的数量。

一旦模型的源文件已经完成它必须被编译,可以完成从MATLAB命令提示符使用墨西哥人命令;看到“帮助墨西哥人”。(这里省略了这一步。)

当开发模型特定C MEX files通常很有用开始工作通过复制IDNLGREY C墨西哥人模板文件。这个模板包含框架源代码以及关于如何定制的详细说明一个特定应用程序的代码。模板文件的位置显示在MATLAB通过输入下面的命令提示符。

fullfile (matlabroot“工具箱”,“识别”,“nlident”,“IDNLGREY_MODEL_TEMPLATE.c”)

也看到“创建IDNLGREY模型文件”的例子IDNLGREY C墨西哥人模型文件的更多细节。

创建两个坦克IDNLGREY模型对象

下一步是创建一个IDNLGREY对象描述两罐系统。为了方便我们还设置一些记账信息输入和输出(名称和单位)。

文件名=“twotanks_c”;%文件描述模型结构。订单= [1 1 2];%模型[纽约νnx]命令。参数= {0.5;0.0035;0.019;9.81;0.25;0.016};%初始参数。InitialStates = [0;0.1);%初始状态的初始值。t = 0;%的时间连续系统。nlgr = idnlgrey(文件名、秩序、参数、InitialStates Ts,“名字”,“两个坦克”);集(nlgr,“InputName”,“泵电压”,“InputUnit”,“V”,“OutputName”,水箱水位低的,“OutputUnit”,“米”,“TimeUnit”,“年代”);

我们继续添加信息的单位名称和美国和通过命令SETINIT和SETPAR模型参数。此外,这两个州x1 (t)和x2 (t)坦克水平不能是负数,因此我们也指定x1(0)和x2(0) > = 0通过“最小值”属性。事实上,我们也知道,所有模型参数应该严格正的。因此我们的所有参数设置“最低”属性一些小正值(eps (0))。这些设置暗示约束估计将在即将到来的评估步骤进行(即。、估计模型将是一个模型,这样所有输入约束荣幸)。

nlgr = setinit (nlgr,“名字”,{上水箱水位的水箱水位低的});nlgr = setinit (nlgr,“单位”,{“米”“米”});nlgr = setinit (nlgr,“最低”,{0 0});%积极的水平!nlgr = setpar (nlgr,“名字”,{“上层舱区域”“泵恒”上罐出口区域的“引力常数”“低槽区”“低柜出口区域”});nlgr = setpar (nlgr,“单位”,{“m ^ 2”' m ^ 3 / (s * V) '“m ^ 2”“m / s ^ 2)”“m ^ 2”“m ^ 2”});nlgr = setpar (nlgr,“最低”,num2cell (eps (0) * (6,1)));%所有参数> 0 !

代表性的地区(A1和A2)的两个坦克可以相当准确地确定。因此我们对待这些和g作为常量,并验证“固定”字段是正确设置为所有通过命令GETPAR 6参数。总而言之,这意味着3模型参数的估计。

nlgr.Parameters (1)。固定= true;nlgr.Parameters (4)。固定= true;nlgr.Parameters (5)。固定= true;getpar (nlgr“固定”)
ans x1 = 6单元阵列{[1]}{[0]}{[0]}{[1]}{[1]}{[0]}

最初的两个坦克模型的性能

之前估计的自由参数k, a1和a2我们模拟系统使用初始参数值。我们使用默认的微分方程解算器(龙格-库塔45解算器和自适应步长调整)并设置绝对和相对误差公差很小的值(分别为1 e-6和1 e-5)。注意,命令相比,当调用了两个输入参数,默认将评估所有初始状态(s)无论任何初始状态被定义为“固定”。只为了估计自由初始状态(s),呼叫与第三个和第四个输入参数如下:比较(z, nlgr,“init”,“m”);作为坦克模型的初始状态默认是“固定”,没有初始状态估计会执行这个命令。

nlgr.SimulationOptions。AbsTol = 1 e-6;nlgr.SimulationOptions。RelTol = 1 e-5;比较(z, nlgr);

图4:比较真实的输出和模拟初始的两个坦克模型的输出。

模拟输出和真正的阴谋所示窗口中,可以看到的并不是那么令人印象深刻。

参数估计

为了改善健康,明年估计使用NLGREYEST 3自由参数。(因为,默认情况下,“固定”字段的初始状态都是假的,没有估计的初始状态估计将在这完成调用)。

nlgr = nlgreyest (z, nlgr nlgreyestOptions (“显示”,“上”));

估计两个水箱模型的性能

调查的性能估计模型,模拟它的执行(初始状态在这里重新估计)。

比较(z, nlgr);

图5:比较真实的输出和模拟估计两个水箱模型的输出。

真实和模拟输出之间的协议相当好。剩下的问题是,然而,如果两个柜系统可以使用更简单准确地描述和线性模型结构。要回答这个问题,让我们试着适应一些标准线性模型的数据结构,然后使用比较了解这些模型捕获坦克的动力。

nk =延迟(z);arx22 = arx (z, [2 2 nk]);%二阶线性ARX模型。3 nk arx33 = arx (z, [3]);%三阶线性ARX模型。arx44 = arx (z, [4 4 nk]);%四阶线性ARX模型。oe22 = oe (z, [2 2 nk]);%二阶线性OE模型。3 nk oe33 = oe (z, [3]);%三阶线性OE模型。oe44 = oe (z, [4 4 nk]);%四阶线性OE模型。sslin = ss (z);%(确定的顺序自动)状态空间模型比较(z, nlgr“b”arx22,“m -”arx33,”男:“arx44,“m——”,oe22,“g -”oe33,“旅客:”oe44,“g——”sslin,的r -);

图6:比较真实的输出和模拟输出估计两个水箱模型的数量。

比较图清楚地表明,线性模型不能接两个柜的所有动力系统。另一方面估计非线性IDNLGREY模型显示一个优秀的适合真正的输出。此外,IDNLGREY模型参数也符合这些用于生成正确的输出。在下面显示的计算中,我们使用命令GETPVEC,它返回一个参数向量从结构数组创建IDNLGREY对象的模型参数。

disp (“真正的估计参数向量”);ptrue = (0.5;0.005;0.02;9.81;0.25;0.015);流(“% 1.4 f % 1.4 f \ n”[ptrue ';getpvec (nlgr) '));
真正的估计参数向量0.5000 0.5000 0.0050 0.0049 0.0200 0.0200 9.8100 9.8100 0.2500 0.2500 0.0150 0.0147

获得的预测错误使用PE很小和很像随机噪声。

图;体育(z, nlgr);

图7:获得的预测错误估计IDNLGREY两罐模型。

让我们也调查如果输入电压从5到6,7,8,9,10 V以步进式的方式。我们这样做是通过调用步骤指定不同的步骤振幅从固定偏移量的5伏特。阶跃响应配置了一个专门创建的选项集RespConfig:

图(“名字”,(nlgr.Name:一步反应的]);t = (20:0.1:80)”;选择= RespConfig (“InputOffset”5,“振幅”6“延迟”,20);步骤(nlgr t“b”、选择);持有Opt.Amplitude = 7;步骤(nlgr t‘g’、选择);Opt.Amplitude = 8;步骤(nlgr t“r”、选择);Opt.Amplitude = 9;步骤(nlgr t“米”、选择);Opt.Amplitude = 10;步骤(nlgr t“k”、选择);网格;传奇(“5 - > 6 V”,“5 - > 7 V”,“5 - > 8 V”,“5 - > 9 V”,“5 - > 10 V”,“位置”,“最佳”);

图8:一步反应得到估计IDNLGREY两罐模型。

最后使用目前的命令,我们得到总结的信息估计模型:

礼物(nlgr);
nlgr =连续时间非线性灰色矩形模型定义为“twotanks_c”(MEX-file): dx / dt = F (t, u (t) x (t) p1,…、p6) y (t) = H (t, u (t) x (t) p1,…,p6) + e(t) with 1 input(s), 2 state(s), 1 output(s), and 3 free parameter(s) (out of 6). Inputs: u(1) Pump voltage(t) [V] States: Initial value x(1) Upper tank water level(t) [m] xinit@exp1 0 (fixed) in [0, Inf] x(2) Lower tank water level(t) [m] xinit@exp1 0.1 (fixed) in [0, Inf] Outputs: y(1) Lower tank water level(t) [m] Parameters: Value Standard Deviation p1 Upper tank area [m^2] 0.5 0 (fixed) in ]0, Inf] p2 Pump constant [m^3/(s*V)] 0.00488584 0.0259032 (estimated) in ]0, Inf] p3 Upper tank outlet area [m^2] 0.0199719 0.0064682 (estimated) in ]0, Inf] p4 Gravity constant [m/(s^2)] 9.81 0 (fixed) in ]0, Inf] p5 Lower tank area [m^2] 0.25 0 (fixed) in ]0, Inf] p6 Lower tank outlet area [m^2] 0.0146546 0.0776058 (estimated) in ]0, Inf] Name: Two tanks Status: Termination condition: Change in cost was less than the specified tolerance.. Number of iterations: 8, Number of function evaluations: 9 Estimated using Solver: ode45; Search: lsqnonlin on time domain data "Two tanks". Fit to estimation data: 97.35% FPE: 2.419e-05, MSE: 2.414e-05 More information in model's "Report" property. Model Properties

结论

在这个例子中我们展示了:

1。如何使用C mex files IDNLGREY建模和2。提供了一个非常简单的例子,非线性状态空间建模显示良好的潜力

额外的信息

更多信息的识别与系统辨识工具箱™访问动态系统系统辨识工具箱产品信息页面。