线性二次最优控制-输出跟踪器matlab

    1. 线性时变系统输出跟踪器

    image

    1.2 线性时变系统输出跟踪器设计步骤

    image
    image

    2.1 线性定常系统输出跟踪器设计步骤

    image

    3.算例

    image

    4.matlab代码:

    4.1 跟踪器代码

    点击查看代码
    function [u,x,e,ef,K,P,E] =LQ_track( A,B,C,R,Q,xt0,t0,tf,ydt)
    % A,B,C,D分别为系数矩阵;xt0为初始状态向量,u为最优控制,x为最优轨线
    % R为正定加权阵,Q为正定加权阵,K为状态反馈阵,P为黎氏方程矩阵
    % t0和tf为时间区间,ydt为理想输出,e为瞬态输出误差,ef为终态输出误差
    syms t;
    Qy=C'*Q*C;
    [K,P,E]=lqr(A,B,Qy,R); %求黎卡提方程矩阵P,状态反馈阵K及特征值E
    gt=inv(P*B*inv(R)*B'-A')*C'*Q*ydt;   % g(t)子模块的解
    AK=A-B*K; % 跟踪器状态反馈系统矩阵
    Phit=expm(AK*t);   %状态转移矩阵
    x=simplify(Phit*xt0+B*inv(R)*B'*gt); %最优轨线
    u=simplify(-K*x+inv(R)*B'*gt);    %最优控制
    y=simplify(C*x);   %输出响应
    e=ydt-y;  %输出误差
    ef=subs(e,t,tf);  %终端输出误差
    q=size(C,1);
        for k=1:q
        subplot(2,2,k);ezplot(t,y(k),[t0,tf],1);grid;title(' ')
        xlabel('时间 t ');ylabel('输出量 y')
        end
        for k=1:q
        subplot(2,2,k);ezplot(t,e(k),[t0,tf],2); 
        grid;title(' ');xlabel('时间 t ');ylabel('输出误差 e ')
        end
    end
    
    

    4.2主函数代码

    点击查看代码
    A = [0 1;-3 -4];
    b = [1;1];
    C = [1 0];
    xt0 = [10;10];
    t0 = 0;
    tf = 8;
    ydt = 10;
    R = 0.78;
    Q = 1;
    [u,x,e,ef,K,P,E] = LQ_track(A,b,C,R,Q,xt0,t0,tf,ydt);
    fprintf("最优控制律 u =\n"); disp(u) ;
    fprintf("输出 x = \n");disp(x) ;
    fprintf("输出误差 e = \n");disp(e) ;
    fprintf("终端输出误差 ef= \n");disp(ef) ;
    fprintf("状态反馈矩阵 k = \n");disp(K) ;
    fprintf("黎卡提代数方程的解 P = \n");disp(P) ;
    fprintf("状态反馈矩阵特征值 E = \n");disp(E) ;
    
    1. 仿真结果:
      image
    posted @   相对维度  阅读(846)  评论(1编辑  收藏  举报
    相关博文:
    阅读排行:
    · 物流快递公司核心技术能力-地址解析分单基础技术分享
    · .NET 10首个预览版发布:重大改进与新特性概览!
    · 单线程的Redis速度为什么快?
    · 展开说说关于C#中ORM框架的用法!
    · Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
    点击右上角即可分享
    微信分享提示