matlab练习程序(最小二乘系统参数估计)

1. 首先设定一个模型,可以用tf生成一个状态空间,不过我这里用的是反拉普拉斯变换得到的时域模型。

2. 随机生成一组控制量,然后卷积得到系统响应。

3. 利用待求参数过一下模型得到响应再和原始模型响应做个差值,设定为损失量。

4. 利用Matlab自带的非线性最小二乘函数lsqnonlin求解即可得到系统参数。

matlab代码如下:

clear;close all;clc;
% syms a b c d s
% G = d/(a*s^2+b*s+c);
% model = ilaplace(G);          %反拉普拉斯变换得到时域形式
model = @(a,b,c,d,t) (2*d*sin((t*(- b^2 + 4*a*c)^(1/2))/(2*a)).*exp(-(b*t)/(2*a)))/(- b^2 + 4*a*c)^(1/2);   %二阶模型的时域形式

a = 2;b = 3;c = 4;d = 1;
sys = tf(d,[a b c]);

h = 0.1;
t = 0:h:10;
u = rand(1,length(t));                              %控制量

%  y = lsim(sys,u,t);
Yt = model(a,b,c,d,t);
y = conv(u,Yt) * h;                                 %卷积生成响应
y = y(1:length(t));

plot(t,y,'b');
hold on;

par = rand(4,1);
options.Algorithm = 'levenberg-marquardt';
f = @(par) func(par,t,u,h,y);
lb = [];ub = [];
[par,res]= lsqnonlin(f,par,lb,ub,options);          %优化

a = par(1);b = par(2);c = par(3);d = par(4);
Yt = model(a,b,c,d,t);
Y = conv(u,Yt) * h;
plot(t,Y(1:length(t)),'r.');
legend('原始模型响应','识别模型响应')

function loss = func(par,t,u,h,y)
a = par(1);b = par(2);c = par(3);d = par(4);

%time domain model
Yt = (2*d*sin((t*(- b^2 + 4*a*c)^(1/2))/(2*a)).*exp(-(b*t)/(2*a)))/(- b^2 + 4*a*c)^(1/2);
Y = conv(u,Yt) * h;
loss = Y(1:length(t)) - y;

%laplace model
% sys = tf(d,[a b c]);
% Y = lsim(sys,u,t);
% loss = Y - y;
end

结果如下:

posted @ 2022-05-15 21:40  Dsp Tian  阅读(1302)  评论(0编辑  收藏  举报