前言
致谢 【模型预测控制(2022春)lecture 5-1 Implementing MPC in MATLAB】
诸兵老师的MPC课程到此完结,在本笔记的最后再次感谢诸兵老师的精彩课程,
本笔记的内容基本都来源于该课程,当然也补充了一些基础知识,各位看官如有收获,请到视频中一起为该课程点赞。
非线性MPC
当系统模型是复杂的非线性函数时,就无法像线性系统那样通过矩阵形式写出未来 N N N 状态的紧凑形式,但 MPC 的优化求解思路仍然适用。
假设有非线性系统:
x
k
+
1
=
f
(
x
k
,
u
k
)
(1)
x_{k+1} = f(x_k, ~u_k) \tag{1}
xk+1=f(xk, uk)(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。
我们仍然可定义代价函数:
J
k
=
∑
i
=
1
N
(
x
(
i
∣
k
)
T
Q
x
(
i
∣
k
)
+
u
(
i
−
1
∣
k
)
T
R
u
(
i
−
1
∣
k
)
)
J_k=\sum_{i=1}^N \left(x_{(i|k)}^TQx_{(i|k)} + u_{(i-1|k)}^TRu_{(i-1|k)} \right)
Jk=i=1∑N(x(i∣k)TQx(i∣k)+u(i−1∣k)TRu(i−1∣k))
将系统模型作为等式约束,通过非线性优化求解最优控制序列,即构建优化问题求解:
[
X
k
∗
,
U
k
∗
]
=
a
r
g
min
X
k
,
U
k
J
k
s
.
t
.
u
(
i
∣
k
)
∈
U
,
i
=
0
,
1
,
2
,
⋯
,
N
−
1
x
(
0
∣
k
)
=
x
k
x
(
i
+
1
∣
k
)
=
f
(
x
(
i
∣
k
)
,
u
(
i
∣
k
)
)
,
i
=
0
,
1
,
2
,
⋯
,
N
−
1
\begin{align*} & \hspace{0.74cm } [X_k^*,~U_k^*] = \mathrm{arg} \min_{X_k,~U_k} J_k \\ \mathrm{s. t.}& \quad u_{(i|k)} \in \mathcal{U},~i=0,1,2,\cdots,N-1 \\ & \hspace{1.36cm} x_{(0|k)} = x_k \\ & \hspace{1.1cm} x_{(i+1|k)} = f(x_{(i|k)}, ~u_{(i|k)}),~i=0,1,2,\cdots,N-1 \end{align*}
s.t.[Xk∗, Uk∗]=argXk, UkminJku(i∣k)∈U, i=0,1,2,⋯,N−1x(0∣k)=xkx(i+1∣k)=f(x(i∣k), u(i∣k)), i=0,1,2,⋯,N−1
注意:此处只介绍了非线性MPC的构建,目前系统的稳定性并没有保障,分析非线性MPC的稳定性仍然存在挑战。
MATLAB求解实例
假设系统模型为:
x
k
+
1
=
f
(
x
k
,
u
k
)
x_{k+1} = f(x_k, ~u_k)
xk+1=f(xk, uk)
其中
f
(
x
,
u
)
=
[
1.1
x
1
+
s
i
n
(
x
2
)
0.12
x
1
2
+
x
2
+
0.079
u
]
f(x, ~u) = \begin{bmatrix} 1.1x_1 + sin(x_2)\\ 0.12x_1^2 + x_2 + 0.079u \end{bmatrix}
f(x, u)=[1.1x1+sin(x2)0.12x12+x2+0.079u],
x
=
[
x
1
x
2
]
T
x = [x_1 ~~ x_2]^T
x=[x1 x2]T,
−
4
≤
u
≤
4
-4 \le u \le 4
−4≤u≤4.
下面将使用MATLAB中的 fmincon 函数求解:
定义代价函数(fmincon 优化的目标函数):
function f = objfun(UX) % XU = [u0, u1, ..., u(N-1), x1_1, x1_2, x2_1, x2_2, .., xN_1, xN_2]
N = length(UX)/3;
U = UX(1:N);
X = UX(N+1:end);
% 定义权重矩阵
Q = eye(2);
R = 0.1;
Qp = kron(eye(N), Q);
Rp = kron(eye(N), R);
f = X'*Qp*X + U'*Rp*U;
end
将系统模型作为 fmincon 的非线性等式约束:
function [c,ceq] = nonlcon(UX, xCur)
N = length(UX)/3;
n = 2; % x维数
p = 1; % u维度
U = UX(1:N);
X = UX(N+1:end);
c = []; % 非线性不等式约束
ceq = zeros(n*N, 1); % 非线性等式约束
ceq(1:n) = X(1:n) - model(xCur, U(1:p)); % x1k = f(x0k, u0k);
for i = 2:N
ceq( (i-1)*n + 1 : i*n ) = X( (i-1)*n+1 : i*n) - model( X((i-2)*n+1 : (i-1)*n), U((i-1)*p + 1:i*p));
end
end
function xPlus = model(xCur, uCur)
xPlus = [1.1 * xCur(1) + sin(xCur(2)); 0.12 * xCur(1)^2 + 0.079 * uCur];
end
系统动态及代码如下:
N = 10;
% 控制输入约束
lb = -4*ones(N, 1);
ub = 4*ones(N, 1);
lb = [lb; -ones(2*N, 1) * inf];
ub = [ub; ones(2*N, 1) * inf];
options = optimoptions('fmincon', 'Display', 'none');
xCur = [1.2;-0.7]; % 设初始状态
xLog = xCur;
uLog = [];
UX = zeros(3*N, 1);
step = 0:50;
for i = step
nonlconFun = @(UX) nonlcon(UX, xCur);
UX = fmincon(@objfun, UX, [], [], [], [], lb, ub, nonlconFun, options);
u = UX(1);
xCur = model(xCur, u);
xLog = [xLog, xCur];
uLog = [uLog, u];
end
figure(1)
subplot(3,1,1)
hold on
plot(step, xLog(1,1:end-1), DisplayName='x')
legend(Location='best', NumColumns=3)
title('x1')
grid on
subplot(3,1,2)
hold on
plot(step, xLog(2,1:end-1), DisplayName='x')
legend(Location='best', NumColumns=3)
title('x2')
grid on
subplot(3,1,3)
hold on
plot(step, uLog, DisplayName='u')
legend(Location='best', NumColumns=3)
title('u')
grid on