最优控制-LQR-drcan-3
一、理论知识
视频教程链接:drcan老师
LQR的全称是线性二次型调节器(Linear Quadratic Regulator)
Linear线性,指的是LQR需要一个线性模型,这个模型通常用一组动态方程和输出方程描述系统。如果一个系统满足线性定理,那么它所遵循的动态可以表示为线性方程。其中,“线性”一词指的是,当每个输入变量与某个参数按比例变化时,输出变量也会相应按比例变化
Quadratic二次,是指二次代价函数的意思。在LQR控制的过程中,通过设计一个二次型的代价函数来描述控制系统的性能指标,并通过最小化该二次型代价函数来实现系统的优化调节。
LQR不是一种控制器?
PID(比例-积分-微分)控制器是一种经典的反馈控制器,它本身就是一种控制器。而LQR(线性二次型调节)是进行最优控制设计的一种方法,在其中,我们需要使用数学工具帮助我们计算出一个反馈矩阵来实现最优的状态反馈控制
龙胆也老师知乎





二、编程实现
1.Code 1–迭代方法
通过对模型进行建模,得到反馈增益矩阵,编程实现控制过程
LQR_Gain.m
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
clear all; close all; clc;
A = [0 1;-1 -0.5];
n = size(A,1);
B = [0;1];
p = size(B,2);
Ts = 0.1;
C = zeros(1,size(A,2)); D = 0; sys = ss(A,B,C,D);
sys_d = c2d(sys,Ts);
A = sys_d.a;
B = sys_d.b;
x0 = [1;0]; x = x0;
u0 = 0; u = u0;
k_steps = 100;
x_history = zeros(n,k_steps);
x_history(:,1) = x;
u_history = zeros(p,k_steps);
u_history(:,1) = u;
Q = [1 0;0 1];
S = [1 0;0 1];
R = 0.1;
N = k_steps; P_k = S;
for k = 1:N F = inv(R+B'*P_k*B)*B'*P_k*A; 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 k = 1 : k_steps u = -F_N((k-1)*p+1:k*p,:)* x; x = A * x + B * u; x_history(:,k+1) = x; u_history(:,k+1) = u; end
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;
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;
|
运行结果
模型的目标状态为0,最后使得系统从初始状态趋于0状态

2.Code 2–LQR封装函数
F1_LQR_Gain().m
迭代次数非常大的时候,可以得到LQR实现过程中的反馈增益矩阵,会趋近一个常数矩阵,将LQR控制方法封装为一个函数,得到最后的常数矩阵
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 50 51 52 53 54 55 56
|
function [F] = F1_LQR_Gain(A,B,Q,R,S);
n = size(A,1);
p = size(B,2);
P0 = S;
max_iter= 200;
P = zeros(n,n*max_iter);
P(:,1:n) = P0;
P_k_min_1 = P0;
tol = 1e-3;
diff = Inf;
F_N_min_k = Inf;
k = 1;
while diff > tol F_N_min_k_pre = F_N_min_k; F_N_min_k = inv(R+B'*P_k_min_1*B)*B'*P_k_min_1*A; P_k = (A-B*F_N_min_k)'*P_k_min_1*(A-B*F_N_min_k) + (F_N_min_k)'*R*(F_N_min_k) + Q; P(:,n*k-n+1:n*k) = P_k; P_k_min_1 = P_k; diff = abs(max(F_N_min_k - F_N_min_k_pre)); k = k+1; if k > max_iter error("Maximum Number of Iterations Exceeded"); end end
fprintf('No. of Interation is %d \n',k);
F = F_N_min_k; end
|
3.Code 3 – 函数测试(单个输入)
LQR_Test_Function.m
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
clear all; close all; clc;
A = [0 1;-1 -0.5];
n = size(A,1);
B = [0;1];
p = size(B,2);
Ts = 0.1;
C = zeros(1,size(A,2)); D = 0; sys = ss(A,B,C,D);
sys_d = c2d(sys,Ts);
A = sys_d.a;
B = sys_d.b;
x0 = [1;0]; x = x0;
u0 = 0; u = u0;
k_steps = 100;
x_history = zeros(n,k_steps);
x_history(:,1) = x;
u_history = zeros(p,k_steps);
u_history(:,1) = u;
Q = [1 0;0 1];
S = [1 0;0 1];
R = 0.1;
N = k_steps; P_k = S;
[F] = F1_LQR_Gain(A,B,Q,R,S);
for k = 1 : k_steps u = - F * x; x = A * x + B * u; x_history(:,k+1) = x; u_history(:,k+1) = u; end
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;
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;
|
运行结果

4.Code 4 – 函数测试(多个输入)
LQR_Test_Function_M_Input.m
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
clear all; close all; clc;
A = [0 1;-1 -0.5];
n = size(A,1);
B = [0 0.2;-0.1 0.5];
p = size(B,2);
Ts = 0.1;
C = zeros(1,size(A,2)); D = 0; sys = ss(A,B,C,D);
sys_d = c2d(sys,Ts);
A = sys_d.a;
B = sys_d.b;
x0 = [1;0]; x = x0;
u0 = 0; u = u0;
k_steps = 100;
x_history = zeros(n,k_steps);
x_history(:,1) = x;
u_history = zeros(p,k_steps);
u_history(:,1) = u;
Q = [1 0;0 1];
S = [1 0;0 1];
R = [0.1 0;0,0.1];
N = k_steps; P_k = S;
[F] = F1_LQR_Gain(A,B,Q,R,S);
for k = 1 : k_steps u = - F * x; x = A * x + B * u; x_history(:,k+1) = x; u_history(:,k+1) = u; end
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;
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;
|
运行结果
