LQR控制算法

LQR控制算法

原理

离散型线性系统的状态空间方程为:

上述公式中:

接下来就需要求解上述代价函数的最优解(参考动态规划的思想)

上述代表的是N-1步到最终第N步的代价。

求偏导数的过程如下:



求导最终的化简结果为:

求导的目的是找到极小值,因此令其等于0,则可以求解最优控制策略:

定义反馈矩阵:

可得:

最终可以归纳出最优控制策略的一般形式为:

其中

同时可以归纳出最优剩余代价的一般形式为:

代码示例

matlab 复制代码
%% 清屏
clear;
close all;
clc;
%% 系统定义
%定义系统矩阵A
A = [0 1;-1 -0.5];
%计算系统矩阵A的维度
n = size(A,1);
%定义输入矩阵B
B = [0 ; 1];
C = [0 0;0 0];
D = [0;0];
% 计算输入矩阵B的维度
p = size(B,2);
%% 系统离散
Ts = 0.1;
%% 连续系统转换成离散系统
sys_d = c2d(ss(A,B,C,D),Ts);
%% 提取离散系统A矩阵
A = sys_d.a;
%% 提取离散系统B矩阵
B = sys_d.b;
% 系统初始化
% 状态初始化
x0 = [1 ; 0];
x = x0;
% 输入初始化
u0 = 2;
u = u0;

% 定义系统运行步数
k_steps = 100;
% 定义x_history零矩阵,用于存储系统状态结果,维度n x k_step
x_history = zeros(n,k_steps);
% 将系统状态初始值赋值到x_history矩阵第一个位置
x_history(:,1) = x;
% 定义u_history零矩阵,用于存储系统输入结果 ,维度 p x k_step
u_history = zeros(p,k_steps);
% 将系统输入初始值赋值到u_history矩阵第一个位置
u_history(:,1) = u;
%%%%%%%%%%%%%%%%%%%%%权重设计%%%%%%%%%%%%%%%%%%%%%
% 设计系统状态权重矩阵Q,维度n x n
Q = [1 0; 0 1];
% 设计系统终值权重矩阵S, 维度n x n
S = [1 0; 0 1];
% 设计系统输入权重矩阵R,维度p x p
R = 0.1;

%定义末端时刻
N = k_steps;
P_k = S;
% 计算反馈增益
for k = 1:N
    % 计算F[N-k]
    F = inv(R+B'*P_k*B)*B'*P_k*A;
    % 计算P[k]
    P_k = (A-B*F)'*P_k*(A-B*F)+(F)'*R*(F)+Q;
    if k == 1
        F_N = F;
    else
        F_N = [F;F_N];
    end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 仿真开始,建立for循环
for k = 1 : k_steps
% 计算系统输入
u = -F_N((k-1)*p+1: k * p, :)*x;
% 系统输入带入系统方程,计算系统响应
x = A * x + B * u;
% 保存系统状态到预先定义矩阵的相应位置
x_history(:,k+1) = x;
end

%%%%%%%%%%%%%%%%%%%结果%%%%%%%%%%%%%%%%%%
%% 结果视图:系统状态vs.运行步数
subplot(2, 1, 1);
for i = 1:n
    plot(x_history(i,:));
    hold;
end

legend(num2str((1:n)', 'x %d'));
xlim([1,k_steps]);
grid on

%% 结果视图:系统输入vs.运行步数
subplot (2, 1, 2);
for i = 1:p
    stairs(u_history(i,:));
    hold;
end
legend(num2str((1:p)', 'u %d'));
xlim([1, k_steps]);
grid on;
相关推荐
Promise微笑13 小时前
回路电阻测试仪采购:多维度技术评估与深度避坑指南
开发语言·matlab·语音识别
程高兴1 天前
PMSM基于在线转动惯量辩识的滑模负载转矩观测器MATLAB-SIMULINK仿真模型
开发语言·matlab
2zcode2 天前
项目文档:基于MATLAB低采样率ISAR成像的快速稀疏重建算法研究
开发语言·算法·matlab
matlab代码3 天前
Matlab基于主成分分析PCA人脸识别系统(GUI界面)【源码44期】
开发语言·matlab·人脸识别
Evand J3 天前
【MATLAB例程】一维EKF(扩展卡尔曼滤波)、UKF(无迹卡尔曼滤波)、CKF(容积卡尔曼滤波)、PF(粒子滤波)四种滤波方法对比
开发语言·matlab·ekf·ckf
茗创科技3 天前
CGE连接组:用基因表达解码脑疾病的异质性(附高分文献下载)
python·matlab·脑网络
EW Frontier4 天前
GRAIL-SCML:一种几何正则化自适应集成似然的波达方向估计算法【附MATLAB代码】
matlab·自适应·宽带·doa估计·波达方向估计·几何正则化·窄带
程高兴5 天前
三相维也纳整流器仿真Simulink(解决过零畸变问题)
matlab
通信仿真爱好者5 天前
第【70】期--noma与ofdma在无线网络中的性能对比分析--MATLAB完整代码
matlab·非正交多址接入·noma·ofdma
爱吃提升5 天前
MATLAB impulse函数脉冲响应完整实操教程
开发语言·matlab