目录
1.基本思想
根据实际系统采集到的数据,对模型进行建模,包括确定系统模型的模型结构,利用最小二乘法或其他最优化算法(极大似然估计、最速梯度下降等)进行模型结构中的模型参数进行求解。最后通过校验数据,进行模型验证,进而实现系统辨识。
2.具体步骤
2.1 采集时域数据
时域数据分为两个部分,模型辨识数据及模型验证数据。
本文利用阶跃法进行数据采集,采样频率fs为1kHz,则采样周期为Ts=1/fs。
利用不同的阶跃,收集两组不同的数据,或将一组数据分成两部分处理均可。
2.2 确认需要辨识的模型结构
一、模型阶次选取:MATLAB通过估计一个状态空间模型,来选取模型阶次,一般选择较低阶次模型;实际中常用的模型为一阶二阶模型,因此也可通过绘制数据波形,查看阶跃过程中是否存在超调,若存在超调,则可先进行二阶模型仿真,若不存在超调,则直接使用一阶模型。
MATLAB函数具体为:
sys = ssest(tt,nx);
Estimate state-space model using time-domain or frequency-domain data - MATLAB ssest
二、是否存在时滞:MATLAB函数可直接计算,也可以直接通过观察,看是否需要时滞表征系统结构模型。
其中MATLAB函数具体为:
delayest(data);
Estimate time delay (dead time) from data - MATLAB delayest - MathWorks 中国
2.3 根据特定系统模型结构,辨识模型系数
使用MATLAB函数进行模型辨识:
1.使用tfest()进行传递函数模型辨识
sysTF = tfest(data,2,0,delay_time);
2.使用ssest()进行状态空间模型辨识
Gss = ssest(data_offest,1:10);
s = tf('s');
sysTF1 = tf(Gss)*exp(-delay_time*s);
2.4 模型验证
1.系统模型符合度
指标:符合度在80%以上,均可认为是好的系统辨识结果;若是80%一下,需要在系统模型中,加入扰动模型,以此来判断系统模型是否合理。
2.根据对扰动模型的建模,判断系统模型是否缺少关键的模型状态
通过查看系统残差与输入的互相关性来确认偏差与扰动有关,还是与输入有关。
若残差与输入的胡相关性为0,则证明系统模型正确,不必再提升阶次,否则将引起过度拟合,使系统响应变慢。
2.5 MATLAB代码实现
clear all;
close all;
fs = 1000;%采样频率
Ts = 1/fs;%采样周期
%采集数据,绘图
load('C:\Users\ykk\Desktop\idtest\idtest_data.mat');%需要更换你本地数据地址
input1 = idtestdata(2:end,2);%用来估计模型的测量数据,通过一系列阶跃进行收集
output1 = idtestdata(2:end,1);
data = iddata(output1,input1,Ts);
data.InputName = '设定转速';
data.InputUnit = 'rpm';
data.OutputName = '实时转速';
data.OutputUnit = 'rpm';
data.TimeUnit = 'seconds';
plot(data);
set(findall(gca,'Type','Line'),'LineWidth',2);
grid on;
%采集验证数据,并绘图
input2 = idtestvalidata(2:end,2);%一系列阶跃进行数据采集,用于模型验证
output2 = idtestvalidata(2:end,1);
validata = iddata(output2,input2,Ts);
validata.InputName = '设定转速';
validata.InputUnit = 'rpm';
validata.OutputName = '实时转速';
validata.OutputUnit = 'rpm';
validata.TimeUnit = 'seconds';
plot(validata);
set(findall(gca,'Type','Line'),'LineWidth',2);
grid on;
Identified transfer function with delay model
%延时和线性部分分离 Estimate the delay term
delay_samples = delayest(data,2,2,0,1000);
delay_time = delay_samples*Ts
sysTF = tfest(data,2,0,delay_time)
Identify a state space model
%remove delay from output
datareal_no_delay = output1(delay_samples+1:end);
%repackage offest data
data_offest = iddata(datareal_no_delay,input1(1:end-delay_samples),Ts);
%Fit data to a state space model of unknow order
Gss = ssest(data_offest,1:10);
%Convert to tf and add in the delay term
s = tf('s');
sysTF1 = tf(Gss)*exp(-delay_time*s)
Validata model
%check the training data
opt = compareOptions;
opt.InitialCondition = 'z';%;零初始条件
compare(data,sysTF,opt)
set(findall(gca,'Type','Line'),'LineWidth',2);
%check the validation data
opt = compareOptions;
opt.InitialCondition = 'z';%;零初始条件
compare(validata,sysTF,opt);
%假设未建模的响应来自于一些随机噪声或者随机干扰过程,如果单纯提高模型的阶次,有可能会出现过度拟
%合的情况,因此需要确认时随机干扰造成的误差,还是模型结构造成的误差。
%可以将干扰路径模拟成高斯白噪声,但从根本上说,它是在以一种随机的方式改变的,它可以被建模为过滤
%后的白噪声。
%因此,我们可以同时对系统的基本动态和干扰因素进行建模。
Whiteess and Correlation tests
%使用模型验证技术查看这些误差本质上是随机的,还是在某种程度上是相关的。
resid(sysTF,data);
%预测残差的白色化程度,以及残差与输入的相关性。
Try a new model structure :Process Model Estimation with 2ed order disturbance
%二阶包含扰动模型:
sysInit = idproc('P2DU','TimeUnit','seconds');
sysInit.Structure.Kp.Value = 1;
sysInit.Structure.Kp.Minimum = 0;
sysInit.Structure.Kp.Maximum = 5;
sysInit.Structure.Tw.Minimum = 0;
sysInit.Structure.Tw.Maximum = 1;
sysInit.Structure.Zeta.Minimum = 0.01;
sysInit.Structure.Zeta.Maximum = 0.9;
sysInit.Structure.Td.Minimum = 0;
sysInit.Structure.Td.Maximum = 1;
opt = procestOptions('DisturbanceModel','estimate');%此处选用默认
sysP2DU = procest(data,sysInit,opt)
Validata model
resid(sysP2DU,data);
%残差与输入之间互相关性基本为零,因此说,模型的误差与系统模型关系无关,而与干扰模型有关。
%数据只是收到随机干扰的影响。通过考虑扰动路径,使系统模型更有可信度。
%check the training data
opt = compareOptions;
opt.InitialCondition = 'z';
compare(data,sysP2DU,opt)
set(findall(gca,'Type','Line'),'lineWidth',2);
grid on;
%check the validation data
opt = compareOptions;
opt.InitialCondition = 'z';
compare(validata,sysP2DU,opt)
set(findall(gca,'Type','Line'),'lineWidth',2);
grid on;
%对比上述无干扰模型的阶跃响应
step(sysP2DU,sysTF);
legend('sysP2DU','sysTF');
set(findall(gca,'Type','Line'),'lineWidth',2);
grid on;
%估计扰动的作用:1.扰动通常对系数动态估计有较大的影响,通过考虑干扰,可以提高整体模型的拟合。
%2.验证模型。
3.直接使用系统辨识工具箱
可以直接参考此博主笔记,非常详细。