【MPC】模型预测控制笔记 (7):非线性MPC


前言

致谢 【模型预测控制(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 xkRn 是系统状态, u k ∈ R p u_k \in \mathbb{R}^p ukRp 是系统的输入, u k ∈ U u_k \in \mathcal{U} ukU
我们仍然可定义代价函数:
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=1N(x(ik)TQx(ik)+u(i1∣k)TRu(i1∣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(ik)U, i=0,1,2,,N1x(0∣k)=xkx(i+1∣k)=f(x(ik), u(ik)), i=0,1,2,,N1

注意:此处只介绍了非线性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 4u4.

下面将使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

车队老哥记录生活

支持作者创作更多免费好文~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值