以简单的单摆模型为例,进行灰箱辨识。
1.单摆模型
图1 单摆的切线受力图
单摆切线受力图如图1所示,图片来源于网络。
可简单写出切线方向运动方程
式中表示单摆长度,
代表摆球质量,
为重力加速度,
表示单摆与固定点垂直轴间的夹角,假定存在一个阻碍运动的摩擦阻力,其阻力大小与速度成正比,摩擦系数为
。
取状态变量,
,并考虑单摆的力矩
,将力矩看成单摆系统的控制输入,写成状态空间方程形式如下,
2.Matlab辨识函数的用法
此处主要参考matlab官方帮助文档,
2.1 nlgreyest函数的用法:
函数形式
sys= nlgreyest(data,init_sys)
sys= nlgreyest(data,init_sys,options)
描述
sys= nlgreyest(data,init_sys) 利用时域数据(data)估计非线性系统(init_sys)参数;若有额外的估计要求则可以选填(options)选项。
其中非线性系统init_sys的模型需要依靠idnlgrey函数建立。
2.2 idnlgrey函数的用法
函数形式
sys = idnlgrey(FileName,Order,Parameters)
sys = idnlgrey(FileName,Order,Parameters,InitialStates)
sys = idnlgrey(FileName,Order,Parameters,InitialStates,Ts)
sys = idnlgrey(FileName,Order,Parameters,InitialStates,Ts,Name,Value)
描述
idnlgrey函数根据描述的结构、输入输出的数目、阶数、参数、初始状态等创建灰箱模型。
系统的输入输出数据data需要利用iddata函数建立
函数形式
data = iddata(y,u,Ts)
描述
iddata根据时域输出信号y,时域输入信号u,采样时间Ts创建iddata数据对象。
下面直接上手试一下,更为直观。
3.灰箱模型的辨识过程
3.1 系统仿真数据
调用simulink中设置好的模型,进行仿真实验。
%%
%系统仿真及参数设定
% Pendulum model
% Gravity
g = 9.81; % [m/s^2]
% Pendulum mass
m = 1; % [kg]
% Pendulum length
l = 0.5; % [m]
zn=0.1;%阻尼系数
% Measurement noise covariance
R = 1e-2;
% Sampling time
Ts2 = 0.01; % [s]
out=sim('pendulum_line');
3.2 定义单摆的模型函数
按照系统模型定义输出方程与状态方程,系统模型参数用a1、a2、a3替代
function [dx,y]=pendulum(t,x,u,a1,a2,a3,varargin)
y=x(1);%输出方程
dx=[x(2);
a1*sin(x(1))+a2*x(2)+a3*u];%状态方程
end
3.3 进行灰箱模型的定义
%利用idnlgrey函数进行系统灰箱模型定义
FileName='pendulum';
Order=[1 1 2];%分别表示输入阶数1、输出阶数1、状态阶数2
Parameters=[-10;-1;1/m*l^2];%初始参数
InitialStates=[pi/2;0];%初始状态
Ts=0;%采样时间,0对应于连续系统
Sys=idnlgrey(FileName,Order,Parameters,InitialStates,Ts,...
'Name','S_Model',...
'InputName',{'T'},...
'OutputName',{'theta'});
Sys=setpar(Sys,'Name',{'a1';'a2';'a3'});%把模型的参数名字设定一下
Sys.Parameters(3).Fixed = true;%假设m和l已知,所以此参数固定
3.4 系统参数辨识
%%
%系统参数辨识
%1.读取数据
data=[out.simin.signals.values,out.simout.signals.values];
Z=data(:,2);%系统输出
N=length(Z);%数据长度
u=data(:,1);%系统输入
data2=iddata(Z,u,Ts2);
%2.灰箱模型辨识
Sys=nlgreyest(data2,Sys,nlgreyestOptions('Display','on'));
figure;
compare(data2,Sys);%辨识结果对比
3.5 辨识结果
图2 辨识结果与输入数据对比
图3 辨识值与真实值对比
可见辨识准确度还是可以的,关系参数辨识工具箱的使用目前里面还有很多不太了解的地方,后续再继续进行尝试更新。