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
结果如下: