【MPC】模型预测控制笔记 (5):抗干扰鲁棒MPC

发布于:2025-06-23 ⋅ 阅读:(12) ⋅ 点赞:(0)


前言

致谢 【模型预测控制(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 xkRn 是系统状态, u k ∈ R p u_k \in \mathbb{R}^p ukRp 是系统的输入, u k ∈ U u_k \in \mathcal{U} ukU 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=xkzk,在 v k v_k vk基础上增加误差反馈控制来保证误差有界,有:
u k = v k − K e k (3) u_k = v_k - Ke_k \tag{3} uk=vkKek(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=(ABK)ek+Dwk(4)
由于干扰项的存在,系统误差不能稳定到 0,但只要干扰强度在可控范围内,
∣ e i g ( A − B K ) < 1 ∣ |\mathrm{eig}(A-BK)<1| eig(ABK)<1∣,可保证误差有界(即系统稳定但不是渐近稳定).

1.2 误差分析

由式 (4),记 A K = A − B K A_K = A-BK AK=ABK,有:
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=x0z0=0=AKe0+Dw0=Dw0=AKe1+Dw1=AKDw0+Dw1=AKe2+Dw3=AK2Dw0+ADw1+Dw2=i=1kAKi1Dwki
因为 ∣ e i g ( A K ) < 1 ∣ |\mathrm{eig}(A_K)<1| eig(AK)<1∣,误差是有限的,记 w k ∈ W w_k \in \mathcal{W} wkW,有:
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=1kAKi1Dwkii=1kAKi1DWi=1AKi1DWΓ
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=1AKi1DW=ΓNc+i=Nc+1AKi1DW=ΓNc+i=1AKi1AKNcDWΓNc+i=1AKi1α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=1NcAKi1DW,有:
Γ ⊂ ( 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(Nk)]T=[v(0∣k) v(1∣k)  v(N1∣k)]T=[A A2  AN]T= BABA2BAN1B0BABA2B00BAB000B

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))TQGz(0∣k)+2z(0∣k)TGTQHVk+VkT(HTQH+R)Vk

2.3 约束构建

2.3.1 系统约束

为了满足:
u k ∈ U u_k \in \mathcal{U} ukU
其中 u k = v k − K e k u_k = v_k - Ke_k uk=vkKek K e k ∈ K Γ Ke_k \in K\Gamma KekKΓ,需满足:
v k ∈ U ∖ − K Γ v_k \in \mathcal{U} \setminus -K\Gamma vkUKΓ

若存在状态约束,要求 x ∈ X x \in \mathcal{X} xX,可使 z ∈ Z = X − Γ z \in \mathcal{Z} = \mathcal{X} - \Gamma zZ=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(Nk) 进行约束,以保证下一周期的迭代可行性。
但在本文中,仅在 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(Nk) 即可.

使终端 z ( N ∣ k ) z_{(N|k)} z(Nk) 进去不变集 Ω 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=vkKek 始终满足输入约束 U \mathcal{U} U
z ( N ∣ k ) ∈ Ω z (9) z_{(N|k)} \in \Omega_z \tag{9} z(Nk)Ω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} vkU,但需针对 x ( N ∣ k ) x_{(N|k)} x(Nk) 进行终端约束。
使终端 x ( N ∣ k ) x_{(N|k)} x(Nk) 进去不变集 Ω 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(Nk)=x(Nk)+eNΩx
有:
z ( N ∣ k ) ∈ Ω x − Γ z_{(N|k)} \in \Omega_x - \Gamma z(Nk)Ω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=argVkminJkvkUKΓvk+iU,i=1,2,z(Nk)Ω

三、稳定性分析

由 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*} klimzk0klimxk=klimekΓ

四、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 4uk4 − 0.1 ≤ w k ≤ 0.1 -0.1 \le w_k \le 0.1 0.1wk0.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(ABK)1=eig(ABK)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.1wk0.1}DW={[d1 d2]T  0.01d10.01, 0.05d20.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.4039e10.4039, 0.1286e20.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=vkKek − 4 ≤ u k ≤ 4 -4 \le u_k \le 4 4uk4 K Γ = { v e   ∣   − 2.6164 ≤ e 1 ≤ 2.6164 } K\Gamma = \{v_{e} ~|~ -2.6164\le e_1 \le 2.6164 \} KΓ={ve  2.6164e12.6164},得:
− 1.3836 ≤ v k ≤ 1.3836 -1.3836 \le v_k \le 1.3836 1.3836vk1.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 4vk4.
即:
V m i n ≤ V k ≤ V m a x V_{min} \le V_k \le V_{max} VminVkVmax
其中 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} AinVkbin其中,
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= 11000011 [0, 0, , I2×2]H= 0.20.20.10.1 11000011 [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=argVkminJkVminVkVmaxAinVkbin

4.4 结果演示

u k = v k − K e k u_k = v_k - Ke_k uk=vkKek 作用于真实系统, 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

网站公告

今日签到

点亮在社区的每一天
去签到