【MPC】模型预测控制笔记 (3):无约束输出反馈MPC

目录


前言

致谢 【模型预测控制(2022春)lecture 3-1 Output feedback MPC】

输出反馈MPC

针对更通用的系统:
x k + 1 = A x k + B u k y k = C x k (1) \begin{align*} x_{k+1} &= Ax_k + Bu_k \\ y_k &= Cx_k \end{align*} \tag{1} xk+1yk=Axk+Buk=Cxk(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 是系统的输入, y k ∈ R m y_k \in \mathbb{R}^m yk∈Rm 是可知的系统输出。

当 m < n m<n m<n 时,说明部分状态不可测量,需要增加观测器来观测系统的全状态,此前提是系统是可观测的(能观性)。

由此即可通过系统的输出反馈来设计 MPC 控制器。

将要用到的基础概念 参考:《现代控制理论(第3版) (刘豹,唐万生) 》

【基础】系统能控性

定义 :若存在连续的输入 u ( t ) u(t) u(t),可在有限时间 t 0 , t f t_0, \~ t_f t0, tf 内,使系统从状态 x ( t 0 ) x(t_0) x(t0)到达任一终端状态 x ( t f ) x(t_f) x(tf),则称该状态是能控的。若系统每一状态都能控,则称系统是能观的。

简单理解就是:系统中每个子状态都独立地直接或间接地受输入影响则可控。

【基础】系统能观性

定义 :若系统在有限观测时间 t f > t 0 t_f > t_0 tf>t0 内,可根据 t 0 , t f t_0, \~ t_f t0, tf 期间输出的 y ( t ) y(t) y(t),唯一地确定系统状态 x ( t 0 ) x(t_0) x(t0),则称该状态是能观的。若系统每一状态都能观测,则称系统是能观的。

针对离散系统的简单理解就是:

将系统 k k k 时刻的全状态 x k x_k xk 分为两块,记 x k = x k + ∪ x k − x_k = x_k^+ \cup x_k^- xk=xk+∪xk−,

系统输出 y k y_k yk 可能只与部分的系统状态 x k + x_k^+ xk+ 存在联系,若系统中与 y k y_k yk没有直接关系的状态 x k − x_k^- xk−,其与 x k + x_k^+ xk+ 存在联系,

就可通过有限的多时刻的系统输出 y k , y k + 1 , ⋯ y_k,y_{k+1},\cdots yk,yk+1,⋯,建立足够多的独立方程,求解出系统的全状态 x k x_k xk.

故 x k − x_k^- xk−与 x k + x_k^+ xk+ 是否存在联系决定了系统的能观性。

《现代控制理论(第3版) (刘豹,唐万生) 》中给出了许多系统能控/观性的判定方法。

【基础】能控性和能观性的对偶关系


对偶关系定义

系统 ∑ 1 \sum _1 ∑1 :
x ˙ 1 = A 1 x 1 + B 1 u 1 y ˙ 1 = C 1 x 1 \begin{align*} \dot{x}_1 &= A_1 x_1 + B_1 u_1 \\ \dot{y}_1 &= C_1 x_1 \end{align*} x˙1y˙1=A1x1+B1u1=C1x1

系统 ∑ 2 \sum _2 ∑2 :
x ˙ 2 = A 2 x 2 + B 2 u 2 y ˙ 2 = C 2 x 2 \begin{align*} \dot{x}_2 &= A_2 x_2 + B_2 u_2 \\ \dot{y}_2 &= C_2 x_2 \end{align*} x˙2y˙2=A2x2+B2u2=C2x2

若:
A 2 = A 1 T , B 2 = C 1 T , C 2 = B 1 T A_2 = A_1^T, \quad B_2 = C_1^T, \quad C_2 = B_1^T A2=A1T,B2=C1T,C2=B1T

则称系统 ∑ 1 \sum _1 ∑1 和 ∑ 2 \sum _2 ∑2 是互为对偶的。

对偶原理

系统 ∑ 1 \sum _1 ∑1 和 ∑ 2 \sum _2 ∑2 是互为对偶,则 ∑ 1 \sum _1 ∑1 的能控性等价于 ∑ 2 \sum _2 ∑2 的能观性, ∑ 1 \sum _1 ∑1 的能观性等价于 ∑ 2 \sum _2 ∑2 的能控性。

应用

在设计观测器的观测增益 L L L 时,可通过对偶的控制系统,使用控制器设计方法设计最优反馈增益 K K K,有 L = K T L = K^T L=KT.


一、观测器设计

1.1 线性观测器设计

针对系统 (1),设 k k k 时刻观测的状态为 x ^ k \hat{x}{k} x^k,线性观测器可设计为:
x ^ k + 1 = A x ^ k + B u k + H ( y k − C x ^ k ) (2) \hat{x}
{k+1} = A\hat{x}{k} + Bu_k + H(y_k - C\hat{x}{k}) \tag{2} x^k+1=Ax^k+Buk+H(yk−Cx^k)(2)

上式可称为 观测器状态方程,其中 H H H 为观测增益.

1.2 误差(稳定性)分析

定义误差为 x ~ k = x k − x ^ k \tilde{x}k = x_k - \hat{x}{k} x~k=xk−x^k,由系统状态方程-观测器状态方程得:
x ~ k + 1 = A x ~ k − L ( y k − C x ^ k ) \tilde{x}_{k+1} = A\tilde{x}k - L(y_k - C\hat{x}{k}) x~k+1=Ax~k−L(yk−Cx^k)

将输出方程代入上式可整理得:
x ~ k + 1 = ( A − L C ) x ~ k (3) \tilde{x}_{k+1} = (A-LC)\tilde{x}_k \tag{3} x~k+1=(A−LC)x~k(3)

由李雅普诺夫稳定性间接法可知,当 ∣ e i g ( A − L C ) ∣ < 1 |\mathrm{eig}(A-LC)|<1 ∣eig(A−LC)∣<1 时,误差将趋于 0.

L L L 可通过其对偶系统来设计。

式 (3) 可以写为: x ~ k + 1 = A ′ x ~ k \tilde{x}_{k+1} = A^\prime \tilde{x}_k x~k+1=A′x~k,其中 A ′ = ( A − L C ) A^\prime = (A-LC) A′=(A−LC).

对偶系统为
x ~ k + 1 = ( A − L C ) T x ~ k ⇒ x ~ k + 1 = A T x ~ k − C T L T x ~ k \begin{align*} \tilde{x}_{k+1} &= (A-LC)^T \tilde{x}k\\ \Rightarrow \tilde{x}{k+1} &= A^T\tilde{x}_k - C^T L^T \tilde{x}_k \end{align*} x~k+1⇒x~k+1=(A−LC)Tx~k=ATx~k−CTLTx~k

以上形式就转为了我们熟悉的线性反馈控制系统的形式: x k + 1 = A x k − B K x k x_{k+1} = Ax_k - BKx_k xk+1=Axk−BKxk.

我们可用极点配置或最优控制来设计增益使系统渐近稳定.

因为 e i g ( A ′ ) = e i g ( ( A ′ ) T ) \mathrm{eig}(A^\prime) = \mathrm{eig}((A^\prime)^T) eig(A′)=eig((A′)T),所以当控制系统渐近稳定,观测器误差也将收敛为0.

1.3 MATLAB实例

针对式 (2) 形式的观测器,需要使式 (3) 系统的状态稳定为 0 \mathbf{0} 0.

设系统中 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, C = 1 0 C = \begin{bmatrix} 1 & 0 \end{bmatrix} C=10.

设计观测增益 L L L,使 ∣ e i g ( A − L C ) ∣ < 1 |\mathrm{eig}(A-LC)|<1 ∣eig(A−LC)∣<1,即可使观测器误差收敛为0.

下面将根据对偶原理,使用极点配置法和基于对偶原理的LQR方法来设计.

式 (3) 的对偶系统为:
x ~ k + 1 = A T x ~ k − C T L T x ~ k \tilde{x}_{k+1} = A^T\tilde{x}_k - C^T L^T \tilde{x}_k x~k+1=ATx~k−CTLTx~k

对应控制系统:
x ~ k + 1 ′ = A ′ x ~ k ′ − B ′ K ′ x ~ k ′ \tilde{x}_{k+1}^\prime = A^\prime\tilde{x}_k^\prime - B^\prime K^\prime \tilde{x}_k^\prime x~k+1′=A′x~k′−B′K′x~k′

其中 A ′ = A T A^\prime = A^T A′=AT, B ′ = C T B^\prime = C^T B′=CT, K ′ = L T K^\prime = L^T K′=LT.

1.3.1 极点配置

matlab 复制代码
A = [1.1 2;0 0.95];
B = [0; 0.079];
C = [1, 0];

Ap = A';
Bp = C';

%% 极点配置
p = [0.5 + 0.5j, 0.5 - 0.5j]; % 适当选取极点
K = place(Ap, Bp, p);

L = K';
disp(eig(A - L*C))
disp(abs(eig(A - L*C)))

得 L = 1.0500 0.2263 L = \begin{bmatrix} 1.0500 \\ 0.2263 \end{bmatrix} L=1.05000.2263.

1.3.2 LQR设计最优增益

LQR相关内容可参考 离散LQR原理 .

matlab 复制代码
A = [1.1 2;0 0.95];
B = [0; 0.079];
C = [1, 0];

Ap = A';
Bp = C';

%% LQR 最优增益
K = LQR(Ap, Bp, eye(2), 0.1, 500, 1e-6);
L = K';
disp(eig(A - L*C))
disp(abs(eig(A - L*C)))
%%
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

得 L = 1.8342 0.3571 L = \begin{bmatrix} 1.8342 \\ 0.3571 \end{bmatrix} L=1.83420.3571.

二、无约束输出反馈MPC

针对系统:
x k + 1 = A x k + B u k y k = C x k \begin{align*} x_{k+1} &= Ax_k + Bu_k \\ y_k &= Cx_k \end{align*} xk+1yk=Axk+Buk=Cxk

【MPC】模型预测控制笔记 (1):无约束MPC 可知,

无约束MPC的输入可写为状态反馈形式:
u k = − K x k u_k = -Kx_k uk=−Kxk

其中 K = I p × p 0 0 ⋯ 0 ( H T Q ′ H + R ′ ) − 1 H T Q ′ G K = I_{p\\times p} \~0 \~0 \~\\cdots \~0(\mathcal{H}^T \mathcal{Q}^\prime \mathcal{H} + \mathcal{R}^\prime)^{-1}\mathcal{H}^T \mathcal{Q}^\prime \mathcal{G} K=Ip×p 0 0 ⋯ 0(HTQ′H+R′)−1HTQ′G.

无约束输出反馈MPC可直接使用观测器观测状态代替真实状态:
u k = − K x ^ k u_k = -K\hat{x}_k uk=−Kx^k

其中 x ^ k + 1 = A x ^ k + B u k + L ( y k − C x ^ k ) \hat{x}{k+1} = A\hat{x}{k} + Bu_k + L(y_k - C\hat{x}_{k}) x^k+1=Ax^k+Buk+L(yk−Cx^k),记观测误差为 x ~ k = x k − x ^ k \tilde{x}k = x_k - \hat{x}{k} x~k=xk−x^k.

系统可改写为:
x k + 1 = A x k − B K x ^ k = A x k − B K ( x k − x ~ k ) (4) \begin{align*} x_{k+1} &= Ax_k - BK\hat{x}_k \\ &= Ax_k - BK(x_k - \tilde{x}_k) \end{align*} \tag{4} xk+1=Axk−BKx^k=Axk−BK(xk−x~k)(4)

观测误差可写为:
x ~ k + 1 = ( A − L C ) x ~ k (5) \tilde{x}_{k+1} = (A-LC)\tilde{x}_k \tag{5} x~k+1=(A−LC)x~k(5)

2.1 稳定性分析

构建增广系统:

x k + 1 x \~ k + 1 \] = \[ A − B K B K 0 A − L C \] \[ x k x \~ k \] \\begin{align\*} \\begin{bmatrix} x_{k+1} \\\\ \\tilde{x}_{k+1} \\end{bmatrix} = \\begin{bmatrix} A-BK \& BK \\\\ 0 \& A - LC \\end{bmatrix} \\begin{bmatrix} x_{k} \\\\ \\tilde{x}_{k} \\end{bmatrix} \\end{align\*} \[xk+1x\~k+1\]=\[A−BK0BKA−LC\]\[xkx\~k

系统的的稳定性取决于
A a u g = A − B K B K 0 A − L C \begin{align*} A_{aug} = \begin{bmatrix} A-BK & BK \\ 0 & A - LC \end{bmatrix} \end{align*} Aaug=A−BK0BKA−LC 的特征值。

当 ∣ e i g ( A a u g ) ∣ < 1 |\mathrm{eig}(A_{aug})|<1 ∣eig(Aaug)∣<1 时,系统渐近稳定,其中 e i g ( A a u g ) = e i g ( A − B K ) ∪ e i g ( A − L C ) \mathrm{eig}(A_{aug}) = \mathrm{eig}(A-BK) \cup \mathrm{eig}(A-LC) eig(Aaug)=eig(A−BK)∪eig(A−LC).

由此可见,整体系统的稳定性取决了控制器和观测器,这两部分可独立设计,

但需要注意的时,观测器应收敛得比控制器更快,否则,控制器会根据不准确的观测结果将系统控歪。

线性代数基础:三角分块矩阵的特征值为其对角子块上的特征值集合。

证明:

首先证明三角分块矩阵的行列式等于其对角子块行列式的乘积(参考:分块矩阵行列式的性质证明):
性质1:从一行(列)中减去另一行(列)的倍数,行列式保持不变.
性质2:三角矩阵的行列式为其主对角线上元素的乘积.
参考:《线性代数导论:第五版 ((美)Gilbert Strang著 海昕, 文军, 屈龙江, 钱旭译) 》


∣ D ∣ = ∣ a 11 ⋯ a 1 k ⋮ ⋮ 0 a k 1 ⋯ a k k c 11 ⋯ c 1 k b 11 ⋯ b 1 n ⋮ ⋮ ⋮ ⋮ c n 1 ⋯ c n k b n 1 ⋯ b n n ∣ , ∣ D 1 ∣ = ∣ a 11 ⋯ a 1 k ⋮ ⋮ a k 1 ⋯ a k k ∣ , ∣ D 2 ∣ = ∣ b 11 ⋯ b 1 n ⋮ ⋮ b n 1 ⋯ b n n ∣ \begin{align*} &|D| = \begin{vmatrix} a_{11} & \cdots & a_{1k} & & & \\ \vdots & & \vdots & & 0 & \\ a_{k1} & \cdots & a_{kk} & & & \\ c_{11} & \cdots & c_{1k} & b_{11} & \cdots & b_{1n} \\ \vdots & & \vdots & \vdots & & \vdots \\ c_{n1} & \cdots & c_{nk} & b_{n1} & \cdots & b_{nn} \end{vmatrix}, &|D_{1}| = \begin{vmatrix} a_{11} & \cdots & a_{1k} \\ \vdots & & \vdots \\ a_{k1} & \cdots & a_{kk} \end{vmatrix}, &|D_{2}| = \begin{vmatrix} b_{11} & \cdots & b_{1n} \\ \vdots & & \vdots \\ b_{n1} & \cdots & b_{nn} \end{vmatrix} \end{align*} ∣D∣= a11⋮ak1c11⋮cn1⋯⋯⋯⋯a1k⋮akkc1k⋮cnkb11⋮bn10⋯⋯b1n⋮bnn ,∣D1∣= a11⋮ak1⋯⋯a1k⋮akk ,∣D2∣= b11⋮bn1⋯⋯b1n⋮bnn

分别通过行变换和列变换可得:
∣ D 1 ∣ = ∣ p 11 ⋯ 0 ⋮ ⋱ ⋮ p k 1 ⋯ p k k ∣ = p 11 p 22 ⋯ p k k , ∣ D 2 ∣ = ∣ q 11 ⋯ 0 ⋮ ⋱ ⋮ q n 1 ⋯ q n n ∣ = p 11 p 22 ⋯ p n n \begin{align*} &|D_{1}| = \begin{vmatrix} p_{11} & \cdots & 0 \\ \vdots & \ddots & \vdots \\ p_{k1} & \cdots & p_{kk} \end{vmatrix} = \mathrm{p}{11} \mathrm{p}{22} \cdots \mathrm{p}{\mathrm{kk}}, &|D{2}| = \begin{vmatrix} q_{11} & \cdots & 0 \\ \vdots & \ddots & \vdots \\ q_{n1} & \cdots & q_{nn} \end{vmatrix} = \mathrm{p}{11} \mathrm{p}{22} \cdots \mathrm{p}_{\mathrm{nn}} \end{align*} ∣D1∣= p11⋮pk1⋯⋱⋯0⋮pkk =p11p22⋯pkk,∣D2∣= q11⋮qn1⋯⋱⋯0⋮qnn =p11p22⋯pnn

有:
∣ D ∣ = ∣ p 11 ⋯ 0 ⋮ ⋮ 0 p k 1 ⋯ p k k c 11 ⋯ c 1 k q 11 ⋯ 0 ⋮ ⋮ ⋮ ⋮ c n 1 ⋯ c n k q n 1 ⋯ q n n ∣ = p 11 p 22 ⋯ p k k ⋅ p 11 p 22 ⋯ p n n = ∣ D 1 ∣ ∣ D 2 ∣ \begin{align*} |D| = \begin{vmatrix} p_{11} & \cdots & 0 & & & \\ \vdots & & \vdots & & 0 & \\ p_{k1} & \cdots & p_{kk} & & & \\ c_{11} & \cdots & c_{1k} & q_{11} & \cdots & 0 \\ \vdots & & \vdots & \vdots & & \vdots \\ c_{n1} & \cdots & c_{nk} & q_{n1} & \cdots & q_{nn} \end{vmatrix} \end{align*} = \mathrm{p}{11} \mathrm{p}{22} \cdots \mathrm{p}{\mathrm{kk}} \cdot \mathrm{p}{11} \mathrm{p}{22} \cdots \mathrm{p}{\mathrm{nn}} = |D_1||D_2| ∣D∣= p11⋮pk1c11⋮cn1⋯⋯⋯⋯0⋮pkkc1k⋮cnkq11⋮qn10⋯⋯0⋮qnn =p11p22⋯pkk⋅p11p22⋯pnn=∣D1∣∣D2∣

在计算特征值时有:
∣ D − λ I ∣ = ∣ D 1 − λ I ∣ ∣ D 2 − λ I ∣ = 0 |D-\lambda I| = |D_1-\lambda I| |D_2-\lambda I| = 0 ∣D−λI∣=∣D1−λI∣∣D2−λI∣=0

故 三角分块矩阵的特征值为其对角子块上的特征值集合 得证.

2.2 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, C = 1 0 C = \begin{bmatrix} 1 & 0 \end{bmatrix} C=10.

【MPC】模型预测控制笔记 (1):无约束MPC 可知控制器反馈增益 K = I p × p 0 0 ⋯ 0 ( H T Q ′ H + R ′ ) − 1 H T Q ′ G K = I_{p\\times p} \~0 \~0 \~\\cdots \~0(\mathcal{H}^T \mathcal{Q}^\prime \mathcal{H} + \mathcal{R}^\prime)^{-1}\mathcal{H}^T \mathcal{Q}^\prime \mathcal{G} K=Ip×p 0 0 ⋯ 0(HTQ′H+R′)−1HTQ′G,

计算可得 K = 2.6167 12.9286 K = \begin{bmatrix} 2.6167 \\ 12.9286 \end{bmatrix} K=2.616712.9286,MATLAB代码如下:

matlab 复制代码
%% 选取K并检验系统是否稳定 
A = [1.1 2;0 0.95];
B = [0; 0.079];
K = [1.4 5.76];

eigSys = eig(A - B*K);
disp(abs(eigSys))
%% 求解P
K = [1.4 5.76];
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)
%% 计算G、H
N = 4;
[G, H] = getGH(N, A, B);
%% 计算Q、R、K
[Qp, Rp] = getQR(N, Q, Psol, R);
Kp = [eye(1), kron(ones(1, N-1), zeros(1))] * inv(H'*Qp*H + Rp)*H'*Qp*G;
% getGH等函数参见前面的博客

由 1.3 中可知观测增益 .

最终得到的系统的动态如下:

( L = 1.8342 0.3571 L = \begin{bmatrix} 1.8342 \\ 0.3571 \end{bmatrix} L=1.83420.3571)

( L = 1.0500 0.2263 L = \begin{bmatrix} 1.0500 \\ 0.2263 \end{bmatrix} L=1.05000.2263)

MATLAB演示代码:

matlab 复制代码
A = [1.1 2;0 0.95];
B = [0; 0.079];
C = [1, 0];
K = [2.6167, 12.9286];
% L = [1.05; 0.2263];
L = [1.8342; 0.3571];

xCur = [1.2;-0.7]; % 设初始状态为[1;1]
xLog = xCur;
xHatCur = [0;0]; % 设初始状态为[0;0]
xHatLog = xHatCur;
uLog = [];

step = 0:50;
u = 0;
for i = step

    u = -K * xHatCur;

    yCur = C * xCur; % y_k
    xHatCur = A * xHatCur + B*u + L * (yCur - C * xHatCur); % xHat_k+1
    xCur = A*xCur + B*u; % x_k+1

    xHatLog = [xHatLog, xHatCur];
    xLog = [xLog, xCur];
    uLog = [uLog, u];
end

figure(1)
subplot(3,1,1)
hold on
plot(step, xLog(1,1:end-1))
plot(step, xHatLog(1,1:end-1))
title('x1')
grid on
subplot(3,1,2)
hold on
plot(step, xLog(2,1:end-1))
plot(step, xHatLog(2,1:end-1))
title('x2')
grid on
subplot(3,1,3)
plot(step, uLog)
title('u')
grid on
相关推荐
Jerry8 分钟前
LeetCode 459. 重复的子字符串
算法
海石3 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石3 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry5 小时前
LeetCode 151. 反转字符串中的单词
算法
β添砖java6 小时前
2025最新快速构建企业级虚拟专用网络环境学习笔记
笔记·学习
qianpeng46 小时前
IDA PRO笔记
笔记
a1117767 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜7 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry8 小时前
LeetCode 541. 反转字符串 II
算法
Jerry8 小时前
LeetCode 344. 反转字符串
算法