加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Matlab 灰箱辨识

(2013-11-17 16:11:45)
标签:

idgrey

灰箱

系统辨识

结构化

greyest

分类: 信号处理
 转载自了凡春秋USTC https://chunqiu.blog.ustc.edu.cn/?p=337
 matlab系统辨识工具箱功能强大,可以实现灰箱辨识,下面是有关灰箱辨识的帮助翻译。
指定线性灰箱模型的结构
    利用系统辨识工具箱可以辨识任何常微分、差分方程的线性离散、连续灰箱模型。这些模型都需要以状态空间的格式给出。

 

    灰箱建模的第一步就是写出一个以用户自定义参数和模型信息为输入、返回各状态空间矩阵的函数。此函数的定义格式如下
[A,B,C,D] = myfunc(par1,par2,...,parN,Ts,aux1,aux2,...)
    par1,par2,...parN为模型的N个参数,每一个都可以是常数、向量或矩阵;Ts为采样周期;aux1,aux2,...是可选的额外参数,它包含了系统的辅助变量信息,你可以使用这些参数改变系统的参数,避免修改函数文件。
 
    对于连续时间模型
Matlab <wbr>灰箱辨识
矩阵A、B、C、D是由par1,par2,...parN参数化的矩阵。噪声矩阵K和初始状态向量x0不被myfunc参数化,但它们可以由模型参数来估计,要配置辨识K和x0,可以通过设置greyestOptions。
    离散时间模型如下,说明和上面一样
Matlab <wbr>灰箱辨识
    在一些应用中,可能也想像A、B、C一样参数化K和x0,这时可以如下编写myfunc函数
[A,B,C,D,K,x0] = myfunc(par1,par2,...,parN,Ts,aux1,aux2,...)
    在编写好myfunc函数后,就可以构建idgrey对象了,idgrey详细信息见其帮助。
 
创建函数表示灰箱模型
    这个例子展示了如何辨识如下的灰箱模型
Matlab <wbr>灰箱辨识
    这个方程在结构化状态空间辨识中讲过,意义如下:
    这个方程代表一个电机模型, \(y_1(t) = x_1(t)\) 是电机轴的角位置, \(y_2(t) = x_2(t)\)是角速度。参数 \(-\theta_1\) 是电机时间常数的逆, \(-\theta_2/\theta_1\) 是输入到角速度的静态增益。
    电机在 \(t = 0\) 时是静止的,但其角度位置 \(\theta_3\) 是未知的。假设位置参数的近似名义值为 \(\theta_1 = -1\) 、 \(\theta_2 = 0.25\) 、 \(\theta_3 = 0\) 
    辨识步骤如下:
    1.创建函数表示模型结构
function [A,B,C,D,K,x0] = myfunc(par,T)
A = [0 1; 0 par(1)];
B = [0;par(2)];
C = eye(2);
D = zeros(2,1);
K = zeros(2,2);
x0 =[par(3);0];
    2.定义idgrey模型对象
par = [-1; 0.25; 0];
aux = {};
T = 0;
m = idgrey('myfunc',par,'c',aux,T);
par是用户定义的参数向量,包含了它们的初始名义值。在这个例子中,所有标量参数集中在了par向量中,当然它们也可以作为myfunc的独立输入参数。'c'指定模型为连续时间。aux表示额外参数,由于这个例子中没有额外参数,所以设置为aux={}。T表示采样间隔,T=0表示是连续时间模型。
    有了上面的定义,下面就可以使用greyest来做灰箱参数辨识了
m_est = greyest(data,m)
 
辨识热扩散中的连续时间灰箱模型
    这个例子展示了如何辨识连续时间加热棒灰箱系统中的热熔和热传导系数
    这个系统包含一个长L的绝缘金属棒,其热扩散系数为 \(\kappa\) 。系统的输入为加热功率 \(u(t)\) ,测量输出为另一端的温度 \(y(t)\) 
    在理想条件下,这个系统可以用热扩散方程描述,即如下偏微分方程

\[\frac{\partial x(t,\xi)}{\partial t} = \kappa \frac{\partial^2x(t,\xi)}{\partial \xi^2}\]

    为得到一个连续时间的状态空间模型,可以把右侧的二阶偏导如下离散化近似

\[\frac{\partial^2x(t,\xi)}{\partial \xi^2} = \frac{x(t,\xi+\Delta L)-2x(t,\xi)+x(t,\xi-\Delta L)}{(\Delta L)^2} \\ where \quad \xi = k\cdot \Delta L\]

    这个变换产生一个 \(n=\frac{L}{\Delta L}\) 阶的状态空间模型,状态变量 \(x(t,k\cdot \Delta L)\) 是 \(x(t,\xi)\) 的如下范围的近似表示

\[k\cdot \Delta L \le \xi \le (k+1)\Delta L\]

\(x\) 的维数决定于空间近似划分的网格大小 \(\Delta L\) 
    在这个例子中,状态空间矩阵是由热扩散系数 \(\kappa\) 和热传导系数 \(h_{tf}\) 参数化的,表达式还决定于网格的大小 \(Ngrid\) 和棒的长度 \(L\) 。初始状态 \(x0\) 为初始室内温度的函数,在这个例子中作为已知量。
    辨识步骤如下:
    1.创建matlab文件
    下面的代码描述了这个模型的状态空间方程。参数为 \(\kappa\) 和 \(h_{tf}\) ,而辅助参数为 \(Ngrid,L\) ,初始室温为temp。网格的大小也作为一个辅助参数,方便调整网格大小。
function [A,B,C,D,K,x0] = heatd(kappa, htf, T, Ngrid, L, temp)
% ODE file parameterizing the heat diffusion model
 
% kappa (first parameter) - heat diffusion coefficient
% htf (second parameter) - heat transfer coefficient
                         at the far end of rod
 
% Auxiliary variables for computing state-space matrices:
% Ngrid: Number of points in the space-discretization
% L: Length of the rod
% temp: Initial room temperature (uniform)
 
% Compute space interval
deltaL = L/Ngrid;
 
% A matrix
A = zeros(Ngrid,Ngrid);
for kk = 2:Ngrid-1
  A(kk,kk-1) = 1;
  A(kk,kk) = -2;
  A(kk,kk+1) = 1;
end
 
% Boundary condition on insulated end
A(1,1) = -1; A(1,2) = 1;
A(Ngrid,Ngrid-1) = 1;
A(Ngrid,Ngrid) = -1;
A = A*kappa/deltaL/deltaL;
 
% B matrix
B = zeros(Ngrid,1);
B(Ngrid,1) = htf/deltaL;
 
% C matrix
C = zeros(1,Ngrid);
C(1,1) = 1;
 
% D matrix (fixed to zero)
D = 0;
 
% K matrix: fixed to zero
K = zeros(Ngrid,1);
 
% Initial states: fixed to room temperature
x0 = temp*ones(Ngrid,1);
    2.创建idgrey模型对象
m = idgrey('heatd', {0.27 1}, 'c', {10, 1, 22});
    3.辨识
me = greyest(data,m)
    下面的命令展示了如何利用辅助参数辨识新模型
m.Structure.ExtraArgs = {20,1,22};
me = greyest(data,m);

 

上面的语法使用ExtraArgs属性来指定更大更细的网格Ngrid。
 
辨识离散灰箱模型
    这个例子展示了当已知测量噪声方差时如何创建单输入单输出灰箱模型。这个例子中使用了控制系统工具箱的kalman函数由已知的和辨识的噪声方差来计算Kalman增益。
    这个例子基于如下离散单输入单输出系统
Matlab <wbr>灰箱辨识
这里w和e是相互独立的白噪声项,其协方差矩阵分别为R1和R2,R1 = E{ww‘}为2*2的矩阵,R2=E{ee'}为标量。par1,par2,par3和par4表示待估计的未知参数。
    假设测量噪声的方差已知为R2=1。R1(1,1)未知,作为额外的参数par5,R1的其他元素为0。
    辨识步骤如下:
    1.常见mynoise文件以5个未知的参数来计算状态空间矩阵,辅助变量表示已知的方差R2。初始条件假设为0。
function [A,B,C,D,K] = mynoise(par,T,aux)
R2 = aux(1); % Known measurement noise variance
A = [par(1) par(2);1 0];
B = [1;0];
C = [par(3) par(4)];
D = 0;
R1 = [par(5) 0;0 0];
[~,K] = kalman(ss(A,eye(2),C,0,T),R1,R2);  % Uses Control System Toolbox product u=[]
    2.指定未知参数和辅助参数R2的初始猜测值
par1 = 0.1; % Initial guess for A(1,1)
par2 = -2;  % Initial guess for A(1,2)
par3 = 1;   % Initial guess for C(1,1)
par4 = 3;   % Initial guess for C(1,2)
par5 = 0.2; % Initial guess for R1(1,1)
Pvec = [par1; par2; par3; par4; par5]
auxVal = 1; % R2=1
    3.创建idgrey模型
Minit = idgrey('mynoise',Pvec,'d',auxVal);
'd'表示离散时间系统。
    4.从数据估计模型参数
opt = greyestOptions;
opt.InitialState = 'zero';
opt.Display = 'full';
Model = greyest(data,Minit,opt)
data为以输入输出数据构造的iddata或idfrd对象。

 



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有