matlab练习程序(离散系统辨识与响应)

上一篇熟悉了连续系统辨识与响应,这一篇熟悉一下离散系统辨识与响应。

计算机通常处理的系统为离散系统,这里我们先将连续系统转换为离散系统,然后再进行处理。

流程上还是先构造离散系统并根据控制量得到响应,然后用子空间迭代算法(以后会单独实现一次)求出状态空间。

再用识别得到的状态空间和原始控制量生成新的响应,并比较结果。

最后再比较一下阶跃和冲击响应。

matlab代码如下:

clear all;close all;clc;

load dryer2
warning off;

A = [-1.5,-2;1,0];
B = [0.5;0];
C = [0,1];
D = 0;
sys = ss(A,B,C,D);              %状态方程
sysd = c2d(sys,1);              %转为离散
sysd_tf = tf(sysd);             %传递函数

u = u2(1:100);                  %控制量
x = [0;0];                      %系统初始状态
for i = 1:100
    x(:,i+1) = sysd.A * x(:,i) + sysd.B * u(i);
    y(i) = sysd.C*x(:,i) + sysd.D*u(i);
end
plot(y,'r-*');

%%%%%%%%%%%%%%%%%%%%%%%%离散系统辨识%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
idata = iddata(y',u);            %构造辨识结构体
idsys = n4sid(idata);            %系统辨识得到状态方程(离散)
idsys_tf = idtf(idsys);

x = [0;0];                       %系统初始状态
for i = 1:100
    x(:,i+1) = idsys.A * x(:,i) + idsys.B * u(i);
    y(i) = idsys.C*x(:,i) + idsys.D*u(i);
end
hold on;
plot(y,'go')

%%%%%%%%%%%%%%%%%%%%%%%%离散系统状态空间转传递函数%%%%%%%%%%%%%%%%%%%%%%%%%%
syms z;
Gz = sysd.C*inv(z*eye(2) - sysd.A)*sysd.B+sysd.D;
digits(5)

GGz= vpa(Gz);
GGz = simplify(GGz);

%三种方法求出的传递函数
sysd_tf
idsys_tf
GGz

%%%%%%%%%%%%%%%%%%%%%%%%离散系统阶跃响应%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x = [0;0];                      %系统初始状态
u = ones(20,1);
y = zeros(20,1);
for i = 1:20
    x(:,i+1) = idsys.A * x(:,i) + idsys.B*u(i);
    y(i) = idsys.C*x(:,i) + idsys.D*u(i);
end
figure;

subplot(2,2,1);
stairs((1:20)-1,y);
subplot(2,2,2);
[r,t] = step(idsys);
stairs(t,r);

%%%%%%%%%%%%%%%%%%%%%%%%离散系统冲击响应%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x = [0;0];                      
u = zeros(20,1);
y = zeros(20,1);
u(1) = 1;
for i = 1:20
    x(:,i+1) = idsys.A * x(:,i) + idsys.B*u(i);
    y(i) = idsys.C*x(:,i) + idsys.D*u(i);
end
subplot(2,2,3);
stem((1:20)-1,y);
subplot(2,2,4);
[r,t] = impulse(idsys);
stem(t,r);

结果如下:

用原控制量与辨识结果生成响应:

 

阶跃与冲击响应:

posted @ 2022-04-30 11:47  Dsp Tian  阅读(847)  评论(0编辑  收藏  举报