线性二次最优控制-输出跟踪器matlab
- 线性时变系统输出跟踪器
1.2 线性时变系统输出跟踪器设计步骤
2.1 线性定常系统输出跟踪器设计步骤
3.算例
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) ;
- 仿真结果:
本文来自博客园,作者:相对维度,转载请注明原文链接:https://www.cnblogs.com/wangjirui/p/16581219.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库