• 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);

    结果如下:

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

     

    阶跃与冲击响应:

  • 相关阅读:
    2. Add Two Numbers
    8. String to Integer (atoi)
    18. 4Sum
    15. 3Sum
    1. Two Sum
    227. Basic Calculator
    7. Reverse Integer
    PostMessage和SendMessage的区别
    Date Time Picker控件
    git 设置和取消代理
  • 原文地址:https://www.cnblogs.com/tiandsp/p/16209806.html
Copyright © 2020-2023  润新知