• 基于扰动观测器的控制系统LMI控制


    线性矩阵不等式LMI是控制领域的一个强有力的设计工具,许多控制理论及分析与综合问题都可简化为相应的LMI问题,通过构造有限的计算机算法求解,Lyapunov方程、Schur补引理以及交叉项放大在非线性矩阵不等式与LMI的转化过程中起着极为重要的作用。本章是对基于扰动观测器的控制系统进行仿真,使用YALMIP工具箱求解LMI,用simulink的S函数编写控制器和受控对象的程序,结合MATLAB画图函数plot实现系统的仿真。。。

    附有 YALMIP下载网址

    1 系统描述

    在这里插入图片描述

    2 控制器的设计与分析

    在这里插入图片描述

    3 仿真实例

    以下仿真程序都是用MATLAB来编写的

    3.1 LMI不等式求K程序 K_LMI.m

    clear all
    clc
    J = 1/133;  b = 25/133;
    A = [0 1; 0 -b/J];
    B = [0 1/J]';
    P1 = sdpvar(2,2,'symmetric');
    Q1 = sdpvar(2,2,'symmetric');
    K1 = sdpvar(1,2);
    R1 = sdpvar(1,2);
    alfa = 100;
    sigma1 = 10;
    Fai = [A * Q1 + B * R1 + (A * Q1 + B * R1)' + alfa * Q1 B; B' -(K1*B + B' * K1') + sigma1 + alfa];
    L = [Fai < 0, Q1 > 0];
    solvesdp(L)
    K1 = double(K1);
    Q1 = double(Q1);
    R1 = double(R1);
    P1 = inv(Q1);
    K = R1 * P1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.2 Simulink主程序 sim.mdl

    在这里插入图片描述

    3.3 被控对象S函数 plant.m

    function [sys,x0,str,ts] = plant(t,x,u,flag)
    switch flag
        case 0
            [sys,x0,str,ts]=mdlInitializeSizes;
        case 1
            sys=mdlDerivatives(t,x,u);   % dx
        case 3
            sys=mdlOutputs(t,x,u);      % y
        case {2,4,9}
            sys = [];
        otherwise
            error(['Unhandled falg = ',num2str(flag)])
    end
    function [sys,x0,str,ts]=mdlInitializeSizes
    sizes = simsizes;
    sizes.NumContStates  = 2;
    sizes.NumDiscStates  = 0;
    sizes.NumOutputs     = 3;
    sizes.NumInputs      = 2;
    sizes.DirFeedthrough = 0;
    sizes.NumSampleTimes = 0;   % at least one sample time is needed
    sys = simsizes(sizes);
    x0  = [1 0];
    str = [];
    ts  = [];
    function sys=mdlDerivatives(t,x,u)
    A = [0 1 ; 0 -25];
    B = [0 133]';
    ut = u(1);
    dt = 5 * sin(0.1* t);
    dx = A * x + B * (ut + dt);
    sys(1) = dx(1);
    sys(2) = dx(2);
    function sys=mdlOutputs(t,x,u)
    dt = 5 * sin(0.1* t);
    sys(1) = x(1);
    sys(2) = x(2);
    sys(3) = dt;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    3.4 控制器S函数 ctrl.m

    function [sys,x0,str,ts] = ctrl(t,x,u,flag)
    switch flag
        case 0
            [sys,x0,str,ts]=mdlInitializeSizes;
        case 1
            sys=mdlDerivatives(t,x,u);   % dx
        case 3
            sys=mdlOutputs(t,x,u);      % y
        case {2,4,9}
            sys = [];
        otherwise
            error(['Unhandled falg = ',num2str(flag)])
    end
    function [sys,x0,str,ts]=mdlInitializeSizes
    sizes = simsizes;
    sizes.NumContStates  = 1;
    sizes.NumDiscStates  = 0;
    sizes.NumOutputs     = 2;
    sizes.NumInputs      = 3;
    sizes.DirFeedthrough =1;
    sizes.NumSampleTimes = 1;   % at least one sample time is needed
    sys = simsizes(sizes);
    x0  = [0];
    str = [];
    ts  = [0 0];
    function sys=mdlDerivatives(t,x,u)
    x1 = u(1);
    x2 = u(2);
    X = [x1 x2]';
    K = [ -55.6261 -0.7457];
    A = [0 1 ; 0 -25];
    B = [0 133]';
    z = x(1);
    K1 = [0 2.7568];
    dp = z + K1 * X;
    ut = K * X - dp;
    sys(1) = -K1 * (A * X + B * (ut + dp));
    function sys=mdlOutputs(t,x,u)
    x1 = u(1);
    x2 = u(2);
    X = [x1 x2]';
    K1 = [0 2.7568];
    K = [ -55.6261 -0.7457];
    z = x(1);
    dp = z + K1 * X;
    ut = K * X -dp;
    sys(1) = ut;
    sys(2) = dp;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    3.5 作图程序 Simu_Plot.m

    figure(1)
    subplot(2,1,1)
    plot(t,x(:,1),'r','linewidth',2)
    xlabel('time(s)')
    ylabel('x1 response')
    subplot(2,1,2)
    plot(t,x(:,2),'b','linewidth',2)
    xlabel('time(s)')
    ylabel('x2 response')
    figure(2)
    plot(t,ut(:,1),'r','linewidth',2)
    xlabel('time(s)')
    ylabel('ut')
    figure(3)
    plot(t,ut(:,2),'r',t,x(:,3),'k','linewidth',2)
    xlabel('time(s)')
    ylabel('d,dp')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4 仿真图

    figure(1)
    在这里插入图片描述
    figure(2)
    在这里插入图片描述
    figure(3)
    在这里插入图片描述

    5 问题解决

    出现“ matlab plot方法只能用于单时序对象 ”怎么解决?
    需要修改simulink中的to workspace
    (1)save format 改为array
    (2)save 2-D signals as 改为Inherit from input (this choice will be removed - see release notes)

    双击to workspace修改如下:
    在这里插入图片描述

  • 相关阅读:
    iTOP-RK3588开发板体验RKNN_DEMO
    R语言使用epiDisplay包的dotplot函数通过点图的形式可视化不同区间数据点的频率、使用pch参数自定义指定点图数据点的形状
    【STM32教程】第二章 通用输入输出口GPIO
    Flask 使用 JWT(一)
    Java 工具库Hutool
    ADworld reverse wp easyre-153
    五、K8S之Service
    JAVA JSP javaweb小区物业管理系统源码 小区管理系统 jsp小区物业服务管理系统
    GenICam GenTL 标准 ver1.5(3)第四章
    谣言检测论文精读——3.Detect Rumor and Stance Jointly by Neural Multi-task Learning
  • 原文地址:https://blog.csdn.net/weixin_43497769/article/details/126270247