github仓库

线性指的是系统是线性的,典型的线性系统的状态方程

x(k+1)=Ax(k)+Bu(k)x(k+1)=Ax(k)+Bu(k)

二次型是指代价函数 JJ 是二次型的。

J=12x(N)TSx(N)+12k=0N1[xT(k)Qx(k)+uT(k)Ru(k)]J=\frac{1}{2} x(N)^TSx(N)+\frac{1}{2}\sum_{k=0}^{N-1}{[x^T(k)Qx(k)+u^T(k)Ru(k)]}

其中前一项中 NN 表示末端时刻, xdx_d 是系统的参考,也就是目标,这个 JJ 是末端代价, SS 为末端状态的权重矩阵,是一个对角阵, QQ 是运行过程中的权重矩阵, RR 是控制量的权重矩阵, SSQQN×NN\times N 的,但是 RRP×PP\times P的,如果对某个元素要求大时可以对应的将 RR 增大,关键的是 SSQQ 都是半正定阵, RR 为正定阵,只有这样系统才会有最小值,即 s0,q0,r>0s≥0,q≥0,r>0

对于一个系统来说,当 xdx_d 为零时,该系统就是一个调节系统,不为零就是一个跟踪系统。

LQR线性二次型调节器

对应的调节二次型的 LQR 的代价函数就是

J=12x(N)TSx(N)+12k=0N1[xT(k)Qx(k)+uT(k)Ru(k)]J=\frac{1}{2} x(N)^TSx(N)+\frac{1}{2}\sum_{k=0}^{N-1}{[x^T(k)Qx(k)+u^T(k)Ru(k)]}

采用逆向分级的方法来进行分析

系统的状态空间方程如下

x(k+1)=Ax(k)+Bu(k)k=0: x(1)=Ax(0)+Bu(0)k=1: x(2)=Ax(1)+Bu(1)=A(Ax(0)+Bu(0))+Bu(1)k=N1: x(N)=Ak+1x(0)+i=0kAkiBu(i)x(k+1)=Ax(k)+Bu(k)\\\\\\ k=0:\ x(1)=Ax(0)+Bu(0)\\\\ k=1:\ x(2)=Ax(1)+Bu(1)=A(Ax(0)+Bu(0))+Bu(1)\\\\ \dots\\\\ k=N-1:\ x(N)=A^{k+1}x(0)+\sum_{i=0}^{k}A^{k-i}Bu(i)

其中 u(n1)u(n-1) 可以使 x(n1)x(n-1) 转化为 x(n)x(n)

那么根据上式也可以得出对应的调节二次型的雅各比矩阵

J=12x(N)TSx(N)+12k=0N1[xT(k)Qx(k)+uT(k)Ru(k)]k=N:JNN=12x(N)TSx(N)=12x(N)TP(0)x(N); S=P(0)k=N1:JN1N=12x(N)TSx(N)+12x(N1)TQx(N1)+12u(N1)TRu(N1)=JNN+12x(N1)TQx(N1)+12u(N1)TRu(N1)k=N2:JN2N=12x(N)TSx(N)+12x(N1)TQx(N1)+12u(N1)TRu(N1)+12x(N2)TQx(N2)+12u(N2)TRu(N2)=JN1N+12x(N2)TQx(N2)+12u(N2)TRu(N2)J=\frac{1}{2} x(N)^TSx(N)+\frac{1}{2}\sum_{k=0}^{N-1}{[x^T(k)Qx(k)+u^T(k)Ru(k)]}\\k=N:J_{N\rightarrow N}^*=\frac{1}{2} x(N)^TSx(N)=\frac{1}{2} x(N)^TP(0)x(N);\ S=P(0)\\k=N-1:J_{N-1\rightarrow N}^* = \frac{1}{2} x(N)^TSx(N)+\frac{1}{2} x(N-1)^TQx(N-1)+\frac{1}{2}u(N-1)^TRu(N-1)=J^*_{N\rightarrow N}+\frac{1}{2} x(N-1)^TQx(N-1)+\frac{1}{2}u(N-1)^TRu(N-1)\\k=N-2:J_{N-2\rightarrow N}^* = \frac{1}{2} x(N)^TSx(N)+\frac{1}{2} x(N-1)^TQx(N-1)+\frac{1}{2}u(N-1)^TRu(N-1)+\frac{1}{2} x(N-2)^TQx(N-2)+\frac{1}{2}u(N-2)^TRu(N-2)\\=J_{N-1\rightarrow N}^*+\frac{1}{2} x(N-2)^TQx(N-2)+\frac{1}{2}u(N-2)^TRu(N-2)

其中标 * 的表示最优解

根据贝尔曼最优理论:

JN2NJ_{N-2→N}为最优时 JN1NJ_{N-1→N}一定为最优的

观察上个式子,对于每一步的最优解都是取决于最后的一部分,因为前一部分的最优是根据上一步的最优来的,所以对于每一步我们只需要求解最后一部分,而且由于 x(k)x(k) 是系统状态量,所以是已知的,根本不需要考虑,因此就是求出最优的 u(k)u(k) 就可以了。所以对于JkNJ_{k→N}的最优解求解就是直接求导,导数为0就可以得到最优控制策略,证明二阶导是一个正定矩阵,所以得到的 u(k)u(k)一定是最优的解。

下面将展示如何求解 u(N1)u(N-1),因为其他的求解方式与之相同,不再赘述

JN1N=12x(N)TSx(N)+12x(N1)TQx(N1)+12u(N1)TRu(N1)=JNN+12x(N1)TQx(N1)+12u(N1)TRu(N1)J_{N-1\rightarrow N}^* = \frac{1}{2} x(N)^TSx(N)+\frac{1}{2} x(N-1)^TQx(N-1)+\frac{1}{2}u(N-1)^TRu(N-1)=J^*_{N\rightarrow N}+\frac{1}{2} x(N-1)^TQx(N-1)+\frac{1}{2}u(N-1)^TRu(N-1)

由上述可知

x(N)=Ax(N1)+Bu(N1)x(N)=Ax(N-1)+Bu(N-1)

所以对应的雅可比矩阵可以转化为

JN1N=12(Ax(N1)+Bu(N1))TP(0)(Ax(N1)+Bu(N1))+12x(N1)TQx(N1)+12u(N1)TRu(N1)J_{N-1\rightarrow N}^* = \frac{1}{2} (Ax(N-1)+Bu(N-1))^TP(0)(Ax(N-1)+Bu(N-1))+\frac{1}{2} x(N-1)^TQx(N-1)+\frac{1}{2}u(N-1)^TRu(N-1)

对上式求导

JN1Nu(N1)=0frist part:12x(N)TP(0)x(N)u(N1)=x(N)u(N1)12x(N)TP(0)x(N)x(N)=BTP(0)x(N)=BTP(0)(Ax(N1)+Bu(N1))second part:12x(N1)TQx(N1)u(N1)=0third part:12u(N1)TRu(N1)u(N1)=Ru(N1)JN1Nu(N1)=BTP(0)(Ax(N1)+Bu(N1))+Ru(N1)\frac{\partial J_{N-1\rightarrow N}}{\partial u(N-1)}=0\\frist\ part: \frac{\partial \frac{1}{2}x(N)^TP(0)x(N)}{\partial u(N-1)}=\frac{\partial x(N)}{\partial u(N-1)}*\frac{\partial \frac{1}{2}x(N)^TP(0)x(N)}{\partial x(N)}=B^T*P(0)x(N)=B^TP(0)(Ax(N-1)+Bu(N-1))\\second\ part:\frac{\partial \frac{1}{2} x(N-1)^TQx(N-1)}{\partial u(N-1)}=0\\third\ part:\frac{\partial \frac{1}{2}u(N-1)^TRu(N-1)}{\partial u(N-1)}=Ru(N-1)\\\frac{\partial J_{N-1\rightarrow N}}{\partial u(N-1)}=B^TP(0)(Ax(N-1)+Bu(N-1))+Ru(N-1)

解得

BTP(0)(Ax(N1)+Bu(N1))+Ru(N1)=0u(N1)=(BTP(0)B+R)1BTP(0)Ax(N1)B^TP(0)(Ax(N-1)+Bu(N-1))+Ru(N-1)=0\\\Rightarrow u^*(N-1)=-(B^TP(0)B+R)^{-1}B^TP(0)Ax(N-1)

F(N1)=(BTP(0)B+R)1BTP(0)AF(N-1)=(B^TP(0)B+R)^{-1}B^TP(0)A,原式化简为

u(N1)=F(N1)x(N1)u^*(N-1)=-F(N-1)x(N-1)

这就是一个全状态的一个反馈控制器。

由于一阶导为0只能证明是极值,所以求解二阶导来验证一下该结果是否为最小值

2JN1Nu(N1)2=(BTP(0)B)T+RT\frac{\partial^2 J_{N-1\rightarrow N}}{\partial u(N-1)^2}=(B^TP(0)B)^T+R^T

由于 RR 是一个正定矩阵,而 BTP(0)BB^TP(0)B 是一个半正定矩阵,所以结果是正定的,因此该结果是最小值

将最优的解带入到代价函数中去,可得到最优的代价

JN1N=12x(N1)T{(ABF(N1))TP(0)(ABF(N1))+F(N1)TRF(N1)+Q}x(N1)J_{N-1\rightarrow N}^* = \frac{1}{2}x(N-1)^T\{(A-BF(N-1))^TP(0)(A-BF(N-1))+F(N-1)^TRF(N-1)+Q\}x(N-1)

P(1)=(ABF(N1))TP(0)(ABF(N1))+F(N1)TRF(N1)+QP(1)=(A-BF(N-1))^TP(0)(A-BF(N-1))+F(N-1)^TRF(N-1)+Q

上式可为

JN1N=12x(N1)TP(1)x(N1)P(1)=(ABF(N1))TP(0)(ABF(N1))+F(N1)TRF(N1)+QJ_{N-1\rightarrow N}^* = \frac{1}{2}x(N-1)^TP(1)x(N-1)\\P(1)=(A-BF(N-1))^TP(0)(A-BF(N-1))+F(N-1)^TRF(N-1)+Q

所以最终可以得到

{JNkN=12x(Nk)TP(k)x(Nk)P(k)=(ABF(Nk))TP(k1)(ABF(Nk))+F(Nk)TRF(Nk)+QF(Nk)=(BTP(k1)B+R)1BTP(k1)A\left\{\begin{aligned}&J^*_{N-k\rightarrow N}=\frac{1}{2}x(N-k)^TP(k)x(N-k)\\&P(k)=(A-BF(N-k))^TP(k-1)(A-BF(N-k))+F(N-k)^TRF(N-k)+Q\\&F(N-k)=(B^TP(k-1)B+R)^{-1}B^TP(k-1)A\end{aligned}\right.

根据递归计算就可以得到所有的状态矩阵了,其中 F[Nk]F[N-k]是反馈增益, u[Nk]u[N-k]是N-k时的最优控制量,也会得到 p[k]p[k]进行下一步的计算,最后需要不断递归计算得到 u[0]u[0]也就是需要使用的输入量。

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
clear all;
close all;
clc;

%%%%%%%%%%系统定义
%定义系统矩阵A
A = [0 1; -1 -0.5];
n = size(A, 1);
%定义系统矩阵B
B = [0; 1];
p = size(B,2);

%%%%%%%%系统离散
%离散时间步长
Ts = 0.1;
%连续系统转为离散系统 不是必须的
%sys_d = c2d(ss(A, B), Ts);
%A = sys_d.a;
%B = sys_d.b;
%%%%%%%%%%系统初始化
%初始状态 可以有多个输入值,这个输入值是一个位移和速度
x0 = [1; 0];
x = x0;
%初始输入
u0 = 2;
u = u0;
%%%%%%%%%%初始化参数
%定义运行步数
k_steps = 100;
%定义存储系统状态结果的矩阵 维度为 n * k_step
x_history = zeros(n, k_steps);
%系统状态赋值存储
x_history(:, 1) = x;%对第一次进行赋值
%定义系统输入状态存储矩阵 p*k_step
u_history = zeros(p, k_steps);
%将系统输入初始赋值
u_history(:, 1) = u;
%%%%%%%%%%权重矩阵设计
%系统状态权重矩阵
Q = [1 0; 0 1];
%系统终值权重矩阵
S = [1 0; 0 1];
%系统输入权重矩阵(单输入)
R = 1;
%p矩阵初始化
p_k = S;
%F_N矩阵计算,可以提前计算好,之后使用,F_N的结果与系统的状态无关,与系统的输入输出也无关
N = k_steps;
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) = 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

LQR线性二次型跟踪器

跟踪二次型系统的LQR的代价函数为

J=12[x(n)xd(n))TS(x(n)xd(n)]+12k=0N1[x(k)xd(k))TΦ(x(k)xd(k))+u(k)TRu(k)]J=\frac{1}{2} [x(n)-x_d(n))^TS(x(n)-x_d(n)]+\frac{1}{2}\sum_{k=0}^{N-1}{[x(k)-x_d(k))^T\Phi (x(k)-x_d(k)) + u(k)^TRu(k)]}

定义系统误差

e(k)=x(k)xd(k)e(k)=x(k)-x_d(k)

跟踪器就是对 e(k)e(k) 的调节器,也就是 ed(k)=0e_d(k)=0

可以定义矩阵的系统状态方程

[x(k+1)xd(k+1)]=[A00A0][x(k)xd(k)]+[B0]u(k)\begin{bmatrix}x(k+1)\\x_d(k+1)\end{bmatrix}=\begin{bmatrix}A&&0\\0&&A_0\end{bmatrix}\begin{bmatrix}x(k)\\x_d(k)\end{bmatrix}+\begin{bmatrix}B\\0\end{bmatrix}u(k)

一般来说跟踪的量是不会改变的,也就是 A0=IA_0=I

可以用一些符号代表矩阵来简化式子

xa(k+1)=Aaxa(k)+Bau(k)x_a(k+1)=A_ax_a(k)+B_au(k)

e(k)=x(k)xd(k)=[II][x(k)xd(k)]=Caxa(k)e(k)=x(k)-x_d(k)=\begin{bmatrix}I&&-I\end{bmatrix}\begin{bmatrix}x(k)\\x_d(k)\end{bmatrix}=C_ax_a(k)

其中

{Aa=[A00A0]Ba=[B0]Ca=[II]\left\{\begin{aligned}&A_a=\begin{bmatrix}A&&0\\0&&A_0\end{bmatrix}\\&B_a=\begin{bmatrix}B\\0\end{bmatrix}\\&C_a=\begin{bmatrix}I&&-I\end{bmatrix}\end{aligned}\right.

对应的代价函数为

J=12e(N)TSe(N)+12k=0N1[eT(k)Qe(k)+uT(k)Ru(k)]J=\frac{1}{2} e(N)^TSe(N)+\frac{1}{2}\sum_{k=0}^{N-1}{[e^T(k)Qe(k)+u^T(k)Ru(k)]}

带入上式为

J=12xa(N)TCaTSCaxa(N)+12k=0N1[xaT(k)CaTQCaxa(k)+uT(k)Ru(k)]J=\frac{1}{2} x_a(N)^TC_a^TSC_ax_a(N)+\frac{1}{2}\sum_{k=0}^{N-1}{[x_a^T(k)C_a^TQC_ax_a(k)+u^T(k)Ru(k)]}

Sa=CaTSCaS_a=C_a^TSC_aQa=CaTQCaQ_a=C_a^TQC_a,得

J=12xa(N)TSaxa(N)+12k=0N1[xaT(k)Qaxa(k)+uT(k)Ru(k)]J=\frac{1}{2} x_a(N)^TS_ax_a(N)+\frac{1}{2}\sum_{k=0}^{N-1}{[x_a^T(k)Q_ax_a(k)+u^T(k)Ru(k)]}

与 LQR 调节器求解过程相同,得最终结果为

{JNkN=12xa(Nk)TPa(k)xa(Nk)Fa(Nk)=(BaTPa(k1)Ba+R)1BaTPa(k1)AaPa(k)=(AaBaFa(Nk))TPa(k1)(AaBaFa(Nk))+Fa(Nk)TRFa(Nk)+Qau(Nk)=Fa(Nk)xa(Nk)\left\{\begin{aligned}&J^*_{N-k\rightarrow N}=\frac{1}{2}x_a(N-k)^TP_a(k)x_a(N-k)\\&F_a(N-k)=(B_a^TP_a(k-1)B_a+R)^{-1}B_a^TP_a(k-1)A_a\\&P_a(k)=(A_a-B_aF_a(N-k))^TP_a(k-1)(A_a-B_aF_a(N-k))+F_a(N-k)^TRF_a(N-k)+Q_a\\&u(N-k)=-F_a(N-k)x_a(N-k)\end{aligned}\right.

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
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;

[A, B]=c2d(A,B,Ts);

x0 = [0; 0];
x = x0;
xd = [1; 0];
xa = [x; xd];

u0 = 2;
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;

AD = eye(n);
Ca = [eye(n) -eye(n)];
Q = [1 0; 0 1];
S = [1 0; 0 1];
R = 0.01;
Sa = Ca' * S * Ca;
Qa = Ca' * Q * Ca;
Aa = [A zeros(n); zeros(n) AD];
Ba = [B; zeros(n, 1)];
p_k = Sa;

for k = 1: k_steps
F = inv(R + Ba'* p_k * Ba) * Ba'* p_k * Aa;
p_k = (Aa-Ba*F)'*p_k*(Aa-Ba*F)+ (F)'*R*(F)+Qa;

%计算系统输入
u = -F * xa;
%系统输入带入系统方程,计算系统响应
x = A * x + B * u;
xa = [x; xd];
%保存系统状态到预先定义矩阵的相应位置
x_history(:, k+1) = x;
%保存系统输入到预先定义矩阵的相应位置
u_history(:, k) = 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

LQR线性二次型跟踪器——稳态非零参考值控制

对于一个系统(这是系统的状态方程的递推形式)

xk+1=Axk+Bukx_{k+1}=Ax_k+Bu_k

由于 LQR线性二次型跟踪器 在应对 R 过大时,也就是太过于注重节能的话,系统的输入就会为 0,这将导致系统不运作,所以有了这个控制模式

对于有些系统,处于某个目标状态并且稳定时,它所需要的输入/输出是一个非 0 的值,这个输入 udu_d 将会使系统保持稳定在目标位置,也就是

xd=Axd+Budx_d=Ax_d+Bu_d

所以需要定义稳态输入误差

Δuk=ukud\Delta u_k=u_k-u_d

带入到状态方程中就是

xk+1=Axk+B(Δuk+ud)=Axk+BΔuk+(IA)xdx_{k+1}=Ax_k+B(\Delta u_k+u_d)=Ax_k+B\Delta u_k+(I-A)x_d

这里的话就可以得到一个增广矩阵,其中 xdx_d 为常数,并且定义误差矩阵

xa[k+1]=[xk+1xd]=[AIA0I][xkxd]+[B0]Δukxa[k+1]=Aaxa[k]+BaΔukek=xkxd=[II][xkxd]=Caxa[k]x_a[k+1]=\begin{bmatrix}x_{k+1}\\x_d\end{bmatrix}=\begin{bmatrix}A&I-A\\0&I\end{bmatrix}\begin{bmatrix}x_k\\x_d\end{bmatrix}+\begin{bmatrix}B\\0\end{bmatrix}\Delta u_k\\\Downarrow\\x_a[k+1]=A_ax_a[k]+B_a\Delta u_k\\e_k=x_k-x_d=\begin{bmatrix}I&-I\end{bmatrix}\begin{bmatrix}x_k\\x_d\end{bmatrix}=C_ax_a[k]

列出代价函数,前面部分的计算都是与线性二次型跟踪器是一致的,只有第二部分是不一样的,这里的代价函数为

J=12e(N)TSe(N)+12k=0N1[eT(k)Qe(k)+ΔuT(k)RΔu(k)]J=\frac{1}{2} e(N)^TSe(N)+\frac{1}{2}\sum_{k=0}^{N-1}{[e^T(k)Qe(k)+\Delta u^T(k)R\Delta u(k)]}

Sa=CaTSCaS_a=C_a^TSC_aQa=CaTQCaQ_a=C_a^TQC_a,得

J=12xa(N)TSaxa(N)+12k=0N1[xaT(k)Qaxa(k)+ΔuT(k)RΔu(k)]J=\frac{1}{2} x_a(N)^TS_ax_a(N)+\frac{1}{2}\sum_{k=0}^{N-1}{[x_a^T(k)Q_ax_a(k)+\Delta u^T(k)R\Delta u(k)]}

其中第二项就表示系统的稳态输入误差,表示输入偏离目标位置的距离

与 LQR 调节器求解过程相同,得最终结果为

{JNkN=12xa(Nk)TPa(k)xa(Nk)Fa(Nk)=(BaTPa(k1)Ba+R)1BaTPa(k1)AaPa(k)=(AaBaFa(Nk))TPa(k1)(AaBaFa(Nk))+Fa(Nk)TRFa(Nk)+QaΔu(Nk)=Fa(Nk)xa(Nk)u(Nk)=ud+Δu(Nk)\left\{\begin{aligned}&J^*_{N-k\rightarrow N}=\frac{1}{2}x_a(N-k)^TP_a(k)x_a(N-k)\\&F_a(N-k)=(B_a^TP_a(k-1)B_a+R)^{-1}B_a^TP_a(k-1)A_a\\&P_a(k)=(A_a-B_aF_a(N-k))^TP_a(k-1)(A_a-B_aF_a(N-k))+F_a(N-k)^TRF_a(N-k)+Q_a\\&\Delta u(N-k)=-F_a(N-k)x_a(N-k)\\&u(N-k)=u_d+\Delta u(N-k)\end{aligned}\right.

LQR线性二次型跟踪器——输入增量控制

上述中 xdx_d 是一个常数,所以这里讨论 xdx_d 为非常数的变化,并且设置

xd[k+1]=Adxd[k]x_d[k+1]=A_dx_d[k]

定义一个 uu 的增量

Δuk=ukuk1uk=Δuk+uk1\Delta u_k=u_k-u_{k-1}\\u_k=\Delta u_k+u_{k-1}

这个可以使得系统的输入更加平滑,输入的变化不那么剧烈。带入到系统状态方程中

xk+1=Axk+BΔuk+uk1x_{k+1}=Ax_k+B\Delta u_k+u_{k-1}

此时设置增广矩阵

xa[k]=[xkxd[k]uk1]ek=xkxd[k]=[II0][xkxd[k]uk1]=Caxa[k]x_a[k]=\begin{bmatrix}x_{k}\\x_d[k]\\u_{k-1}\end{bmatrix}\\\Downarrow\\e_k=x_k-x_d[k]=\begin{bmatrix}I&-I&0\end{bmatrix}\begin{bmatrix}x_{k}\\x_d[k]\\u_{k-1}\end{bmatrix}=C_ax_a[k]

并且可以得到系统的递归函数

xa[k+1]=[xk+1xd[k+1]uk]=[A0B0Ad000I][xkxd[k]uk1]+[B0I]Δukx_a[k+1]=\begin{bmatrix}x_{k+1}\\x_d[k+1]\\u_{k}\end{bmatrix}=\begin{bmatrix}A&0&B\\0&A_d&0\\0&0&I\end{bmatrix}\begin{bmatrix}x_k\\x_d[k]\\u_{k-1}\end{bmatrix}+\begin{bmatrix}B\\0\\I\end{bmatrix}\Delta u_k

系统的代价函数可以设计为

J=12e(N)TSe(N)+12k=0N1[eT(k)Qe(k)+ΔuT(k)RΔu(k)]J=\frac{1}{2} e(N)^TSe(N)+\frac{1}{2}\sum_{k=0}^{N-1}{[e^T(k)Qe(k)+\Delta u^T(k)R\Delta u(k)]}

Sa=CaTSCaS_a=C_a^TSC_aQa=CaTQCaQ_a=C_a^TQC_a,得

J=12xa(N)TSaxa(N)+12k=0N1[xaT(k)Qaxa(k)+ΔuT(k)RΔu(k)]J=\frac{1}{2} x_a(N)^TS_ax_a(N)+\frac{1}{2}\sum_{k=0}^{N-1}{[x_a^T(k)Q_ax_a(k)+\Delta u^T(k)R\Delta u(k)]}

与 LQR 调节器求解过程相同,得最终结果为

{JNkN=12xa(Nk)TPa(k)xa(Nk)Fa(Nk)=(BaTPa(k1)Ba+R)1BaTPa(k1)AaPa(k)=(AaBaFa(Nk))TPa(k1)(AaBaFa(Nk))+Fa(Nk)TRFa(Nk)+QaΔu(Nk)=Fa(Nk)xa(Nk)u(Nk)=u(Nk1)+Δu(Nk)\left\{\begin{aligned}&J^*_{N-k\rightarrow N}=\frac{1}{2}x_a(N-k)^TP_a(k)x_a(N-k)\\&F_a(N-k)=(B_a^TP_a(k-1)B_a+R)^{-1}B_a^TP_a(k-1)A_a\\&P_a(k)=(A_a-B_aF_a(N-k))^TP_a(k-1)(A_a-B_aF_a(N-k))+F_a(N-k)^TRF_a(N-k)+Q_a\\&\Delta u(N-k)=-F_a(N-k)x_a(N-k)\\&u(N-k)=u(N-k-1)+\Delta u(N-k)\end{aligned}\right.

LQR线性二次调节器——系统输入线性化

这一部分实际上就是工程上比较常用的,将 LQR 控制器的输入 u 定义为 u=Keu=-Ke 的形式,一种线性反馈控制器,最后成为一个近似于 PD 控制器

连续系统

x˙=Ax+Bue=xdxxd˙=Adxd\dot{x}=Ax+Bu\\e=x_d-x\\\dot{x_d}=A_dx_d

定义连续系统代价函数,由于 t,e0t→\infty, e→0

J=12eT(tf)Se(tf)+120tf[eTQe+uTRu]dtJ=\frac{1}{2} e^T(t_f)Se(t_f)+\frac{1}{2}\int_{0}^{t_f}{[e^TQe+u^TRu]}dt

e(k)=x(k)xd(k)=[II][x(k)xd(k)]=Caxa(k)e(k)=x(k)-x_d(k)=\begin{bmatrix}I&&-I\end{bmatrix}\begin{bmatrix}x(k)\\x_d(k)\end{bmatrix}=C_ax_a(k)

设计最优控制

u=Ke=KCaxau=-Ke=-KC_ax_a

可以得到

x˙a=[A00Ad]xa+[B0]u=[ABKCa00Ad]xax˙a=Acxa+Bcu=Aaxa\dot{x}_a=\begin{bmatrix}A&0\\0&A_d\end{bmatrix}x_a+\begin{bmatrix}B\\0\end{bmatrix}u=\begin{bmatrix}A-BKC_a&0\\0&A_d\end{bmatrix}x_a\\\dot{x}_a=A_cx_a+B_cu=A_ax_a

其中

{Aa=[A00A0]Ba=[B0]Ca=[II]\left\{\begin{aligned}&A_a=\begin{bmatrix}A&&0\\0&&A_0\end{bmatrix}\\&B_a=\begin{bmatrix}B\\0\end{bmatrix}\\&C_a=\begin{bmatrix}I&&-I\end{bmatrix}\end{aligned}\right.

对应的代价函数为

J=12e(tf)TSe(tf)+120tf[eTQe+uTRu]dtJ=\frac{1}{2} e(t_f)^TSe(t_f)+\frac{1}{2}\int_{0}^{t_f}{[e^TQe+u^TRu]}dt

带入上式为

J=12xa(tf)TCaTSCaxa(tf)+120tf[xaTCaTQCaxa+uTRu]dtJ=\frac{1}{2} x_a(t_f)^TC_a^TSC_ax_a(t_f)+\frac{1}{2}\int_{0}^{t_f}{[x_a^TC_a^TQC_ax_a+u^TRu]}dt

Sa=CaTSCaS_a=C_a^TSC_aQa=CaTQCaQ_a=C_a^TQC_a,得

J=12xaT(tf)Saxa(tf)+120tf[xaTQaxa+uTRu]dtJ=\frac{1}{2} x_a^T(t_f)S_ax_a(t_f)+\frac{1}{2}\int_{0}^{t_f}{[x_a^TQ_ax_a+u^TRu]}dt

u=Keu=-Ke 带入到代价函数中去

J=12xaT(tf)Saxa(tf)+120tfxaT(Qa+KTRK)xadtJ=\frac{1}{2} x_a^T(t_f)S_ax_a(t_f)+\frac{1}{2}\int_{0}^{t_f}{x_a^T(Q_a+K^TRK)x_a}dt

第一种解法

可以假设存在一个向量 P,使得

ddt(xaTPxa)=xaT(Qa+KTRK)xa  1\frac{d}{dt}(x_a^TPx_a)=-x_a^T(Q_a+K^TRK)x_a~~\text{\textcircled{1}}

假设系统是稳定的(实际上需要验证),带入代价函数中得到

J=12xaT(0)Pxa(0)J=\frac{1}{2}x^T_a(0)Px_a(0)

将 1 式左侧微分展开,并且把 xax_a 微分形式替换

x˙aTPxa+xaTPx˙a+xaT(Qa+KTRK)xa=0xaTAaTPxa+xaTPAaxa+xaT(Qa+KTRK)xa=0xaT(AaTP+PAa+Qa+KTRK)xa=0\dot{x}_a^TPx_a+x_a^TP\dot{x}_a+x_a^T(Q_a+K^TRK)x_a=0\\x_a^TA_a^TPx_a+x_a^TPA_ax_a+x_a^T(Q_a+K^TRK)x_a=0\\x_a^T(A_a^TP+PA_a+Q_a+K^TRK)x_a=0

要想式子成立,括号里必须始终为 0

AaTP+PAa+Qa+KTRK=0A_a^TP+PA_a+Q_a+K^TRK=0

这就是 RiccatiRiccati 方程

第二种解法

J=12xaT(tf)Saxa(tf)+120tf[xaTQaxa+uTRu]dtJ=\frac{1}{2} x_a^T(t_f)S_ax_a(t_f)+\frac{1}{2}\int_{0}^{t_f}{[x_a^TQ_ax_a+u^TRu]}dt

由于函数第一项是恒定的数值,所以只考虑第二项的最小值就好,也就是

min0tf[xaTQaxa+uTRu]dtmin\int_{0}^{t_f}{[x_a^TQ_ax_a+u^TRu]}dt

引入哈密顿函数

H=f(xa,u)+λg(xa,u)=xaTQaxa+uTRu+λ(Acxa+Bcu)H=f(x_a,u)+\lambda g(x_a,u)=x_a^TQ_ax_a+u^TRu+\lambda(A_cx_a+B_cu)

Hu=(R+RT)u+BcTλ=0u=(R+RT)1BcTλ\frac{\partial H}{\partial u}=(R+R^T)u+B_c^T\lambda=0\\\Downarrow\\u=-(R+R^T)^{-1}B_c^T\lambda

Hx=(fx+λgx)=[(Qa+QaT)xa+ATλ]=λ˙Hλ=g=Acxa+Bcu=AcxBc(R+RT)1BcTλ=x˙a-\frac{\partial H}{\partial x}=-(f_x+\lambda g_x)=-[(Q_a+Q_a^T)x_a+A^T\lambda]=\dot\lambda\\\frac{\partial H}{\partial \lambda}=g=A_cx_a+B_cu=A_cx-B_c(R+R^T)^{-1}B_c^T\lambda=\dot{x}_a

由于我们设定 u=Kxau=-Kx_a,所以可以知道 λ=Pxa\lambda=Px_a,并且 (R+RT)1BcTP=K-(R+R^T)^{-1}B_c^TP=K

带入上述的方程得到

λ˙=[(Qa+QaT)xa+AcTλ]=(Qa+QaT+AcTP)xax˙a=AcxBc(R+RT)1BcTλ=[AcBc(R+RT)1BcTP]xa\dot\lambda=-[(Q_a+Q_a^T)x_a+A_c^T\lambda]=-(Q_a+Q_a^T+A_c^TP)x_a\\\dot{x}_a=A_cx-B_c(R+R^T)^{-1}B_c^T\lambda=[A_c-B_c(R+R^T)^{-1}B_c^TP]x_a

联立得到

λ˙=P˙xa+Px˙a=[P˙+P(AcBc(R+RT)1BcTP)]xa=(Qa+QaT+AcTP)xa\dot{\lambda}=\dot{P}x_a+P\dot{x}_a=[\dot{P}+P(A_c-B_c(R+R^T)^{-1}B_c^TP)]x_a=-(Q_a+Q_a^T+A_c^TP)x_a

所以得到

P˙+PAcPBc(R+RT)1BcTP+Qa+QaT+AcTP=0\dot{P}+PA_c-PB_c(R+R^T)^{-1}B_c^TP+Q_a+Q_a^T+A_c^TP=0

Q1=Qa+QaT,Q2=R+RTQ_1=Q_a+Q_a^T,Q_2=R+R^T,得到

P˙+PAcPBcQ21BcTP+Q1+AcTP=0\dot{P}+PA_c-PB_cQ_2^{-1}B_c^TP+Q_1+A_c^TP=0

最终得到一个 RiccatiRiccati 方程

总结

输入系统线性化相当于是得到了一个线性的输入, u=Kxu=-Kx 这个 KK 可以通过解算 RiccatiRiccati 方程得到解,并且将会是一个固定的常数,所以最终的控制有点像 PD 控制器

但是 RiccatiRiccati 方程是一个由许多解的方程,所以不容易手算出来,所以在 matlab 中直接调用 lqr 函数就可以得到对应的 KK