zoukankan      html  css  js  c++  java
  • H Infinity contrl ---LMI方法(Yalmip 求解)和Riccati 方法

    H Infinity contrl ---LMI方法(Yalmip 求解)和Riccati 方法

    参考书籍:Yu, Hai-Hua_ Duan, Guangren - LMIs in control systems _ analysis, design and applications (2013, CRC Press) - libgen.lc(一书的附录有详细介绍LMI的编写方式-有很多例子)

    参考网站:http://www.doc88.com/p-8718494012962.html

                         YALMIP

                        Download - YALMIP

    有问题可以上google论坛--在matlab 问答模块可以搜到网址--可以提问相关问题,

     关于LMI 本身求解参考:

    线性矩阵不等式(LMI)的_MATLAB求解-    http://www.doc88.com/p-7874379836838.html

    Matlab中LMI(线性矩阵不等式)工具箱使用教程        https://www.doc88.com/p-304944065894.html

    线性矩阵不等式的LMI工具箱求解-LMI三个函数的应用实例;

     https://www.doc88.com/p-3925042294217.html

    https://www.doc88.com/p-660150804881.html

    https://blog.csdn.net/qq_28093585/article/details/69358180

    ceshi_Hinf_lmi

    clc;clear; close all;
    A  = [2 1 -2;1 -1 -3; 4 0 -1];
    B = [1 0;0 3;3 1];
    E1 = [1 0.2 -0.5]';
    C = [2 1 -0.5];
    D = [1 1];
    E2 = [0.05]
    
    P = 10e+7;
    X0 = [8.7047 -6.5321 4.2500;
         -6.5321 8.8601 -4.2821;
         4.2500 -4.2821 5.0227];
    W0 = [-5.2786 2.9364 -7.7991;
          -3.4736 -0.8733 6.0925];
    W =P*W0; X = X0*P;
    K1 =W*inv(X)
    
    Ac =A-B*K1;
    Bc = B;
    Cc = C;
    Dc = D;
    sys_cl = ss(Ac,Bc,Cc,Dc);
    step(sys_cl)
    % figure(1)
    % t = 0:0.01:15;
    % r =[0.5*ones(size(t));
    %     0.5*ones(size(t))];
    % [y,t,x]=lsim(sys_cl,r,t);
    % plot(t,y)
    % 
    % 
    % K2 = [1.2850 0.5978 -2.0283;
    %      -1.4101 -0.7807 1.4861]
    % Ac =A-B*K2;
    % Bc = B;
    % Cc = C;
    % Dc = D;
    % sys_cl = ss(Ac,Bc,Cc,Dc);
    % 
    % figure(2)
    % t = 0:0.01:15;
    % r =[0.5*ones(size(t));
    %     0.5*ones(size(t))];
    % [y,t,x]=lsim(sys_cl,r,t);
    % plot(t,y)
    View Code
    %连续H2 optimal control 
    clc;clear;close all;
    
    %% 书籍:LMIs in control systems _ analysis, design and applications中428页中例题的结果--
    % 连续H2 state feedback control
    % Step 1. Describe this LMIs in MATLAB  网址:http://www.doc88.com/p-8718494012962.html
    %{
    % Step 1. Describe this LMIs in MATLAB
    % specify parameter matrices
    A = [-3 -2 1;1 2 1;1 -1 -1]; B1 = [1; 0; 1];
    B2 = [2 0;0 2;0 1]; C = [1 0 1;0 1 0]; D = eye(2);
    % define the LMI system
    setlmis ([]) % initialing
    % declare the LMI variable
    X = lmivar(1, [3 1]); W = lmivar(2,[2,3]);
    Z = lmivar(1, [2 1]); rou = lmivar(1, [1 1]);
    % #1 LMI, left-hand side
    lmiterm ( [1 1 1 X],A, 1, 's');
    lmiterm ( [1 1 1 W],B2, 1, 's');
    lmiterm ( [1 1 1 0],B1*B1');
    % #2 LMI, left-hand side
    lmiterm ( [2 1 1 Z],1,-1); % the (1,1) block
    lmiterm ( [2 1 2 W],D,1); % the (1,2) block
    lmiterm ( [2 1 2 X],C,1); % the (1,2) block
    lmiterm ( [2 2 2 X],1,-1); % the (2,2) block
    % #3 LMI, left-hand side
    lmiterm ( [3 1 1 Z],[1 0],[1 0]');
    lmiterm ( [3 1 1 Z],[0 1],[0 1]');
    % #3 LMI, right-hand side
    lmiterm ( [3 1 1 rou],1,-1);
    lmisys=getlmis; % finishing description
    % Step 2. Solve this LMI problem and use dec2mat to get the
    % corresponding matrix X
    % c = mat2dec(lmisys,0,0,ones(2)); % obtain vector c
    n=decnbr(lmisys);%获取LMI中决策变量的个数
    c=zeros(n,1);
    % for jj=1:n
    %     [Zj]=defcx(lmisys,jj,Z);
    %     c(jj)=trace(Zj)
    % end
    for jj=1:n
        [pj]=defcx(lmisys,jj,rou);
        c(jj)=(pj);
    end
    options=[1e-5 0 0 0 1];
    %[copt,xopt] = mincx(lmisys,c);
    [copt,xopt] = mincx(lmisys,c,options); % solve the optimization problem
    X = dec2mat(lmisys,xopt,1); % extract matrix X
    W = dec2mat(lmisys,xopt,2); % extract matrix W
    Z = dec2mat(lmisys,xopt,3); % extract matrix Z
    K = W*inv(X); % get the feedback gain
    %}
    %注:求出的结果为:[-1.00000000000000,5.44822811876415e-18,-1.00000000000000;
    %               1.75680133525483e-16,-1.00000000000000,-7.35314080057690e-18]
    % 书中的结果是[-1 0 -1;0 -1 0]
    
    %%
    %{
    %% 书籍:LMIs in control systems _ analysis, design and applications中259页中例题的结果
    % Step 1. Describe this LMIs in MATLAB  网址:http://www.doc88.com/p-8718494012962.html
    % specify parameter matrices
    A = [-3 -2 1;1 2 1;1 -1 -1]; B1 = [3; 0; 1];%干扰矩阵
    B2 = [2 0;0 2;0 1]; %控制矩阵
    C = [1 0 1;0 1 1]; D = [1 1;0 1];
    % define the LMI system
    setlmis ([]) % initialing
    % declare the LMI variable
    X = lmivar(1, [3 1]); W = lmivar(2,[2,3]);
    Z = lmivar(1, [2 1]); rou = lmivar(1, [1 1]);
    % #1 LMI, left-hand side
    lmiterm ( [1 1 1 X],A, 1, 's');
    lmiterm ( [1 1 1 W],B2, 1, 's');
    lmiterm ( [1 1 1 0],B1*B1');
    % #2 LMI, left-hand side
    lmiterm ( [2 1 1 Z],1,-1); % the (1,1) block
    lmiterm ( [2 1 2 W],D,1); % the (1,2) block
    lmiterm ( [2 1 2 X],C,1); % the (1,2) block
    lmiterm ( [2 2 2 X],1,-1); % the (2,2) block
    % #3 LMI, left-hand side
    lmiterm ( [3 1 1 Z],[1 0],[1 0]');
    lmiterm ( [3 1 1 Z],[0 1],[0 1]');
    % #3 LMI, right-hand side
    lmiterm ( [3 1 1 rou],1,-1);
    lmisys=getlmis; % finishing description
    % Step 2. Solve this LMI problem and use dec2mat to get the
    % corresponding matrix X
    % c = mat2dec(lmisys,0,0,ones(2)); % obtain vector c
    n=decnbr(lmisys);%获取LMI中决策变量的个数
    c=zeros(n,1);
    % for jj=1:n
    %     [Zj]=defcx(lmisys,jj,Z);
    %     c(jj)=trace(Zj)
    % end
    for jj=1:n
        pj=defcx(lmisys,jj,rou);
        c(jj)=(pj);
    end
    %options=[1e-5 0 0 0 1];
    [copt,xopt] = mincx(lmisys,c);
    %[copt,xopt] = mincx(lmisys,c,options) % solve the optimization problem
    X = dec2mat(lmisys,xopt,1) % extract matrix X
    W = dec2mat(lmisys,xopt,2) % extract matrix W
    Z = dec2mat(lmisys,xopt,3) % extract matrix Z
    K = W*inv(X) % get the feedback gain
    %}
    %注:求出的结果为:K =[-0.911192567348860,1.75193380502826,-0.249064838067320;
    %                     -0.106341894142934,-1.90039834212258,-0.701758897247713];
    %                      pou =3.349135e-04;
    %书中的结果:[-0.9112 1.7519 -0.2491; -0.1063 -1.9004 -0.7018];
    
    
    
    %% 采用yample优化工具箱的求出结果;
    %示例 https://github.com/eoskowro/LMI
    % Arizona State University
    % MAE 598 LMIs in Control Systems
    %{
    clear;close all; clc
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % LMI for Opimal FSF H_2 Control
    % Bring in Data
    A = [-1 1 0 1 0 1;...
        -1 -2 -1 0 0 1;...
        1 0 -2 -1 1 1;...
        -1 1 -1 -2 0 0;...
        -1 -1 1 1 -2 -1;...
        0 -1 0 0 -1 -3];
    B = [0 -1 -1;...
        0 0 0;...
        -1 1 1;...
        -1 0 0;...
        0 0 1;...
        -1 1 1];
    C = [0 1 0 -1 -1 -1;...
        0 0 0 -1 0 0;...
        1 0 0 0 -1 0];
    D = zeros(3);
    
    % Determine sizes
    ns = size(A,1);   % number of states
    nai = size(B,2);  % number of actuator inputs
    nmo = size(C,1);  % number of measured outputs
    nd = nai+nmo;     % number of disturbances
    nro = nmo+nai;    % number of regulated outputs
    eta = 0.0001;
    
    % 9 Matrix Representation
    B1 = [B zeros(ns,nmo)];
    B2 = B;
    C1 = [C;...
         zeros(nai,ns)];
    C2 = C;
    D11 = [D zeros(nai);...
          zeros(nmo) zeros(nmo)];
    D12 = [D;...
          eye(nmo)];
    D21 = [D eye(nmo)];
    D22 = D;
    
    % Settings
    opt = sdpsettings('verbose',0,'solver','sedumi'); %Create/alter solver options structure.
    
    % Define Variables
    gam= sdpvar(1);
    X = sdpvar(6);
    W = sdpvar(6);
    Z = sdpvar(3,6);
    
    % Define matricies
    mat1 = [A B2]*[X;Z] + [X Z']*[A';B2']+ B1*B1';
    mat2 = [X (C1*X+D12*Z)';C1*X+D12*Z W];
    mat3 = trace(W);
    
    % Define Constraints
    F = [];
    F = [F, X>=eta*eye(6)];
    F = [F, mat1<=-eta*eye(6)];
    F = [F, mat2>=eta*eye(12)];
    F = [F, mat3<=gam];
    
    % Optimization Problem
    optimize(F,gam,opt);
    gam= sqrt(gam);
    disp('The H-2 gain is: ');
    disp(value(gam));
    K= value(Z)*inv(value(X));
    sys = ss(A,B,C,D)
    eig(A+B2*K) %求出的系统是稳定的的
    %}
    
    
    
    %% 
    
    %使用上面书中例题的参数的采用Yamiple求解-采用的公式也与上面的相同
    A = [-3 -2 1;1 2 1;1 -1 -1]; B1 = [3; 0; 1];%干扰矩阵
    B2 = [2 0;0 2;0 1]; %控制矩阵
    C1 = [1 0 1;0 1 1]; D12 = [1 1;0 1];
    eta = 0.000001; %当减小eta的值时,求出的K值几乎和书中例题结果一样
    
    % Settings
    opt = sdpsettings('verbose',0,'solver','sedumi'); %选定那种求解器
    
    % Define Variables
    gam= sdpvar(1);
    X = sdpvar(3);
    W = sdpvar(2,2);
    Z = sdpvar(2,3);
    
    % Define matricies
    mat1 = [A B2]*[X;Z] + [X Z']*[A';B2']+ B1*B1';
    mat2 = [X (C1*X+D12*Z)';C1*X+D12*Z W];
    mat3 = trace(W);
    
    % Define Constraints
    F = [];
    F = [F, X>=eta*eye(3)];
    F = [F, mat1<=-eta*eye(3)];
    F = [F, mat2>=eta*eye(5)];
    F = [F, mat3<=gam];
    
    % Optimization Problem
    optimize(F,gam,opt);
    gam= sqrt(gam);
    disp('The H-2 gain is: ');
    disp(value(gam));
    K = value(Z)*inv(value(X));
    X = value(X)
    Z = value(Z)
    W = value(W) %注意这里的W和Z与上面方法的W和Z刚好是相反的
    gama =value(gam)
    sys = ss(A,B2,C1,D12)
    eig(A+B2*K) %求出的系统是稳定的的
    
    %注:当eta = 0.000001;时得出的K值为:[-0.911539661339165,1.74872193348681,-0.247991715575816;-0.105965874043457,-1.89693739748588,-0.702917300903666]
    % 几乎和书中例题一样但是求出的gamma值相差较大:书中259页给出的时3.3491*10^(-4)
    % 而这种方法求出的gamma值为: 0.0184
    
    %{
    %% 连续的H2 optimal control --表达公式不同采用Yamiple方法
    % 参考的:LMI Properties and Applications in Systems, stabillity and  Control
    % theory(好)70页公式(4.44.64.7)
    clear;
    clc;
    A = [-3 -2 1;
          1 2 1;
        1 -1 -1];
    B1 = [1 0.2 0]';
    B2 = [0.4 1 0.6]';
    C1 = [1.2 0.5 0.3];
    D12 = 1;
    
    P = sdpvar(3);
    Z = sdpvar(1);
    F = sdpvar(1,3);
    mu = sdpvar(1);
    mat1 = [A*P+P*A'+B2*F+F'*B2'  P*C1'+F'*D12';
           (P*C1'+F'*D12')'            -eye(1)];
    mat2 = [Z B1';
            B1 P];
    Fd = [mat1<=0; mat2>=0; P>=0; Z>=0 ;trace(Z)<=mu];
    optimize(Fd, mu);
    Kd = value(F)*inv(value(P))
    H2_norm = sqrt(value(mu))
    %}
    
    
    
    %{
    %%  连续的H2全状态反馈 --LMI原始方法-只是表达式与上面的形式不同【验证】
    % 参考的:LMI Properties and Applications in Systems, stabillity and  Control
    % theory(好)70页公式(4.44.64.7)
    
    A = [-3 -2 1;1 2 1;1 -1 -1]; B1 = [1; 0; 1];
    B2 = [2 0;0 2;0 1]; C1 = [1 0 1;0 1 0]; D12 = eye(2);D11=[0;0];
    
     %构建矩阵变量  
      [M,N] =size(A);
      setlmis([]);     
      P=lmivar(1,[N,1]); %N阶对称满块     
      Z=lmivar(1,[1,1]);    
      F=lmivar(2,[2,N]);
      rou=lmivar(1,[1,1]);
      %描述LMI
      %第一个LMI
      lmiterm([1,1,1,P],A,1,'s'); %AP+(AP)'     
      lmiterm([1,1,1,F],B2,1,'s'); %B2*F+(B2*F)'     
      lmiterm([1,1,2,P],1,C1');    %P*C1     
      lmiterm([1,1,2,-F],1,D12');  %F'*D12'     
      lmiterm([1,2,2,0],-eye(2));   %I     
    
       %第二个LMI
      lmiterm([-2,1,1,Z],1,1);%Z
      lmiterm([-2,1,2,0],B1');%B1'
      lmiterm([-2,2,2,P],1,1);%P
      %第三个LMI --迹的表达形式
    %   lmiterm ([3 1 1 Z],[1 0],[1 0]');
    %   lmiterm ([3 1 1 Z],[0 1],[0 1]');
      lmiterm ([3 1 1 Z],1,1);
      lmiterm ([-3 1 1 rou],1,1);  
      lmisys=getlmis ;%获取lmi信息 
      
      n=decnbr(lmisys);  %得出决策变量的个数  
      c=zeros(n,1);     
      for j=1:n         
          bj=defcx(lmisys, j, rou);    
          c(j)=bj;     
      end
     % options=[1e-5, 0, 0, 0, 0]; %计算精度     
     [copt,xopt]=mincx(lmisys,c );
    %  P=dec2mat(lmisys, xopt, P); 
    %  Z=dec2mat(lmisys, xopt, Z);
    %  W=dec2mat(lmisys, xopt, W); 
     X = dec2mat(lmisys,xopt,1); 
     F = dec2mat(lmisys,xopt,2);  
     Z = dec2mat(lmisys,xopt,3);
     K = F*inv(P)
     gamma=sqrt(copt)
      %}
      
    %{  
    %% 连续的H2 optimal control 
    clear;
    clc;
    A = [-3 -2 1;1 2 1;1 -1 -1]; B1 = [1; 0; 1];
    B2 = [2 0;0 2;0 1]; C1 = [1 0 1;0 1 0]; D12 = eye(2);D11=[0;0];
    P = sdpvar(3);
    Z = sdpvar(1);
    F = sdpvar(2,3);
    musqr = sdpvar(1);
    mat1 = [A*P+P*A'+B2*F+F'*B2'  P*C1'+F'*D12';
           (P*C1'+F'*D12')'            -eye(2)];
    mat2 = [Z B1';
            B1 P];
    Fd = [mat1 <= 0; mat2>=0; P>=0; Z>=0 trace(Z)<=musqr];
    optimize(Fd, musqr);
    Kd = value(F)*inv(value(P))
    H2_norm = sqrt(value(musqr))
    %}
    
    %{
    %% 离散的H2 ---采用传统的LMI方法
    % 参考的:LMI Properties and Applications in Systems, stabillity and  Control
    % theory(好)70页公式(下半部的公式)
    
    clear;
    clc;
    A = [0.1 0.2 0.3;
         0.4 0.5 0.6;
         0.7 0.8 0.9];
    B1 = ones(3,1);
    B2 = ones(3,1);
    C1 = ones(1,3);
    D12 = 1;
    
    %构建矩阵变量  
      [M,N] =size(A);
      setlmis([]);     
      P=lmivar(1,[N,1]); %N阶对称满块     
      Z=lmivar(1,[1,1]);    
      F=lmivar(2,[1,N]);
      rou=lmivar(1,[1,1]);
      %描述LMI
      
      %第一个LMI
      lmiterm([-1,1,1,P],1,1);  %P    
      lmiterm([-1,1,2,P],A,1);  %AP    
      lmiterm([-1,1,2,F],B2,1); %B2*F     
      lmiterm([-1,1,3,0],B1);   %B1     
      lmiterm([-1,2,2,P],1,1);   %P     
      lmiterm([-1,2,3,0],0);     %0
      lmiterm([-1,3,3,0],eye(1)); %I
    
      %第二个LMI
      lmiterm([-2,1,1,Z],1,1);%Z
      lmiterm([-2,1,2,P],C1,1);%C1*P
      lmiterm([-2,1,2,F],D12,1);%d112*F
      lmiterm([-2,2,2,P],1,1);  %P  
      
      %第三个LMI --迹的表达形式
    % lmiterm ([3 1 1 Z],[1 0],[1 0]');
    % lmiterm ([3 1 1 Z],[0 1],[0 1]');
      lmiterm ([3 1 1 Z],1,1);
      lmiterm ([-3 1 1 rou],1,1); 
    
    % 两个约束条件
      lmiterm([-4,1,1,P],1,1); %P正定P>0
      lmiterm([-5,1,1,Z],1,1); %Z正定Z>0
      lmisys=getlmis ;%获取lmi信息 
      
      n=decnbr(lmisys);  %得出决策变量的个数  
      c=zeros(n,1);     
      for j=1:n         
          bj=defcx(lmisys, j, rou);    
          c(j)=bj;     
      end
     % options=[1e-5, 0, 0, 0, 0]; %计算精度     
     [copt,xopt]=mincx(lmisys,c );
     
     %注意获取参数时要按照定义变量的顺序进行
    %  P=dec2mat(lmisys, xopt, P); 
    %  Z=dec2mat(lmisys, xopt, Z);
    %  W=dec2mat(lmisys, xopt, W); 
     P = dec2mat(lmisys,xopt,1);
     F = dec2mat(lmisys,xopt,3);  
    
     K = F*inv(P)
     gamma=sqrt(copt)
    %}
    View Code

    H Infinity  control  LMI  方法

    参考:H∞控制器的设计 - 百度文库 (baidu.com)

     

     

     

    程序:

    % 测试--------使用RICCATI进行H infinity的状态反馈设计
    %系统参数参见网址:https://wenku.baidu.com/view/c3f834b2ac51f01dc281e53a580216fc710a5358.html?rec_flag=default
    clc;clear;close all;
    A =[0 1 0 0;
        0 0 -1 0;
        0 0 0 1;
        0 0 11 0];
    B1 =[0 1;0 1;1 -3; 2 1];
    B2 =[0 2 3 1;
        1 8 2 1;
        0 2 3 4;
        -1 -1 4 2];
    %使用网站原来的参数C1的值,求不出riccari的增益K值,为此对其作了些改动
    C1=[2 0 0 0;
        0 0.02 0 0;
        0 0 0.04 0;
        0 0 0 0.01;
        0 0 0 0];
    D11=[1 2;1 4];
    D12 =[0 0 0 0 1]';
    C2=eye(4);
    D21=0;D22=0;
    %% 判断系统是否满足基于Riccati方程的假设条件
    sys =ss(A,B2,C2,D22);
    P0 = pole(sys)
    Cc =rank(ctrb(A,B2))
    Ob =rank(obsv(A,C2))
    S =D12'*[C1 D12]
    
    %% 利用Riccati方程求解 H infinity 在增益K, A'*X+X*A+X*(B1*B1'-B2*B2')*X+C'*C=0
    %  A'*X+X*A-X*[B1 B2]*[-I 0;0 I]*[B1';B2']*X+C1'*C1=0
    B0 =[B1 B2];
    V=[-1,-1,-1,1,1,1];
    R=diag(V);
    C =C1;
    X =care(A,B0,C'*C,R)
    K =-B2'*X
    root =eig(A+K) %判断闭环系统是否稳定;看其特征值是否都有负实部
    View Code

    仿真结果:

     

     

     

    ceshi_Hinf_lmi-- discrete time

    clc;clear; close all;
    A  = [2 1 -2;1 -1 -3; 4 0 -1];
    B = [1 0;0 3;3 1];
    E1 = [1 0.2 -0.5]';
    C = [2 1 -0.5];
    D = [1 1];
    E2 = [0.05]
    
    P = 10e+7;
    X0 = [8.7047 -6.5321 4.2500;
         -6.5321 8.8601 -4.2821;
         4.2500 -4.2821 5.0227];
    W0 = [-5.2786 2.9364 -7.7991;
          -3.4736 -0.8733 6.0925];
    W =P*W0; X = X0*P;
    K1 =W*inv(X)
    
    Ac =A-B*K1;
    Bc = B;
    Cc = C;
    Dc = D;
    sys_cl = ss(Ac,Bc,Cc,Dc);
    step(sys_cl)
    % figure(1)
    % t = 0:0.01:15;
    % r =[0.5*ones(size(t));
    %     0.5*ones(size(t))];
    % [y,t,x]=lsim(sys_cl,r,t);
    % plot(t,y)
    % 
    % 
    % K2 = [1.2850 0.5978 -2.0283;
    %      -1.4101 -0.7807 1.4861]
    % Ac =A-B*K2;
    % Bc = B;
    % Cc = C;
    % Dc = D;
    % sys_cl = ss(Ac,Bc,Cc,Dc);
    % 
    % figure(2)
    % t = 0:0.01:15;
    % r =[0.5*ones(size(t));
    %     0.5*ones(size(t))];
    % [y,t,x]=lsim(sys_cl,r,t);
    % plot(t,y)
    View Code

    daolibai_LMI_method----discrete time Hinf  state feedback control

    % daolibai_LMI_method--Hinf control
    
    clear;clc; 
    A = [0 1 0 0;0 -0.0618 -0.7167 0;0 0 0 1;0 0.2684 31.6926 0];
    B1 = [0;-2.6838;0;118.6765];
    B2 = [0;0.8906;0;-2.6838];
    C1 = [0.00001 0 0 0;0 -0.0001 0 0;0 0 -0.01 0;0 0 0 -0.01];
    D11 = [0;0;0];
    D12 = [0;0;0];
    n=length(A); 
    
     %构建矩阵变量
    setlmis([]);
    [X,n,sX] = lmivar(1,[4,1]); %4阶的对称满块  
    [W,n,sW] = lmivar(2,[1,4]); %4*1的矩阵  
    
    %描述LMI  
    lmiterm([1 1 1 W],A);
    lmiterm([1 1 1 X],B2,'s');
    lmiterm([3 1 1 0],B1);
    lmiterm([1 2 1 X],B2,1);
    lmiterm([1 2 2 A],D21,2);
    lmiterm([1 3 3 0],-1);
    lmiterm([2 2 1 W],-1);
    lmiterm([-2 2 1 X],1,1);
    lmisys = getlmis;
    [tmin,xfeas]=feasp(lmisys)
      if(tmin<0)         
             disp('Feasible');     
          else
             sys=[];         
          return              
       end
    X = dec2mat(lmisys,xfeas,X)
    W = dec2mat(lmisys,xfeas,W)
    K = W*inv(X)
    View Code

    daolibai_LMI_and_riccati--discrete time  Hinf  state feedback control 

     clear,clc    
     M=1; %小车质量     
     m=0.1; %倒立摆质量      
     L=0.5; %摆的长度     
     g=9.8 ;%重力加速度     
     J=m*L^2/3; %转动惯量          
     k=J*(M+m)+m*M*L^2 ;     
     k1=(M+m)*m*g*L/k ;     
     k2=-m^2*g*L^2/k ;      
     k3=-m*L/k ;     
     k4=( J+m*L^2 ) /k ; %中间变量    
    
     %------PlantA------------      
    
     A=[0,0,1,0 ;0,0,0,1 ;k1,0,0,0 ;k2,0,0,0];     
    %  B1=[0; 0; 0.09; 0.11 ]; 
     B1=[0;0;0.5;0.5] ;     
     B2=[0; 0; k3; k4];     
     C1=[1,0,0,0; 0,1,0,0; 0,0,1,0; 0,0,0,1; ] ; 
     %   C=[1,0,0,0;0,0,0,0] ;     
     N=length(A);     
     D11=0; 
     D12=[0; 0; 0;0; 1]; %状态方程各个矩阵     
     %D12=0;   
     
     % -----直接求出K--------LMI求解
     gamma =4;
     %根据所得的次优gamma重新求解K
    %  [X,W]=LMIC(A,B1,B2,C1,D11,D12,gamma,N)
    %  K_sub=W*inv(X)
     [X,W,gamma]=LMID(A,B1,B2,C1,D11,D12,N)
     K_opt=W*inv(X)
    
    
      
     %   A=[0,1,0,0;10.78,0,0,0;0,0,0,1;-0.98,0,0,0];
     %   B1=[0;0;0.09;0.11];
     %   B2=[0;-1;0;0.5];
     %   N=length(A); 
     %   D12=[0]; 
     %   C=[1,0,0,0]; 
     %   D11=[];   
     %   gamma=4;    
     %% -----LMI求解------------
     %   gamma=2;      
     %   K=LMIC(A,B1,B2,C,D11,D12,gamma,N)  %LMI求解    
     %-------------------  
     %   K=[51.1721, 3.6803, 9.2785, 7.9564];    
     
    %% ------PlantB------------ 
     
       A=[0  1       0       0; 
        
         0 -0.0883  0.6293  0; 
         0  0       0       1; 
         0 -0.2357  27.8285 0] ;
         B1=[0 2.3566  0 104.2027]'; 
         B2=[0 0.8832  0 2.3566]';  
          C= [0.064 0   0    0; 
           0     1e-3  0    0; 
           0     0   0.11 0; 
           0     0   0    0.01; 
           0     0   0    0]; 
         D12=[0;0;0;0;1];    
    
     %% -----Raccati方程求解---可行--------     
    %  B=[B1,B2];  
    %   C=C1;
    %  R=[-1, 0; 0, 1];     
    %  X_ric=care(A, B, C'*C, R)  ;     
    %  K_ric=-B2'*X_ric  %控制器   
     % K=[  112.1078   99.9032 -364.5474  -72.8227]; 
     % X=[0.1253,0.0042,-0.6266,-0.0266; 
     %    0.0042,0.565,0.0156,-0.3558; 
     %    -0.6266,0.0156,3.6427,-0.1747; 
     %    -0.0266,-0.3558,-0.1747,0.5286]; 
     %   W=[0.4583,0.0057,-0.1069,-0.8101]; 
     %   K=W*inv(X)  
     
    % function [X,W]=LMIC(A,B1,B2,C1,D11,D12,gamma,N) %次优函数调用
    %   %{ 
    %   程序功能: 
    %    1、利用LMI求解倒立摆 
    %    2、状态反馈控制,求控制器 
    %    3、参考文献:[1]吕 申,武俊峰.基于 LMI 优化的鲁棒控制器设计[J].工业仪表与自动化装置,2017,3:123-128. 
    %    %} 
    % 
    %    %构建矩阵变量     
    %    setlmis([]);     
    %    [X,n,Sx]=lmivar(1,[N,1]); %4阶的对称满块    
    %    [W,n,Sw]=lmivar(2,[1,N]); %4*1的矩阵          
    % 
    %     lmiterm([1,1,1,X],A,1,'s');  %AX+(AX)'     
    %     lmiterm([1,1,1,W],B2,1,'s');  %B2*W+(B2*W)'     
    %     lmiterm([1,1,2,0], B1);  %C1*X     
    %     lmiterm([1,1,3,X],1,C1' ); %D12*W     
    %     lmiterm([1,1,4,-W],1,D12' ); %W'*D12'     
    %     lmiterm([1,2,2,0],-gamma^2);%-gamma     
    %     lmiterm([1,2,3,0],D11'); %D12'     
    %     lmiterm([1,3,3,0], -1 ); %-I     
    % 
    %    %------------------------------------------     
    %     lmiterm([-2,1,1,X],1,1); %X正定     
    %    %------------------------------------------     
    %    lmisys=getlmis ;%获取lmi信息          
    %    %求解可行解X,W     
    %    [tmin, xfeas]=feasp(lmisys);     
    %    if(tmin<0)         
    %          disp('Feasible');     
    %       else
    %          sys=[];         
    %       return              
    %    end
    %   X=dec2mat(lmisys, xfeas, X);     
    %   W=dec2mat(lmisys, xfeas, W);     
    % end
    View Code

    example LMI (yalmip)--discrete time Hinf  state feedback control 

    clc;
    clear;
    clc;
    %% System parameters
    A = [0.9641 0.0025 -0.0004 -0.0452;
         0.0044 0.9036 -0.0188 -0.3841;
         0.0096 0.465  0.9435   0.2350;
         0.0005 0.0024 0.0969   1.0120];
    Bd1= [0.0440 0.0164;
         0.4898 -0.7249;
         -0.5227 0.4172;
         -0.0266 0.0214];
    Bd2 =[0.0440 0.0164;
         0.4898 -0.7249;
         -0.5227 0.4172;
         -0.0266 0.0214];
    Cd1 = ones(1,4);
    Cd2 = eye(4);
    Dd12 = [0.002 0.002];
    Dd11 = [1 1];
    Dd22 = zeros(4,2);
    Ts =0.1;
    %% Calculate the H infinity state feedback gain
    P = sdpvar(4); 
    Z = sdpvar(1); 
    Fd = sdpvar(2,4);
    gam = sdpvar(1); 
    mat1 = [P A*P+Bd2*Fd Bd1 zeros(4,1);
           (A*P+Bd2*Fd)' P zeros(4,2) P*Cd1'-Fd'*Dd12';
           Bd1' zeros(2,4) gam*eye(2) Dd11';   
           zeros(1,4) (P*Cd1'-Fd'*Dd12')' Dd11 gam*eye(1)];
    F = [mat1 >= 0; P>=0];
    optimize(F, gam);
    Kd = value(Fd)*inv(value(P))
    Hinf_norm = (value(gam))
    L1 =eig(A-Bd2*Kd)
    %% simulation 
    % sysd = ss(A,Bd2,Cd2,Dd22);
    % feedin = [1 2];
    % feedout = [1 2 3 4];
    % sys_cl = feedback(sysd,Kd,feedin,feedout)
    % 
    % Ac = A-Bd2*Kd;
    % Bc = Bd2;
    % Cc = Cd2;
    % Dc = Dd22;
    % sys_cl = ss(Ac,Bc,Cc,Dc)
    % T = 0:0.1:10;
    % step(sys_cl,T)
    
    
    % clear;
    % clc;
    A = [0.1 0.2 0.3;
         0.4 0.5 0.6;
         0.7 0.8 0.9];
    Bd1 = ones(3,1);
    Bd2 = ones(3,1);
    Cd1 = ones(1,3);
    Dd12 = 1;
    Dd11 = 0;
    P = sdpvar(3);
    Z = sdpvar(1);
    Fd = sdpvar(1,3);
    gam = sdpvar(1);
    mat1 = [P A*P+Bd2*Fd Bd1 zeros(3,1);
           (A*P+Bd2*Fd)' P zeros(3,1) P*Cd1'-Fd'*Dd12';
           Bd1' zeros(1,3) gam*eye(1) Dd11';
           zeros(1,3) (P*Cd1'-Fd'*Dd12')' Dd11 gam*eye(1)];
    F = [mat1 >= 0; P>=0];
    optimize(F, gam);
    Kd = value(Fd)*inv(value(P))
    Hinf_norm = (value(gam))
    L2 =eig(A-Bd2*Kd)
    View Code

    H2 状态反馈控制--模型参数例子来于书本:robust control design _269页--三个例子分开运行

     clc;clear;close all; %文中有三个例子,需要分开运行才可以
    
    %% 模型参数例子来于书本:robust control design _269页
    %{
    A=[-5 2 -4 ;0 -3 0; 0 7 -1];
    B1=[7 -3 1]';   B2=[6 8 -5]';
    C1=[-2 9 4];    C2=[6 3 -1];
    D11=[0];     D12=[1];    D21=[2];    D22=[0];
    
    G=ss(A,B2,C2,D22);
    P =ltisys(A,[B1 B2],[C1;C2],[D11 D12;D21 D22]);
    P1 =pck(A,[B1 B2],[C1;C2],[D11 D12;D21 D22]);
    [Aa,Bb,Cc,Dd]=branch(P);
    sys=ss(Aa,Bb,Cc,Dd);
    po=pole(sys)
    
    nmeas = 1;
    ncont = 1;
    [K,CL,gamma] = h2syn(sys,nmeas,ncont);
    
    [Ak,Bk,Ck,Dk]=branch(K);
    GK=ss(Ak,Bk,Ck,Dk);
    K_tf=zpk();
    [Knum,Kden]=ss2tf(Ak,Bk,Ck,Dk);
    K_tf=tf(Knum,Kden)
    
    % [Aa,Bb,Cc,Dd]=branch(P);
    % sys=ss(Aa,Bb,Cc,Dd);
    % P_tf=zpk(ss(Aa,Bb,Cc,Dd))
     step(feedback(G*GK,-1),30)
    % clsys =slft(P,K);
    % splot(clsys,'st')
    
    
    %}
    
    %{
    %% matlab帮助中的h2syn函数的例子
    A = [5    6    -6
         6    0     5
        -6    5     4];
    B = [0     4     0     0
         1     1    -2    -2
         4     0     0    -3];
    C = [-6     0     8
         0     5     0
        -2     1    -4
         4    -6    -5
         0   -15     7];
    D = [0     0     0     0
         0     0     0     1
         0     0     0     0
         0     0     3     6
         8     0    -7     0];
    P = ss(A,B,C,D);
    P1 = pck(A,B,C,D);
    pole(P)
    
    nmeas = 2;
    ncont = 1;
    [K,CL,gamma] = h2syn(P,nmeas,ncont);
    pole(CL)
    step(CL)
    clsys =slft(P,K);
    splot(clsys,'st')
    [A,B1,B2,C1,C2,D11,D12,D21,D22]=branch(P)
    %}
    
    
    
    
    %% 原来旧函数的应用--https://wenku.baidu.com/view/d79bb3cb0722192e44
    A =[0     1      0      0; 
        -5000 -100/3 500 100/3;
        0     -1   0         1;
        0    100/3 -4     -60];
    B =[0   25/3  0  -1]';
    C=[0  0  1  0];
    D=0;
    G =ss(A,B,C,D);
    W1=[0 100; 1 1];
    W2=1e-5;
    W3=[1 0; 0 1000];
    T_ss=augtf(G,W1,W2,W3);
    [Aa,Bb,Cc,Dd]=branch(T_ss); 
    [Aa,Bb,Cc,Dd]=ssdata(T_ss); 
    
    [a,b1,b2,c1,c2,d11,d12,d21,d22]=branch(T_ss);%当使用augtf函数获取增广系统矩阵表达式后,
                                                 %可用branch函数获得各个增光系统矩阵的参数
    P =rt2smat(T_ss) %变换成系统矩阵P
    
    K_h2=h2lqg(T_ss) %获得H2最优控制器
    [AK0,BK0,CK0,DK0]=branch(K_h2);
    [AK0,BK0,CK0,DK0]=ssdata(K_h2);%两个函数均可实现这个功能
    K_H2_tf=zpk(ss(AK0,BK0,CK0,DK0))
    K_Hinf=hinf(T_ss) %获得H00优控制器
    [AK1,BK1,CK1,DK1]=branch(K_Hinf);
    
    K_Hinf_tf=zpk(ss(AK1,BK1,CK1,DK1))
    [gamma,K_opt]=hinfopt(T_ss); %获得H00最优控制器
    [AK2,BK2,CK2,DK2]=branch(K_opt); 
    K_opt_tf=zpk(ss(AK2,BK2,CK2,DK2))
    
    % 绘制闭环节约响应下系统的开环bode图
    bode(G*K_H2_tf,'-',G*K_Hinf_tf,'--',G*K_opt_tf,':')
    
    % 闭环阶跃响应曲线
    figure(1)
    step(feedback(G,K_H2_tf,-1),'r-') 
    
    figure(2)
    step(feedback(G*K_H2_tf,1),'r-')
    % step(feedback(G*K_H2_tf,1),'r-',feedback(G*K_Hinf_tf,1),'g--',feedback(G*K_opt_tf,1),':')
    
    %系统矩阵变换函数 -参见:https://wenku.baidu.com/view/d79bb3cb0722192e44
    function P =rt2smat(A,B1,B2,C1,C2,D11,D12,D21,D22)
    if nargin ==1,
       [A,B1,B2,C1,C2,D11,D12,D21,D22]=branch(A);
    end
    n =length(A);
    P=[A,B1,B2;C1,D11,D12;C2,D21,D22];
    P(size(P,1)+1,size(P,2)+1)=-inf;
    m=size(P,2);
    P(1,m)=n;
    end
    
    %}
    View Code

    H_infinity_looping_shape_control---参考文章:BACHELOR’S FINAL PROJECT(有代码有几种控制方法lqgLQRHOOPID)

    clear;clc;
    close all;
    %% State-space model
    A=[-0.38 0.60 -0.36 -9.80;
       -0.98 -10.65 16.74 -0.21;
       0.18 -5.39 -16.55 0;
       0 0 1 0];
    B=[-0.36;
       -3.62;
     -141.57;
          0];
    C4=[0 0 0 1]; %longitudinal speed u
    D=0;
    sys=ss(A,B,C4,D);
    %% Define system with uncertainties
    a11=ureal('a11',1,'Percentage',10);
    a12=ureal('a12',1,'Percentage',10);
    a13=ureal('a13',1,'Percentage',10);
    a14=ureal('a14',1,'Percentage',10);
    a21=ureal('a21',1,'Percentage',10);
    a22=ureal('a22',1,'Percentage',5);
    a23=ureal('a23',1,'Percentage',5);
    a24=ureal('a24',1,'Percentage',10);
    a31=ureal('a31',1,'Percentage',10);
    a32=ureal('a32',1,'Percentage',5);
    a33=ureal('a33',1,'Percentage',5);
    a34=ureal('a34',1,'Percentage',10);
    a41=ureal('a41',1,'Percentage',10);
    a42=ureal('a42',1,'Percentage',10);
    a43=ureal('a43',1,'Percentage',10);
    a44=ureal('a44',1,'Percentage',10);
    uA=[-0.38*a11 0.60*a12 -0.36*a13 -9.80*a14;
      -0.98*a21 -10.65*a22 16.74*a23 -0.21*a24;
       0.18*a31 -5.39*a32 -16.55*a33 0;
       0 0 1*a43 0];
    b1=ureal('b1',1,'Percentage',10);
    b2=ureal('b2',1,'Percentage',5);
    b3=ureal('b3',1,'Percentage',5);
    b4=ureal('b4',1,'Percentage',10);
    uB=[-0.36*b1;
        -3.62*b2;
      -141.57*b3;
              0];
    usys=ss(uA,uB,C4,D);
    %% H-infinity loop shaping
    s=tf('s'); %Define s as the Laplace variable
    %Singular value diagram to obtain the crossover frequency (Wc)
    figure(1)
    sigma(sys) %Wc=6.11 rad/s (Value seen on figure 1)
    Wc=6.11;
    G=Wc/(s); %desired loopshape
    % Compute the optimal loop shaping controller K
    [K,CL,GAM] = loopsyn(sys,G);
    [K.A,K.B,K.C,K.D]=ssdata(K); %得出控制器状态空间表达式参数
    %% Closed-loop system
    L=K*sys; %Adding disturbance to the system (这句注释的不对)
    L_close=feedback(L,1); %Closed-loop
    figure(2)
    step(L_close);
    str=sprintf('Step response of the pitch angle \theta (H-infinity loopshaping)');
    title(str);
    ylabel('	heta (rad)');
    %System information
    S_final = stepinfo(L_close)
    [y,t]=step(100*L_close);
    sserror_final=100-y(end);
    %Display gain and phase margins
    figure(3)
    margin(L_close);
    %% Controller simplification
    %Hankel singular values of K
    figure(4)
    hsv = hankelsv(K);
    semilogy(hsv,'*--'), grid
    title('Hankel singular values of K (	heta)'), xlabel('Order')
    %Reduce controller from 7 to 5 states
    Kr = reduce(K,5);
    order(Kr) %check simplification
    %Closed-loop responses comparison (K and Kr)
    Lr=Kr*sys;
    Lr_close=feedback(Lr,1);
    figure(5)
    step(L_close,'b',Lr_close,'r-.');
    str=sprintf('Original and simplified controller (K & Kr) comparison for \theta');
    title(str);
    ylabel('	heta (rad)');
    legend('K','Kr','Location','Southeast')
    %% Plot step response with uncertainties
    uLr=Kr*usys;
    uLr_close=feedback(uLr,1); %Closed loop system with uncertainties
    figure(6);
    step(uLr_close);
    str=sprintf('Step response of the pitch angle \theta (H-infinity loopshaping, uncertain plant)');
    title(str);
    ylabel('	heta (rad)')
    View Code

    H2_optimal_control_fixed_wing-----基于H2最优控制的小型无人机飞行姿态控制器设计

    clc;clear;close all;
    
    %{
    %% State-space system
    A=[-0.38   0.60  -0.36  -9.80;
       -0.98  -10.65 16.74 -0.21;
        0.18   -5.39  -16.55  0;
        0       0      1     0];
    B2=[-0.36; -3.62; -141.57; 0];
    B1 =[0 0.6 0 0.2]'; %干扰矩阵
    C1 =[0.3 0 0 0;     %这个C1矩阵怎样选择
         0 0.4 0 0; 
         0 0 0.1 0;
         0 0 0 0.02]
    C2= [0 0 0 1];
    D11=zeros(4,1);
    D12=[0 0 0 1]';
    D21=[1];
    D22 =[0];
    G =ss(A,B2,C2,D22);
    P =ltisys(A,[B1 B2],[C1;C2],[D11 D12;D21 D22])
    [A1,B1,C1,D1]=branch(P)
    nmeas =1; %测量输出个数
    ncont =1; %控制输入个数
    gmin =0.1; 
    gmax=18;
    tol =0.0001
    % [K,CL,gamma] = hinfsyn(P,nmeas,ncont) %这里为什么不能使用这个函数会出错?
    [K,CL,gamma] = hinfsyn(P,nmeas,ncont,gmin,gmax,tol);
    
    %% 画出阶跃响应信号
    figure(1)
    clsys =slft(P,K); %得到闭环系统
    spol(clsys); %该函数返回闭环系统的极点
    splot(clsys,'st',1);%画出阶跃响应曲线
    
    % %% 画出控制信号
    % figure(2)
    % clsys =slft(K,P); %得到闭环系统
    % spol(clsys); %该函数返回闭环系统的极点
    % splot(clsys,'st');%画出阶跃响应曲线
    
    
    [Ak,Bk,Ck,Dk]=branch(K)
    sys=ss(Ak,Bk,Ck,Dk)
    K_tf=zpk(ss(Ak,Bk,Ck,Dk))
    [Knum2,Kden2]=ss2tf(Ak,Bk,Ck,Dk)
    K_tf1=tf(Knum2,Kden2)
    figure(3)
    step(feedback(G*K_tf,-1),40,'-')
    
    
    %% 
    G =ss(A,B2,C2,D22);
    s=tf('s')
    W1=(100)/(10*s+1);
    W2=1e-6;
    W3=(10*s)/(s+0.000008);
    T_ss=augtf(G,W1,W2,W3);
    [Aa,Bb,Cc,Dd]=branch(T_ss); 
    [Aa,Bb,Cc,Dd]=ssdata(T_ss); 
    K_Hinf=hinf(T_ss) %获得H00优控制器
    [AK1,BK1,CK1,DK1]=branch(K_Hinf);
    
    [a,b1,b2,c1,c2,d11,d12,d21,d22]=branch(T_ss)
    figure(4)
    step(feedback(G,K_Hinf,-1),40,'-')
    %}
    
    
    %% 例子二: 系统参数数据-来自论文:基于H2最优控制的小型无人机飞行姿态控制器设计
    A =[-0.136   11.52  -9.8   0;
        -0.0551 -0.2059   0  0.98;
         0      0      0       1;
        0.026  -0.66   0  -0.5534];
    B =[0.34            0.001;
        -0.00167      -0.0063; 
            0               0; 
        -0.000304    -0.00985];
    C =[ 0  0  0  1];
    % C=eye(4);
    D=[0 0];
    % D =[0 0 0 0;0 0 0 0]';
    
    G =ss(A,B,C,D);
    num=[0.008 5]; den =[1 0.0005];  w1 =tf(num,den);
    p1=w1;
    
    W1s=w1*eye(4)
    W2s=1e-5*eye(2);
    W2s=tf(W2s)
    p2=W2s;
    num1=[8 0.1]; den1 =[0.00001 40];  w2 =tf(num1,den1);
    p3=w2;
    % num2=[1 1.667e-5]; den2 =[0.00001 40];  w3 =tf(num2,den2);
    % W3s=[0   0    0   0;
    %     0   w2   0   0;
    %     0   0    0   0;
    %     0   0    0   w3];
    % T_ss=augtf(G,W1s,W2s,W3s);
    T_ss=augtf(G,p1,p2,p3);
    [Aa,Bb,Cc,Dd]=branch(T_ss); 
    [Aa,Bb,Cc,Dd]=ssdata(T_ss)
    
    [a,b1,b2,c1,c2,d11,d12,d21,d22]=branch(T_ss);%当使用augtf函数获取增广系统矩阵表达式后,
                                                 %可用branch函数获得各个增光系统矩阵的参数
    P =rt2smat(T_ss) %变换成系统矩阵P
    
    K_h2=h2lqg(T_ss) %用H2lqg函数获得H2最优控制器
    nmeas = 1;
    ncont = 2;
    [K,CL,gamma] = h2syn(T_ss,nmeas,ncont) %用H2syn函数获得H2最优控制器
    % [] = h2syn(T_ss,nmeas,ncont) %用H2syn函数获得H2最优控制器
    [AK0,BK0,CK0,DK0]=branch(K_h2);
    [AK0,BK0,CK0,DK0]=ssdata(K_h2);%两个函数均可实现这个功能
    K_H2_tf=zpk(ss(AK0,BK0,CK0,DK0))
    figure(1)
    bode(G*K_H2_tf,'-');
    figure(2)
    % feedin=[2];
    % feedout=[ 4];
    % step(feedback(G*K_H2_tf,1,feedin,feedout),'r-')
    figure(1)
    step(feedback(G*K_H2_tf,1),'r-',6)
    figure(2)
    step(feedback(G*K,1),'r-',6)
    %% 问题 采用H2syn函数时 求出gamma 是无穷代表啥意思
    
    %% 系统进行离散化
    Ts=0.1; %采样时间
    Gd=c2d(G,Ts,'z') %采用零阶保持器的方法对系统离散化
    T_ssd=c2d(T_ss,Ts,'z') %广义系统的离散化
    P1 =rt2smat(T_ssd)
    
    [Aad,Bbd,Ccd,Ddd]=branch(T_ss); 
    [ad,bd1,bd2,cd1,cd2,dd11,dd12,dd21,dd22]=branch(T_ssd);
    % dd11=zeros(4,1);
    % Pd =ltisys(ad,[bd1,bd2],[cd1,cd2],[dd11,dd12,dd21,dd22])
    Pd =mksys(ad,bd1,bd2,cd1,cd2,dd11,dd12,dd21,dd22,'tss')
    Kd_h2=dh2lqg(Pd) %获得离散的H2最优控制器,这里使用的是命令dh2lqg
    [AK0d,BK0d,CK0d,DK0d]=branch(Kd_h2);
    Kd_h2_tf=zpk(ss(AK0d,BK0d,CK0d,DK0d,Ts)) %将控制器转换成零极点白表达式
    figure(3)
    bode(Gd*Kd_h2_tf,'-'); %画出系统伯德图
    figure(4)
    step(feedback(Gd*Kd_h2_tf,1),'r-',6)
    %}
    
    %系统矩阵变换函数 -参见:https://wenku.baidu.com/view/d79bb3cb0722192e44
    function P =rt2smat(A,B1,B2,C1,C2,D11,D12,D21,D22)
    if nargin ==1,
       [A,B1,B2,C1,C2,D11,D12,D21,D22]=branch(A);
    end
    n =length(A);
    P=[A,B1,B2;C1,D11,D12;C2,D21,D22];
    P(size(P,1)+1,size(P,2)+1)=-inf;
    m=size(P,2);
    P(1,m)=n;
    end
    View Code

     H infinty 状态反馈-基于Riccati方程方法

    %小型固定翼无人机俯仰控制——系统参数参见文章:BACHELOR’S FINAL PROJECT(好done)
    % H infinty 状态反馈-基于Riccati方程方法
    clear 
    close all;
    clc
    %% State-space system
    A=[-0.38   0.60  -0.36  -9.80;
       -0.98  -10.65 16.74 -0.21;
        0.18   -5.39  -16.55  0;
        0       0      1     0];
    B2=[-0.36; -3.62; -141.57; 0];
    B1 =[0 0.86 0 4.2]'; %干扰矩阵
    C1 =[0.1 0 0 0;     %这个C1矩阵怎样选择
         0 0.04 0 0; 
         0 0 0.02 0;
         0 0 0 0.01;
         0 0 0 0]
    C2= [0 0 0 1];% 测量矩阵
    % D11 =[0];
    D11 =[0;0;0;0;0];
    D12 =[0;0;0;0;1];
    D21=0;
    D22=0;
    P =ltisys(A,[B1 B2],[C1;C2],[D11 D12;D21 D22])
    %% 判断系统是否满足基于Riccati方程的假设条件
    sys =ss(A,B2,C2,D22);
    P0 = pole(sys)
    Cc =rank(ctrb(A,B2))
    Ob =rank(obsv(A,C2))
    S =D12'*[C1 D12]
    
    %% 利用Riccati方程求解H infinity 在增益K, A'*X+X*A+X*(B1*B1'-B2*B2')*X+C'*C=0
    %  A'*X+X*A-X*[B1 B2]*[-I 0;0 I]*[B1';B2']*X+C1'*C1=0
    B =[B1 B2];
    R =[-1 0;0 1];
    C =C1;
    X =care(A,B,C'*C,R)
    K =-B2'*X
    root =eig(A-K) %判断闭环系统是否稳定;看其特征值是否都有负实部
    
    [Aa,Bb,Cc,Dd]=branch(P)
    sys=ss(Aa,Bb,Cc,Dd)
    P_tf=zpk(ss(Aa,Bb,Cc,Dd))
    % 
    feedin=[1];
    feedout=[1 2 3 4];
    step(feedback(sys,K,feedin,feedout,-1));
    
    % clsys1 =slft(P,K);  %得到闭环系统
    % spol(clsys1,'st')  %验证闭环系统极点
    View Code
    本文版权归作者和博客园所有,欢迎转载,但请在文章也页面明显位置给出原文链接。如对文章有任何意见或者建议,欢迎评论。个人才疏学浅,文章如有错误,欢迎指正,也欢迎大家分享交流自己更好的方法! 此外有时由于太懒不是自己写上去的,引用了一些大佬的文章,如有忘记备注原文内容链接,实非故意。
  • 相关阅读:
    第二章 逻辑代数及其简化
    小知识:三极管ie==ic+ib
    第二章.2 真值表→表达式的转换
    C# 静态变量及静态函数
    第四章(1):变量静态变量和实例变量
    转义大括号
    能被15整除的最大整数
    动态规划矩阵连乘问题
    [转]三极管的集电结反向偏置电压
    anddroid App, Framework, Sdk编译
  • 原文地址:https://www.cnblogs.com/csymemory/p/14765556.html
Copyright © 2011-2022 走看看