标签:
identn4sidssest系统辨识状态空间 |
分类: 信号处理 |
转载自了凡春秋USTC
https://chunqiu.blog.ustc.edu.cn/?p=334
命令行辨识状态空间模型
构造iddata对象(输入输出数据对象)或frd、idfrd对象(频率响应数据对象);
数据预处理,如对时域数据做去趋势;
选择阶次。
黑箱辨识:
结构化辨识:
m = ssest(data,n,opt,Name,Value)
其中,data为估计的数据,n为系统阶次,opt包含了状态空间估计的配置参数,包括初始条件、输入偏移、估计中心、搜索方法等,其详细配置见ssest函数。
m = n4sid(data,n,opt,Name,Value)
除非指定采样时间,ssest默认辨识连续时间模型;而n4sid辨识离散模型。
model = ssest(data,nx,'Ts',data.Ts);
如果使用的是连续时间频域数据,则不能辨识离散模型。
model = n4sid(data,nx,'Ts',0);
\(D\) :
model = n4sid(data,n,'Feedthrough',[false true]);.
init_sys.Structure.d.Value(:,i) = 0;
init_sys.Structure.d.Free = true;
init_sys.Structure.d.Free(:,i) = false;
第一行指定矩阵 \(D\) 的第 \(i\) 列的值为0;第二行指定 \(D\) 矩阵的所有元素都是自由的,需辨识的;第三行指定 \(D\) 的第 \(i\) 列的值在辨识中是固定不变的。
\(K\) :
\[\dot x = Ax + Ke \\ y_n = Cx + e\]
对于频域数据,无噪声模型辨识, \(K\) 被设置为0。对于时域数据, \(K\) 默认以黑箱的设置辨识。
model = n4sid(data,n,'DisturbanceModel','none')
kpar = init_sys.Structure.k;
kpar.Free(:,1) = true;
kpar.Free(:,2) = false;
kpar.Value(:,2) = 0; % 第二列的值固定为0
init_sys.Structure.k = kpar;
init_sys = ssest(data, n,'DisturbanceModel','none');
init_sys.Structure.k.Free = true;
sys = ssest(data, init_sys);
init_sys为无噪声的动态模型。
m.Structure.k.Value = 0;
m.Structure.k.Free = false;
\(X0\) :
opt = n4sidOptions;
opt.InitialState = 'zero';
[m,X0] = n4sid(data,n,opt);
返回的 \(X0\) 为长度为 \(n\) 的零向量。
opt = ssestOptions('InitialState','estimate');
m = ssest(data, 4, opt)
辨识自由参数状态空间模型
m = ssest(data)
此语句辨识1到10阶的连续状态空间模型。
m = ssest(data,n)
m = n4sid(data,n)
辨识标准型状态空间模型
伴随型:特征多项式的系数出现在 \(A\) 矩阵的最右列;
模型分解型: \(A\) 矩阵是块对角线的形式;
可观标准型:自由参数只出现在 \(A\) 的一些行。
m = ssest(data, n, 'Form', 'canonical')
上面语句默认辨识连续时间模型,辨识离散模型使用如下语句
md = ssest(data, n, 'Form', 'canonical', 'Ts', data.Ts)
辨识结构参数状态空间模型
1.使用idss命令指定状态空间矩阵的结构和辨识参数的初始值;
2.使用ssest辨识未知参数。
要在GUI中实现结构化辨识,需要先在命令行中创建模型结构,然后倒入到GUI中辨识。
m = idss(A,B,C,D,K,'Ts',T)
A,B,C,D,K指定矩阵初始值,T指定采样间隔。
m = idss(A,B,C,D,K,'Ts',0)
Value:参数值;
Minimum:辨识过程中参数的最小值;
Maximum:辨识过程中参数的最大值;
Free:布尔值,指定此参数是否要辨识。true为需要辨识,false表示固定为Value中值;
Scale:参数值的比例,它不在辨识中使用;
Info:保存参数的单位和标签信息,它是一个包含Lable和Unit的结构。
A = [2 0; 0 3]
如果你想固定A(1,2) = A(2,1)=0,则使用如下语句
m.Structure.a.Value(1,2) = 0;
m.Structure.a.Value(2,1) = 0;
m.Structure.a.Free(1,2) = false;
m.Structure.a.Free(2,1) = false;
辨识结构化离散时间状态空间模型的例子
假设未知参数 \((\theta_1,\theta_2,\theta_3,\theta_4,\theta_5)\) 的名义值为-1,2,3,4,5。
A = [1,-1;0,1];
B = [2;3];
C = [1,0];
D = 0;
K = [4;5];
m = idss(A,B,C,D,K);
S = m.Structure;
S.a.Free(1,1) = false;
S.a.Free(2,:) = false;
S.c.Free = false;
m.Structure = S;
如果想固定初始状态为已知的0值,可以在InitialState选项中设置
opt = ssestOptions;
opt.InitialState = 'zero';
m = ssest(data, m, opt)
data为包含时域数据或频域数据的iddata对象。迭代搜索以各系统矩阵的名义值开始搜索。
辨识结构化连续时间状态空间模型的例子
A = [0 1;0 -1];
B = [0;0.25];
C = eye(2);
D = [0;0];
K = zeros(2,2);
x0 = [0;0];
m = idss(A,B,C,D,K,'Ts',0);
S = m.Structure;
S.a.Free(1,:) = false;
S.a.Free(2,1) = false;
S.b.Free(1) = false;
S.c.Free = false;
S.d.Free = false;
S.k.Free = false;
m.Structure = S;
m.NoiseVariance = [0.01 0; 0 0.1];
opt = ssestOptions;
opt.InitialState = idpar(x0);
opt.InitialState.Free(2) = false;
m = ssest(data, m, opt)
其中data是包含时域或频域数据的iddata对象。这个例子中可以使用dcmotordata.mat中的数据,它在matlabroot/toolbox/ident/iddemos/data/下。
e = randn(300,2);
u = idinput(300);
simdat = iddata([],u,'Ts',0.1);
simopt = simOptions('AddNoise', true, 'NoiseData', e)
y = sim(m,simdat,simopt)
通过辨识状态空间模型来得到等价的ARMAX和OE模型
load iddata1 z1
mss_noK = n4sid(z1, 2,'DisturbanceModel','none');
mss = n4sid(z1,2);
mss_noK是二阶无干扰模型的状态空间模型,mss是有噪声成分的二阶状态空间模型。两者都使用z1数据来辨识。
mOE = idpoly(mss_noK);
mARMAX = idpoly(mss);
上面的转化将是参数方差信息丢失。你可以重新计算方差:使用相同的估计数据做零迭代更新;使用translatecov做高斯估计公式。
opt = polyestOptions;
opt.SearchOption.MaxIter = 0;
mOE = polyest(z1,mOE);
mARMAX = polyest(z1,mARMAX);
使用零迭代的方法,模型参数保持不变,只有方差信息得到更新。
fcn = @(x)idpoly(x);
mOE = translatecov(fcn, mss_noK)
mARMAX = translatecov(fcn, mss)
present(mOE)
present(mARMAX)
前一篇:Matlab做状态空间辨识1
后一篇:Matlab 灰箱辨识