目录
前言
致谢 【模型预测控制(2022春)lecture 4-1 Robust MPC】
针对存在外界干扰的约束系统:
x k + 1 = A x k + B u k + D w k (1) x_{k+1} = Ax_k + Bu_k + Dw_k \tag{1} xk+1=Axk+Buk+Dwk(1)
其中, x k ∈ R n x_k \in \mathbb{R}^n xk∈Rn 是系统状态, u k ∈ R p u_k \in \mathbb{R}^p uk∈Rp 是系统的输入, u k ∈ U u_k \in \mathcal{U} uk∈U, w k w_k wk 是有界的干扰.
针对以上系统,由于干扰是无法预计的,故只能通过名义系统来设计名义MPC,
并在此基础上增加误差反馈控制,使名义系统状态与真实状态的误差有界。
一、误差反馈控制
1.1 名义系统与误差反馈控制
令 z 0 = x 0 z_0 = x_0 z0=x0,记系统 (1) 的名义系统为:
z k + 1 = A z k + B v k (2) z_{k+1} = Az_{k} + Bv_k \tag{2} zk+1=Azk+Bvk(2)
针对该系统,可设计MPC得到控制输入 v k v_k vk,但名义系统与真实系统存在差异。
故定义误差为 e k = x k − z k e_k = x_k - z_k ek=xk−zk,在 v k v_k vk基础上增加误差反馈控制来保证误差有界,有:
u k = v k − K e k (3) u_k = v_k - Ke_k \tag{3} uk=vk−Kek(3)
由式 (1) 减 式(2) 得误差状态方程:
e k + 1 = ( A − B K ) e k + D w k (4) e_{k+1} = (A - BK)e_k + Dw_k \tag{4} ek+1=(A−BK)ek+Dwk(4)
由于干扰项的存在,系统误差不能稳定到 0,但只要干扰强度在可控范围内,
令 ∣ e i g ( A − B K ) < 1 ∣ |\mathrm{eig}(A-BK)<1| ∣eig(A−BK)<1∣,可保证误差有界(即系统稳定但不是渐近稳定).
1.2 误差分析
由式 (4),记 A K = A − B K A_K = A-BK AK=A−BK,有:
e 0 = x 0 − z 0 = 0 e 1 = A K e 0 + D w 0 = D w 0 e 2 = A K e 1 + D w 1 = A K D w 0 + D w 1 e 3 = A K e 2 + D w 3 = A K 2 D w 0 + A D w 1 + D w 2 ⋮ e k = ∑ i = 1 k A K i − 1 D w k − i \begin{align*} e_0 &= x_0 - z_0 = 0 \\ e_1 &= A_Ke_0 + Dw_0 = Dw_0 \\ e_2 &= A_Ke_1 + Dw_1 = A_KDw_0 + Dw_1 \\ e_3 &= A_Ke_2 + Dw_3 = A_K^2Dw_0 + ADw_1 + Dw_2 \\ &\vdots \\ e_k &= \sum_{i=1}^{k} A_K^{i-1} Dw_{k-i} \end{align*} e0e1e2e3ek=x0−z0=0=AKe0+Dw0=Dw0=AKe1+Dw1=AKDw0+Dw1=AKe2+Dw3=AK2Dw0+ADw1+Dw2⋮=i=1∑kAKi−1Dwk−i
因为 ∣ e i g ( A K ) < 1 ∣ |\mathrm{eig}(A_K)<1| ∣eig(AK)<1∣,误差是有限的,记 w k ∈ W w_k \in \mathcal{W} wk∈W,有:
e k = ∑ i = 1 k A K i − 1 D w k − i ∈ ∑ i = 1 k A K i − 1 D W ⊂ ∑ i = 1 ∞ A K i − 1 D W ≜ Γ e_k = \sum_{i=1}^{k} A_K^{i-1} Dw_{k-i} \in \sum_{i=1}^{k} A_K^{i-1} D \mathcal{W} \sub \sum_{i=1}^{\infty} A_K^{i-1} D \mathcal{W} \triangleq \Gamma ek=i=1∑kAKi−1Dwk−i∈i=1∑kAKi−1DW⊂i=1∑∞AKi−1DW≜Γ
即 e k ∈ Γ e_k \in \Gamma ek∈Γ,且 Γ \Gamma Γ 是有界的。
Γ \Gamma Γ 计算:
由于 ∣ e i g ( A K ) < 1 ∣ |\mathrm{eig}(A_K)<1| ∣eig(AK)<1∣,存在 N c N_c Nc 使:
A K N c D W ⊂ α D W (5) A_K^{N_c}D \mathcal{W} \sub \alpha D \mathcal{W} \tag{5} AKNcDW⊂αDW(5)
其中 A K N c D W A_K^{N_c}D \mathcal{W} AKNcDW 和 D W D \mathcal{W} DW 是维数相同的列向量,常数 α ∈ [ 0 , 1 ) \alpha \in [0,~1) α∈[0, 1) .
有:
Γ = ∑ i = 1 ∞ A K i − 1 D W = Γ N c + ∑ i = N c + 1 ∞ A K i − 1 D W = Γ N c + ∑ i = 1 ∞ A K i − 1 A K N c D W ⊂ Γ N c + ∑ i = 1 ∞ A K i − 1 α D W = Γ N c + α Γ \begin{align*} \Gamma &= \sum_{i = 1}^\infty A_K^{i-1} D \mathcal{W} \\ &= \Gamma_{N_c} + \sum_{i = N_c + 1}^\infty A_K^{i-1} D \mathcal{W} \\ &= \Gamma_{N_c} + \sum_{i = 1}^\infty A_K^{i-1} A_K^{N_c} D \mathcal{W} \\ &\sub \Gamma_{N_c} + \sum_{i = 1}^\infty A_K^{i-1} \alpha D \mathcal{W} \\ &= \Gamma_{N_c} + \alpha \Gamma \end{align*} Γ=i=1∑∞AKi−1DW=ΓNc+i=Nc+1∑∞AKi−1DW=ΓNc+i=1∑∞AKi−1AKNcDW⊂ΓNc+i=1∑∞AKi−1αDW=ΓNc+αΓ
其中 Γ N c = ∑ i = 1 N c A K i − 1 D W \Gamma_{N_c} = \sum_{i = 1}^{N_c} A_K^{i-1} D \mathcal{W} ΓNc=∑i=1NcAKi−1DW,有:
Γ ⊂ ( 1 − α ) − 1 Γ N c (6) \Gamma \sub (1 - \alpha)^{-1}\Gamma_{N_c} \tag{6} Γ⊂(1−α)−1ΓNc(6)
可通过上式计算保守的 Γ \Gamma Γ 范围。
二、名义MPC设计 (nomianal MPC)
2.1 预测模型
根据名义系统,未来 N N N 步的状态可表示为:
Z k = G z ( 0 ∣ k ) + H V k (7) Z_k = \mathcal{G}z_{(0|k)} + \mathcal{H}V_k \tag{7} Zk=Gz(0∣k)+HVk(7)
其中,
Z k = [ z ( 1 ∣ k ) z ( 2 ∣ k ) ⋯ z ( N ∣ k ) ] T V k = [ v ( 0 ∣ k ) v ( 1 ∣ k ) ⋯ v ( N − 1 ∣ k ) ] T G = [ A A 2 ⋯ A N ] T H = [ B 0 0 ⋯ 0 A B B 0 ⋯ 0 A 2 B A B B ⋯ 0 ⋮ ⋮ ⋮ ⋱ ⋮ A N − 1 B A 2 B A B ⋯ B ] \begin{align*} Z_k &= [z_{(1|k)} ~ z_{(2|k)} ~ \cdots~z_{(N|k)}]^T \\ V_k &= [v_{(0|k)} ~ v_{(1|k)} ~ \cdots~v_{(N-1|k)}]^T \\ \mathcal{G} &= \left[ A ~ A^2 ~\cdots ~ A^N \right]^T \\ \mathcal{H} &= \begin{bmatrix} B & 0 & 0 & \cdots & 0\\ AB & B & 0 & \cdots & 0\\ A^2B & AB & B & \cdots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ A^{N-1}B & A^2B & AB & \cdots & B \end{bmatrix} \end{align*} ZkVkGH=[z(1∣k) z(2∣k) ⋯ z(N∣k)]T=[v(0∣k) v(1∣k) ⋯ v(N−1∣k)]T=[A A2 ⋯ AN]T=
BABA2B⋮AN−1B0BAB⋮A2B00B⋮AB⋯⋯⋯⋱⋯000⋮B
2.2 代价函数设计
代价函数矩阵形式为:
J k = Z k T Q Z k + V k T R V k (8) J_k = Z_k^T\mathcal{Q}Z_k + V_k^T\mathcal{R}V_k \tag{8} Jk=ZkTQZk+VkTRVk(8)
其中 Q = d i a g ( Q , Q , ⋯ , Q , P ) \mathcal{Q} = \mathrm{diag}(Q,Q, \cdots, Q, P) Q=diag(Q,Q,⋯,Q,P), R = d i a g ( R , R , ⋯ , R ) \mathcal{R} = \mathrm{diag}(R, R, \cdots, R) R=diag(R,R,⋯,R).
将式 (5) 代入上式,有:
J k = ( G z ( 0 ∣ k ) ) T Q ′ G z ( 0 ∣ k ) + 2 z ( 0 ∣ k ) T G T Q ′ H V k + V k T ( H T Q ′ H + R ) V k J_k = (\mathcal{G}z_{(0|k)})^T \mathcal{Q}^\prime \mathcal{G}z_{(0|k)} + 2z_{(0|k)}^T\mathcal{G}^T \mathcal{Q}^\prime \mathcal{H} V_k + V_k^T (\mathcal{H}^T \mathcal{Q}^\prime \mathcal{H} + \mathcal{R})V_k Jk=(Gz(0∣k))TQ′Gz(0∣k)+2z(0∣k)TGTQ′HVk+VkT(HTQ′H+R)Vk
2.3 约束构建
2.3.1 系统约束
为了满足:
u k ∈ U u_k \in \mathcal{U} uk∈U
其中 u k = v k − K e k u_k = v_k - Ke_k uk=vk−Kek, K e k ∈ K Γ Ke_k \in K\Gamma Kek∈KΓ,需满足:
v k ∈ U ∖ − K Γ v_k \in \mathcal{U} \setminus -K\Gamma vk∈U∖−KΓ
若存在状态约束,要求 x ∈ X x \in \mathcal{X} x∈X,可使 z ∈ Z = X − Γ z \in \mathcal{Z} = \mathcal{X} - \Gamma z∈Z=X−Γ 来满足要求。
2.3.2 终端约束
在 【MPC】模型预测控制笔记 (4):约束输出反馈MPC 的终端约束中,
令每一周期 z ^ ( 0 ∣ k ) = x ^ ( 0 ∣ k ) \hat{z}_{(0|k)} = \hat{x}_{(0|k)} z^(0∣k)=x^(0∣k),需要对真实系统的 x ( N ∣ k ) x_{(N|k)} x(N∣k) 进行约束,以保证下一周期的迭代可行性。
但在本文中,仅在 k = 0 k=0 k=0 时刻,有 z 0 = x 0 z_0 = x_0 z0=x0,后续 z k z_k zk 状态是根据名义系统 (2) 进行更新的,
故直接约束 z ( N ∣ k ) z_{(N|k)} z(N∣k) 即可.
使终端 z ( N ∣ k ) z_{(N|k)} z(N∣k) 进去不变集 Ω z \Omega_z Ωz,且要求该集合内存在最优输入 v k = − K z k v_k=-Kz_k vk=−Kzk, u k = v k − K e k u_k = v_k - Ke_k uk=vk−Kek 始终满足输入约束 U \mathcal{U} U:
z ( N ∣ k ) ∈ Ω z (9) z_{(N|k)} \in \Omega_z \tag{9} z(N∣k)∈Ωz(9)
讨论:如果每一周期令 z ( 0 ∣ k ) = x ( 0 ∣ k ) z_{(0|k)} = x_{(0|k)} z(0∣k)=x(0∣k),系统会怎样呢?
此时, e k e_k ek 将始终为 0,控制约束变为 v k ∈ U v_k \in \mathcal{U} vk∈U,但需针对 x ( N ∣ k ) x_{(N|k)} x(N∣k) 进行终端约束。
使终端 x ( N ∣ k ) x_{(N|k)} x(N∣k) 进去不变集 Ω x \Omega_x Ωx,且要求该集合内存在最优输入 v k = − K z k v_k=-Kz_k vk=−Kzk 始终满足输入约束 U \mathcal{U} U:
x ( N ∣ k ) = x ( N ∣ k ) + e N ∈ Ω x x_{(N|k)} = x_{(N|k)} + e_N \in \Omega_x x(N∣k)=x(N∣k)+eN∈Ωx
有:
z ( N ∣ k ) ∈ Ω x − Γ z_{(N|k)} \in \Omega_x - \Gamma z(N∣k)∈Ωx−Γ
x k x_{k} xk 是在干扰下更新的,不变集 Ω x \Omega_x Ωx 可能会更难确定?
2.4 构建二次规划求解
最优控制序列可根据实际系统,构建二次规划问题求解:
V ∗ = a r g min V k J k s . t . v k ∈ U ∖ − K Γ v k + i ∈ U , i = 1 , 2 , ⋯ z ( N ∣ k ) ∈ Ω ′ \begin{align*} & \hspace{-0.2cm }V^* = \mathrm{arg} \min_{V_k} J_k \\ \mathrm{s. t.}& \quad v_k \in \mathcal{U} \setminus -K\Gamma \\ & \hspace{-0.4cm} v_{k+i} \in \mathcal{U} , \quad i = 1,2,\cdots\\ & \hspace{0.3cm} z_{(N|k)} \in \Omega^\prime \end{align*} s.t.V∗=argVkminJkvk∈U∖−KΓvk+i∈U,i=1,2,⋯z(N∣k)∈Ω′
三、稳定性分析
由 1.2 知 e k ∈ Γ e_k \in \Gamma ek∈Γ 是有界的,而名义MPC系统中, z k z_k zk 是渐近稳定的(可参考【MPC】模型预测控制笔记 (2):约束MPC),
故 x k = e k + z k x_k = e_k + z_k xk=ek+zk 也是最终有界的:
lim k → ∞ z k → 0 ⇒ lim k → ∞ x k = lim k → ∞ e k ∈ Γ \begin{align*} \lim_{k \to \infty} z_k \to 0 \Rightarrow \lim_{k \to \infty} x_k = \lim_{k \to \infty} e_k \in \Gamma \end{align*} k→∞limzk→0⇒k→∞limxk=k→∞limek∈Γ
四、MATLAB实例
针对系统 (1),设系统中 A = [ 1.1 2 0 0.95 ] A = \begin{bmatrix} 1.1 & 2 \\ 0 & 0.95 \end{bmatrix} A=[1.1020.95], B = [ 0 0.079 ] B = \begin{bmatrix} 0 \\ 0.079 \end{bmatrix} B=[00.079], D = [ 0.1 0.5 ] D = \begin{bmatrix} 0.1 \\ 0.5 \end{bmatrix} D=[0.10.5], − 4 ≤ u k ≤ 4 -4 \le u_k \le 4 −4≤uk≤4, − 0.1 ≤ w k ≤ 0.1 -0.1 \le w_k \le 0.1 −0.1≤wk≤0.1.
4.1 设计误差反馈增益
使用LQR(可参考离散LQR原理)设计最优误差反馈增益:
A = [1.1 2;0 0.95];
B = [0; 0.079];
Q = eye(2);
R = 0.1;
K = LQR(A, B, Q, R, 500, 1e-6);
disp(abs(eig(A-B*K)))
%%
function K = LQR(A, B, Q, R, maxIter, eps)
% A、B分别为系统矩阵和输入矩阵,Q和R分别为状态误差和输入的对角权重矩阵
% maxIter为最大迭代步数N,eps为迭代精度C
i = 1; P = Q; delta = 1e9;
while i < maxIter && delta > eps
Pn = Q + A' * (P - P*B* inv(R+B'*P*B) *B'*P) * A;
delta = max(abs(Pn-P), [], "all");
P = Pn;
i = i+1;
end
K = inv(R + B' * P * B) * B' * P * A;
end
得 K = [ 2.4950 12.5106 ] K = \begin{bmatrix} 2.4950 & 12.5106 \end{bmatrix} K=[2.495012.5106], ∣ e i g ( A − B K ) ∣ 1 = ∣ e i g ( A − B K ) ∣ 2 = 0.5933 < 1 |\mathrm{eig}(A-BK)|_1 = |\mathrm{eig}(A-BK)|_2 = 0.5933 <1 ∣eig(A−BK)∣1=∣eig(A−BK)∣2=0.5933<1.
4.2 计算误差范围
W = { w ∣ − 0.1 ≤ w k ≤ 0.1 } ⇒ D W = { [ d 1 d 2 ] T ∣ − 0.01 ≤ d 1 ≤ 0.01 , − 0.05 ≤ d 2 ≤ 0.05 } \mathcal{W} = \{w ~|~ -0.1 \le w_k \le 0.1\} \Rightarrow D\mathcal{W} = \{[d_1~d_2]^T ~|~ -0.01 \le d_1 \le 0.01,~ -0.05 \le d_2 \le 0.05\} W={w ∣ −0.1≤wk≤0.1}⇒DW={[d1 d2]T ∣ −0.01≤d1≤0.01, −0.05≤d2≤0.05}.
寻找满足 A K N c D W ⊂ α D W A_K^{N_c}D \mathcal{W} \sub \alpha D \mathcal{W} AKNcDW⊂αDW 的 N c N_c Nc,并计算 α \alpha α、 Γ \Gamma Γ:
A = [1.1 2;0 0.95];
B = [0; 0.079];
AK = A - B*K;
lbDW = [-0.01; -0.05];
ubDW = [0.01; 0.05];
[Nc, alpha, lbGamma, ubGamma] = findNc(AK, lbDW, ubDW, 10, 500);
%%
function [Nc, alpha, lbGamma, ubGamma] = findNc(AK, lbDW, ubDW, NcMin, iterMax)
n = length(lbDW);
lGammaNc = lbDW;
uGammaNc = ubDW;
vertex = [lbDW, ubDW]; % 将上下界构成n*2的矩阵,对每个子状态x_i选择上界或下界,穷举所有组合以确定新边界
tmp = eye(n);
for i = 1:iterMax
tmp = AK * tmp;
lbADW = tmp * lbDW;
ubADW = tmp * ubDW;
for j = 0:n^2-1 % 使用二进制来表示每个组合
num = j;
X = zeros(n, 1);
for k = 1:n % vertex(k, 0+1)和vertex(k, 1+1)分别表示子状态x_k选择下界和上界
X(k) = vertex(k, mod(num, 2)+1);
num = bitshift(num, -1);
end
lbADW = min([lbADW, tmp*X], [], 2);
ubADW = max([ubADW, tmp*X], [], 2);
end
if(sum(lbADW > lbDW) == n && sum(ubADW < ubDW) == n && i >= NcMin)
break;
else
lGammaNc = lGammaNc + lbADW;
uGammaNc = uGammaNc + ubADW;
end
end
if i==iterMax
disp("warning")
end
Nc = i;
alpha = max([lbADW./lbDW; ubADW./ubDW]);
lbGamma = lGammaNc/(1 - alpha);
ubGamma = uGammaNc/(1 - alpha);
end
当 N c = 6 N_c = 6 Nc=6 时,满足条件,但 N c = 50 N_c = 50 Nc=50 时,可计算得到更小的范围,且 N c = 50 N_c = 50 Nc=50 继续增大时范围不再缩小。
得 Γ = { ( [ e 1 e 2 ] T ∣ − 0.4039 ≤ e 1 ≤ 0.4039 , − 0.1286 ≤ e 2 ≤ 0.1286 } \Gamma = \{([e_1 ~~ e_2]^T ~|~ -0.4039 \le e_1 \le 0.4039,~ -0.1286 \le e_2 \le 0.1286 \} Γ={([e1 e2]T ∣ −0.4039≤e1≤0.4039, −0.1286≤e2≤0.1286}
4.3 名义MPC设计
取控制时域 N = 10 N = 10 N=10,代价函数权重 Q = d i a g ( 1 , 1 ) Q = \mathrm{diag}(1,1) Q=diag(1,1), R = 0.1 R = 0.1 R=0.1.
选取 K P = [ 2.4950 12.5106 ] K_P = \begin{bmatrix} 2.4950 & 12.5106 \end{bmatrix} KP=[2.495012.5106],计算终端代价:
A = [1.1 2;0 0.95];
B = [0; 0.079];
K = [2.4950 12.5106];
Q = eye(2);
R = 0.1;
syms P [2 2] % P 为2*2的矩阵
equ = P - (A - B*K)' * P * (A - B*K) == Q + K'*R*K;
Psol = solve(equ, P);
Psol = [Psol.P1_1, Psol.P2_1; Psol.P2_1, Psol.P2_2];
Psol = double(Psol);
disp(Psol)
得 P = [ 4.0373 8.5226 8.5226 31.5400 ] P = \begin{bmatrix} 4.0373 & 8.5226 \\ 8.5226 & 31.5400 \end{bmatrix} P=[4.03738.52268.522631.5400].
根据 u k = v k − K e k u_k = v_k - Ke_k uk=vk−Kek, − 4 ≤ u k ≤ 4 -4 \le u_k \le 4 −4≤uk≤4, K Γ = { v e ∣ − 2.6164 ≤ e 1 ≤ 2.6164 } K\Gamma = \{v_{e} ~|~ -2.6164\le e_1 \le 2.6164 \} KΓ={ve ∣ −2.6164≤e1≤2.6164},得:
− 1.3836 ≤ v k ≤ 1.3836 -1.3836 \le v_k \le 1.3836 −1.3836≤vk≤1.3836
因为在控制中只取 v ( 0 ∣ k ) v_{(0|k)} v(0∣k) 作用于系统,为了提高名义MPC的可行性,只对 v ( 0 ∣ k ) v_{(0|k)} v(0∣k) 做以上约束,其余 − 4 ≤ v k ≤ 4 -4 \le v_k \le 4 −4≤vk≤4.
即:
V m i n ≤ V k ≤ V m a x V_{min} \le V_k \le V_{max} Vmin≤Vk≤Vmax
其中 V m i n = [ − 1.3836 , − 4 , , − 4 , ⋯ , − 4 ] V_{min} = [-1.3836,~-4,~, -4,~ \cdots, ~-4] Vmin=[−1.3836, −4, ,−4, ⋯, −4], V m a x = [ 1.3836 , 4 , , 4 , ⋯ , 4 ] V_{max} = [1.3836,~4,~, 4,~ \cdots, ~4] Vmax=[1.3836, 4, ,4, ⋯, 4].
直接选择足够小的范围作为终端不变集:
Ω ′ = [ − 0.2 , 0.2 ] × [ − 0.1 , 0.1 ] \Omega^\prime = [-0.2,~0.2] \times [-0.1,~0.1] Ω′=[−0.2, 0.2]×[−0.1, 0.1]
终端约束写为不等式形式,为:
A i n V k ≤ b i n A_{in}V_k \le b_{in} AinVk≤bin其中,
A i n = [ 1 0 − 1 0 0 1 0 − 1 ] [ 0 , 0 , ⋯ , I 2 × 2 ] H b i n = [ 0.2 0.2 0.1 0.1 ] − [ 1 0 − 1 0 0 1 0 − 1 ] [ 0 , 0 , ⋯ , I 2 × 2 ] G z ^ ( 0 ∣ k ) \begin{align*} A_{in} &= \begin{bmatrix} 1 & 0 \\ -1 & 0 \\ 0 & 1 \\ 0 &-1 \end{bmatrix} [0,~0,~\cdots, ~I_{2 \times 2}] \mathcal{H} \\ b_{in} &= \begin{bmatrix} 0.2 \\ 0.2 \\ 0.1 \\ 0.1 \end{bmatrix}-\begin{bmatrix} 1 & 0 \\ -1 & 0 \\ 0 & 1 \\ 0 &-1 \end{bmatrix}[0,~0,~\cdots, ~I_{2 \times 2}] \mathcal{G} \hat{z}_{(0|k)} \end{align*} Ainbin=
1−100001−1
[0, 0, ⋯, I2×2]H=
0.20.20.10.1
−
1−100001−1
[0, 0, ⋯, I2×2]Gz^(0∣k).
最终即可求解名义系统的最优控制序列:
V ∗ = a r g min V k J k s . t . V m i n ≤ V k ≤ V m a x A i n V k ≤ b i n \begin{align*} & \hspace{0.4cm }V^* = \mathrm{arg} \min_{V_k} J_k \\ \mathrm{s. t.}& \quad V_{min} \le V_k \le V_{max} \\ & \hspace{0.8cm} A_{in}V_k \le b_{in} \end{align*} s.t.V∗=argVkminJkVmin≤Vk≤VmaxAinVk≤bin
4.4 结果演示
将 u k = v k − K e k u_k = v_k - Ke_k uk=vk−Kek 作用于真实系统, v k v_k vk 作用于名义系统,MATLAB代码见 附录1,系统动态如下:
存在问题:输入还远不到约束值,可能是 Γ \Gamma Γ 的计算中过于保守,
且与 【模型预测控制(2022春)lecture 4-2 Robust MPC】 给出的结果不一致,若本文计算存在错误,欢迎指出。
4.5 对比与讨论
讨论1:如果MPC中每一优化周期令 z ( 0 ∣ k ) = x ( 0 ∣ k ) z_{(0|k)} = x_{(0|k)} z(0∣k)=x(0∣k)(记为MPC1),系统会怎样呢?
此时 e k = 0 e_k = 0 ek=0 始终成立,误差反馈项将无效,MPC的控制约束可扩展为:
V m i n = [ − 4 , − 4 , , − 4 , ⋯ , − 4 ] V_{min} = [-4,~-4,~, -4,~ \cdots, ~-4] Vmin=[−4, −4, ,−4, ⋯, −4], V m a x = [ 4 , 4 , , 4 , ⋯ , 4 ] V_{max} = [4,~4,~, 4,~ \cdots, ~4] Vmax=[4, 4, ,4, ⋯, 4].
效果对比如下:
MPC1效果更好,这是因为鲁棒MPC中约束范围的保守定义,使其性能显著下降.
将MPC1的控制约束同样设为 V m i n = [ − 1.3836 , − 4 , , − 4 , ⋯ , − 4 ] V_{min} = [-1.3836,~-4,~, -4,~ \cdots, ~-4] Vmin=[−1.3836, −4, ,−4, ⋯, −4], V m a x = [ 1.3836 , 4 , , 4 , ⋯ , 4 ] V_{max} = [1.3836,~4,~, 4,~ \cdots, ~4] Vmax=[1.3836, 4, ,4, ⋯, 4]:
对比可发现,在同样的条件下,增加鲁棒控制项可以提升MPC性能。
对比部分MATLAB代码见 附录2.
讨论2:是否可在适当时刻令名义系统中 z ( 0 ∣ k ) = x ( 0 ∣ k ) z_{(0|k)} = x_{(0|k)} z(0∣k)=x(0∣k)?
【模型预测控制(2022春)lecture 4-2 Robust MPC】 给出了答案:
可对比 在由名义系统状态更新的和 z ( 0 ∣ k ) = x ( 0 ∣ k ) z_{(0|k)} = x_{(0|k)} z(0∣k)=x(0∣k) 更新的两种MPC给出的控制序列下,
得到的最优代价函数(分别记为 J k ∗ ( z k ) J_k^*(z_k) Jk∗(zk) 和 J k ∗ ( x k ) J_k^*(x_k) Jk∗(xk))是否满足:
J k ∗ ( x k ) ≤ J k ∗ ( z k ) J_k^*(x_k) \le J_k^*(z_k) Jk∗(xk)≤Jk∗(zk)
满足时可令 z ( 0 ∣ k ) = x ( 0 ∣ k ) z_{(0|k)} = x_{(0|k)} z(0∣k)=x(0∣k),因为分析稳定性的李雅普诺夫函数是通过代价函数定义的,
此时李雅普诺夫函数衰减得更快,使系统的稳定性分析仍然成立。
但如 2.3.2 中讨论的,终端约束的迭代可行性需要重新确定。
附录1
%% 计算G、H、Q、R
N = 10;
[G, H] = getGH(N, A, B);
[Qp, Rp] = getQR(N, Q, Psol, R);
%% 约束条件
lb = -4 * ones(N, 1);
ub = 4 * ones(N, 1);
lb(1) = -1.3836;
ub(1) = 1.3836;
n = size(A, 2);
tmpReshape = kron(ones(1, N-1), zeros(n));
tmpReshape = [tmpReshape, eye(n)];
tmpAin = [1 0;
-1 0;
0 1;
0 -1];
tmpbin = [0.2; 0.2; 0.1; 0.1];
% Ain = tmpAin * tmpReshape * H;
% bin = tmpbin - tmpAin * tmpReshape * G * xCur;
%% 效果演示
A = [1.1 2;0 0.95];
B = [0; 0.079];
D = [0.1; 0.5];
K = [2.4950, 12.5106];
options = optimoptions('quadprog', 'MaxIterations', 200, 'Display','none');
xCur = [1.2;-0.7]; % 设初始状态为[1;1]
xLog = xCur;
zCur = xCur;
zLog = zCur;
vLog = [];
uLog = [];
step = 0:50;
v = 0;
for i = step
Hp = 2 * (H' * Qp * H + Rp);
fp = 2 * zCur' * G' * Qp * H;
Hp = 0.5 * (Hp + Hp');
Ain = tmpAin * tmpReshape * H;
bin = tmpbin - tmpAin * tmpReshape * G * zCur;
V = quadprog(Hp, fp, Ain, bin, [], [], lb, ub, v, options);
v = V(1);
u = v - K*(xCur - zCur);
w = (rand - 0.5)/0.5 * 0.1;
zCur = A * zCur + B*v; % 更新名义系统
xCur = A*xCur + B*u + D*w; % x_k+1
zLog = [zLog, zCur];
xLog = [xLog, xCur];
vLog = [vLog, v];
uLog = [uLog, u];
end
figure(1)
subplot(3,1,1)
hold on
plot(step, xLog(1,1:end-1), DisplayName='x')
plot(step, zLog(1,1:end-1), DisplayName='z')
legend(Location='best')
title('x1')
grid on
subplot(3,1,2)
hold on
plot(step, xLog(2,1:end-1), DisplayName='x')
plot(step, zLog(2,1:end-1), DisplayName='z')
legend(Location='best')
title('x2')
grid on
subplot(3,1,3)
hold on
plot(step, uLog, DisplayName='u')
plot(step, vLog, DisplayName='v')
legend(Location='best')
title('u')
grid on
%%
function [Qp, Rp] = getQR(N, Q, P, R)
Qp = eye(N);
Qp(end) = 0;
Qp = kron(Qp, Q) + kron(eye(N)-Qp, P);
Rp = eye(N);
Rp = kron(Rp, R);
end
function [G, H] = getGH(N, A, B) % N>1
tmp = A;
G = tmp;
for i=2:N
tmp = A*tmp;
G = [G; tmp];
end
r = size(B, 1);
c = size(B, 2);
H = zeros(r * N, c * N);
tmp = B;
for j = N:-1:1
H( (j-1)*r+1:j*r, (j-1)*c+1:j*c ) = tmp;
end
for i = 2:N
tmp = A*tmp;
for j = i:N
H( (j-1)*r+1:j*r, (j-i)*c+1:(j-i+1)*c ) = tmp;
end
end
end
附录2
%% 对比
A = [1.1 2;0 0.95];
B = [0; 0.079];
D = [0.1; 0.5];
lb = -4 * ones(N, 1);
ub = 4 * ones(N, 1);
lb(1) = -1.3836;
ub(1) = 1.3836;
options = optimoptions('quadprog', 'MaxIterations', 200, 'Display','none');
xCur1 = [1.2;-0.7]; % 设初始状态为[1;1]
xLog1 = xCur1;
zCur1 = xCur1;
vLog1 = [];
step = 0:50;
v = 0;
for i = step
zCur1 = xCur1;
Hp = 2 * (H' * Qp * H + Rp);
fp = 2 * zCur1' * G' * Qp * H;
Hp = 0.5 * (Hp + Hp');
Ain = tmpAin * tmpReshape * H;
bin = tmpbin - tmpAin * tmpReshape * G * zCur1;
V = quadprog(Hp, fp, Ain, bin, [], [], lb, ub, v, options);
v = V(1);
u = v;
w = (rand - 0.5)/0.5 * 0.1;
xCur1 = A*xCur1 + B*u + D*w; % x_k+1
xLog1 = [xLog1, xCur1];
vLog1 = [vLog1, v];
end
figure(1)
subplot(3,1,1)
hold on
plot(step, xLog(1,1:end-1), DisplayName='x')
plot(step, zLog(1,1:end-1), DisplayName='z')
plot(step, xLog1(1,1:end-1), DisplayName='x1')
legend(Location='best', NumColumns=3)
title('x1')
grid on
subplot(3,1,2)
hold on
plot(step, xLog(2,1:end-1), DisplayName='x')
plot(step, zLog(2,1:end-1), DisplayName='z')
plot(step, xLog1(2,1:end-1), DisplayName='x1')
legend(Location='best', NumColumns=3)
title('x2')
grid on
subplot(3,1,3)
hold on
plot(step, uLog, DisplayName='u')
plot(step, vLog, DisplayName='v')
plot(step, vLog1, DisplayName='v1')
legend(Location='best', NumColumns=3)
title('u')
grid on