这个例子展示了如何估计模型参数使用线性和非线性灰盒建模。gydF4y2Ba
使用灰盒识别来估计描述模型动态的ode的系数,以拟合给定的响应轨迹。gydF4y2Ba
对于线性动力学,使用线性灰盒模型表示模型(gydF4y2BaidgreygydF4y2Ba
).估计模型系数gydF4y2Ba感动的gydF4y2Ba
.gydF4y2Ba
对于非线性动力学,使用非线性灰盒模型表示模型(gydF4y2BaidnlgreygydF4y2Ba
).估计模型系数gydF4y2BanlgreyestgydF4y2Ba
.gydF4y2Ba
在本例中,您使用单摆的振荡数据来估计其摩擦系数的值。单摆的运动方程为:gydF4y2Ba
是摆相对于静止状态的角位移。gydF4y2BaggydF4y2Ba
是重力加速度常数。gydF4y2Ba米gydF4y2Ba
摆的质量和gydF4y2BalgydF4y2Ba
是钟摆的长度。gydF4y2BabgydF4y2Ba
为粘性摩擦系数,其值为给定角位移数据的拟合值。没有外力推动钟摆运动。gydF4y2Ba
负载(fullfile (matlabrootgydF4y2Ba“工具箱”gydF4y2Ba,gydF4y2Ba“识别”gydF4y2Ba,gydF4y2Ba…gydF4y2Ba“iddemos”gydF4y2Ba,gydF4y2Ba“数据”gydF4y2Ba,gydF4y2Ba“pendulumdata”gydF4y2Ba));数据= iddata(y,[],0.1,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“摆”gydF4y2Ba);数据。OutputName =gydF4y2Ba“摆的位置”gydF4y2Ba;数据。OutputUnit =gydF4y2Barad的gydF4y2Ba;数据。Tstart = 0; data.TimeUnit =“年代”gydF4y2Ba;gydF4y2Ba
将测量到的角位移数据加载并保存为gydF4y2Ba数据gydF4y2Ba
,一个gydF4y2BaiddatagydF4y2Ba
对象,其采样时间为0.1秒。的gydF4y2Ba集gydF4y2Ba
命令用于指定时间向量的输出名称、输出单位、开始时间和单位等数据属性。gydF4y2Ba
假设钟摆只受到很小的角位移,则描述钟摆运动的方程可以简化为:gydF4y2Ba
利用角位移(gydF4y2Ba)和角速度(gydF4y2Ba)为状态变量,则简化后的方程可重写为:gydF4y2Ba
在这里,gydF4y2Ba
的gydF4y2BaBgydF4y2Ba
而且gydF4y2BaDgydF4y2Ba
矩阵为零,因为单摆没有外力驱动。gydF4y2Ba
1.创建一个ODE文件,将模型系数与其状态空间表示联系起来。gydF4y2Ba
函数gydF4y2Ba[A,B,C,D] =线性摆(m,g,l, B, Ts) A = [0 1;- g / l - b / m / l ^ 2);B = 0 (2,0);C = [10];D = 0 (1,0);gydF4y2Ba结束gydF4y2Ba
这个函数,gydF4y2BaLinearPendulumgydF4y2Ba
,返回使用模型系数的单摆线性运动模型的状态空间表示gydF4y2Ba米gydF4y2Ba
,gydF4y2BaggydF4y2Ba
,gydF4y2BalgydF4y2Ba
,gydF4y2BabgydF4y2Ba
.gydF4y2BaTsgydF4y2Ba
是采样时间。将此函数保存为gydF4y2BaLinearPendulum.mgydF4y2Ba
.这个函数gydF4y2BaLinearPendulumgydF4y2Ba
必须在MATLAB®路径上。或者,您也可以为这个函数指定完整的路径名。gydF4y2Ba
2.对象关联的线性灰盒模型gydF4y2BaLinearPendulumgydF4y2Ba
函数。gydF4y2Ba
M = 1;G = 9.81;L = 1;B = 0.2;线性模型= idgrey(gydF4y2Ba“LinearPendulum”gydF4y2Ba, {m g, l b},gydF4y2Ba“c”gydF4y2Ba);gydF4y2Ba
米gydF4y2Ba
,gydF4y2BaggydF4y2Ba
而且,gydF4y2BalgydF4y2Ba
指定已知模型系数的值。gydF4y2BabgydF4y2Ba
指定粘性摩擦系数的初始猜测值。的gydF4y2Ba“c”gydF4y2Ba
的调用中的Input参数gydF4y2BaidgreygydF4y2Ba
指定gydF4y2Balinear_modelgydF4y2Ba
作为一个连续时间系统。gydF4y2Ba
3.指定gydF4y2Ba米gydF4y2Ba
,gydF4y2BaggydF4y2Ba
,gydF4y2BalgydF4y2Ba
作为已知参数。gydF4y2Ba
linear_model.Structure.Parameters(1)。Free = false;linear_model.Structure.Parameters(2)。Free = false;linear_model.Structure.Parameters(3)。Free = false;gydF4y2Ba
如上一步定义的那样,gydF4y2Ba米gydF4y2Ba
,gydF4y2BaggydF4y2Ba
,gydF4y2BalgydF4y2Ba
前三个参数是gydF4y2Balinear_modelgydF4y2Ba
.使用gydF4y2BaStructure.Parameters.FreegydF4y2Ba
字段的值,gydF4y2Ba米gydF4y2Ba
,gydF4y2BaggydF4y2Ba
,gydF4y2BalgydF4y2Ba
被指定为固定值。gydF4y2Ba
4.创建一个评估选项集,指定要评估的初始状态,并打开评估进度显示。还强制估计算法返回一个稳定的模型。此选项仅适用于线性模型(idgrey)估计。gydF4y2Ba
opt = greyestOptions(gydF4y2Ba“InitialState”gydF4y2Ba,gydF4y2Ba“估计”gydF4y2Ba,gydF4y2Ba“显示”gydF4y2Ba,gydF4y2Ba“上”gydF4y2Ba);opt.EnforceStability = true;gydF4y2Ba
5.估算粘性摩擦系数。gydF4y2Ba
线性模型=灰色(数据,线性模型,选择);gydF4y2Ba
的gydF4y2Ba感动的gydF4y2Ba
命令更新参数gydF4y2Balinear_modelgydF4y2Ba
.gydF4y2Ba
b_est = linear_model.Structure.Parameters(4).Value;[linear_b_est,dlinear_b_est] = getpvec(linear_model, dlinear_b_est)gydF4y2Ba“免费”gydF4y2Ba)gydF4y2Ba
Linear_b_est = 0.1178 dlinear_b_est = 0.0088gydF4y2Ba
getpvecgydF4y2Ba
回报,gydF4y2Badlinear_b_estgydF4y2Ba
的1个标准差不确定度gydF4y2BabgydF4y2Ba
的自由估计参数gydF4y2Balinear_modelgydF4y2Ba
的估计值gydF4y2BabgydF4y2Ba
,粘性摩擦系数,采用线性灰盒估计返回gydF4y2Balinear_b_estgydF4y2Ba
.gydF4y2Ba
6.比较线性灰盒模型对实测数据的响应。gydF4y2Ba
linear_model对比(数据)gydF4y2Ba
线性灰盒估计模型与实测数据的拟合率为49.9%。拟合不佳的原因是假设摆的角位移很小,而实测数据显示出较大的振荡。gydF4y2Ba
非线性灰盒估计要求将微分方程表示为一阶方程。gydF4y2Ba
利用角位移(gydF4y2Ba)和角速度(gydF4y2Ba)作为状态变量,则运动方程可以改写为一阶非线性微分方程:gydF4y2Ba
1.创建一个ODE文件,将模型系数与其非线性表示联系起来。gydF4y2Ba
函数gydF4y2Ba[dx,y] =非线性摆(t,x,u,m,g,l,b,变量)gydF4y2Ba输出方程。gydF4y2BaY = x(1);gydF4y2Ba%角位置。gydF4y2Ba%状态方程。gydF4y2BaDx = [x(2);gydF4y2Ba…gydF4y2Ba角位置gydF4y2Ba- (g / l) * sin (x (1)) - b / (m * l ^ 2) * x (2)gydF4y2Ba…gydF4y2Ba%角速度gydF4y2Ba];gydF4y2Ba结束gydF4y2Ba
这个函数,gydF4y2BaNonlinearPendulumgydF4y2Ba
,利用模型系数返回摆非线性运动模型的状态导数和输出gydF4y2Ba米gydF4y2Ba
,gydF4y2BaggydF4y2Ba
,gydF4y2BalgydF4y2Ba
,gydF4y2BabgydF4y2Ba
.将此函数保存为gydF4y2BaNonlinearPendulum.mgydF4y2Ba
在MATLAB®路径上。或者,您也可以为这个函数指定完整的路径名。gydF4y2Ba
2.对象关联的非线性灰盒模型gydF4y2BaNonlinearPendulumgydF4y2Ba
函数。gydF4y2Ba
M = 1;G = 9.81;L = 1;B = 0.2;Order = [1 0 2];参数= {m,g,l,b};Initial_states = [1;0);Ts = 0;非线性模型= idnlgrey(gydF4y2Ba“NonlinearPendulum”gydF4y2Ba、秩序、参数、initial_states Ts);gydF4y2Ba
3.指定gydF4y2Ba米gydF4y2Ba
,gydF4y2BaggydF4y2Ba
,gydF4y2BalgydF4y2Ba
作为已知参数。gydF4y2Ba
setpar (nonlinear_modelgydF4y2Ba“固定”gydF4y2Ba,{真真真假});gydF4y2Ba
如上一步定义的那样,gydF4y2Ba米gydF4y2Ba
,gydF4y2BaggydF4y2Ba
,gydF4y2BalgydF4y2Ba
前三个参数是gydF4y2Banonlinear_modelgydF4y2Ba
.使用gydF4y2BasetpargydF4y2Ba
命令,gydF4y2Ba米gydF4y2Ba
,gydF4y2BaggydF4y2Ba
,gydF4y2BalgydF4y2Ba
被指定为固定值和gydF4y2BabgydF4y2Ba
指定为自由估计参数。gydF4y2Ba
4.估算粘性摩擦系数。gydF4y2Ba
非线性模型= nlgreyest(数据,非线性模型,gydF4y2Ba“显示”gydF4y2Ba,gydF4y2Ba“全部”gydF4y2Ba);gydF4y2Ba
的gydF4y2BanlgreyestgydF4y2Ba
命令更新参数gydF4y2Banonlinear_modelgydF4y2Ba
.gydF4y2Ba
b_est =非线性模型. parameters (4).Value;[nonlinear_b_est, dnonlinear_b_est] = getpvec(非线性模型,gydF4y2Ba“免费”gydF4y2Ba)gydF4y2Ba
Nonlinear_b_est = 0.1002 dnonlinear_b_est = 0.0149gydF4y2Ba
getpvecgydF4y2Ba
返回,gydF4y2Badnonlinear_b_estgydF4y2Ba
的1个标准差不确定度gydF4y2BabgydF4y2Ba
的自由估计参数gydF4y2Banonlinear_modelgydF4y2Ba
的估计值gydF4y2BabgydF4y2Ba
,粘性摩擦系数,采用非线性灰盒估计返回gydF4y2Banonlinear_b_estgydF4y2Ba
.gydF4y2Ba
5.比较线性灰盒模型和非线性灰盒模型对实测数据的响应。gydF4y2Ba
比较(数据、linear_model nonlinear_model)gydF4y2Ba
非线性灰盒模型估计更接近实测数据。gydF4y2Ba
idgreygydF4y2Ba
|gydF4y2BaidnlgreygydF4y2Ba
|gydF4y2Ba感动的gydF4y2Ba
|gydF4y2BanlgreyestgydF4y2Ba