估计ode的系数来拟合给定解gydF4y2Ba
这个例子展示了如何使用线性和非线性灰盒建模估计模型参数。gydF4y2Ba
使用灰盒识别来估计描述模型动力学的ode的系数,以拟合给定的响应轨迹。gydF4y2Ba
对于线性动力学,使用线性灰盒模型(gydF4y2Ba
idgreygydF4y2Ba
).估计模型系数使用gydF4y2Ba感动的gydF4y2Ba
.gydF4y2Ba对于非线性动力学,用非线性灰盒模型(gydF4y2Ba
idnlgreygydF4y2Ba
).估计模型系数使用gydF4y2BanlgreyestgydF4y2Ba
.gydF4y2Ba
在本例中,使用简单摆的振荡数据估计其摩擦系数的值。单摆的运动方程为:gydF4y2Ba
是钟摆相对于静止状态的角位移。gydF4y2BaggydF4y2Ba
重力加速度是常数。gydF4y2Ba米gydF4y2Ba
摆的质量和gydF4y2BalgydF4y2Ba
是钟摆的长度。gydF4y2BabgydF4y2Ba
为粘性摩擦系数,其估计值拟合给定角位移数据。没有外部驱动力使钟摆运动。gydF4y2Ba
加载测量数据。gydF4y2Ba
负载(fullfile (matlabrootgydF4y2Ba“工具箱”gydF4y2Ba,gydF4y2Ba“识别”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba“iddemos”gydF4y2Ba,gydF4y2Ba“数据”gydF4y2Ba,gydF4y2Ba“pendulumdata”gydF4y2Ba));Data = 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
在这里,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 0];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
的调用中的输入参数gydF4y2BaidgreygydF4y2Ba
指定gydF4y2Balinear_modelgydF4y2Ba
作为一个连续时间系统。gydF4y2Ba
3.指定gydF4y2Ba米gydF4y2Ba
,gydF4y2BaggydF4y2Ba
,gydF4y2BalgydF4y2Ba
作为已知的参数。gydF4y2Ba
linear_model.Structure.Parameters(1)。自由=假;linear_model.Structure.Parameters(2)。自由=假;linear_model.Structure.Parameters(3)。自由=假;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
Linear_model = greyest(data, Linear_model,opt);gydF4y2Ba
的gydF4y2Ba感动的gydF4y2Ba
命令更新的参数gydF4y2Balinear_modelgydF4y2Ba
.gydF4y2Ba
b_est = linear_model.Structure.Parameters(4).Value;[linear_b_est,dlinear_b_est] = getpvec(线性模型,gydF4y2Ba“免费”gydF4y2Ba)gydF4y2Ba
线性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)作为状态变量,则运动方程可改写为一阶非线性微分方程:gydF4y2Ba
1.创建一个ODE文件,将模型系数与其非线性表示联系起来。gydF4y2Ba
函数gydF4y2Ba[dx,y] =非线性摆(t,x,u,m,g,l,b,varargin)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;非线性模型= idnlgreygydF4y2Ba“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 =非线性模型.参数(4).值;[nonlinear_b_est, dnonlinear_b_est] = getpvec(非线性模型,gydF4y2Ba“免费”gydF4y2Ba)gydF4y2Ba
非线性b_est = 0.1002非线性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
另请参阅gydF4y2Ba
idgreygydF4y2Ba
|gydF4y2BaidnlgreygydF4y2Ba
|gydF4y2Ba感动的gydF4y2Ba
|gydF4y2BanlgreyestgydF4y2Ba