主要内容

解决自定义MPC二次规划问题并生成代码

这个例子展示了如何使用内置的active-set QP求解器来实现一个自定义的MPC算法,该算法在MATLAB中支持C代码生成。金宝app

定义植物模型

被控对象模型是一个离散时间状态空间系统,是开环不稳定的。我们假设所有的植物状态都是可测量的。因此,我们避免了设计状态估计器的需要,这超出了本例的范围。

A = [1.1 2;0 0.95);B = [0;0.0787);C = [-1 1];D = 0;Ts = 1;sys = ss (A, B, C, D, Ts);x0 = [0.5, -0.5];初始状态百分比[0.5 -0.5]

设计无约束线性二次型调节器(LQR)

设计一个输出加权的无约束LQR。该控制器作为基准,用于与自定义MPC算法进行比较。LQ控制律为u (k) = -K_lqr * x (k)

Qy = 1;R = 0.01;K_lqr = lqry (sys, Qy, R);

运行一个初始状态为[0.5 -0.5]的模拟。闭环响应稳定。

t_unconstrained = 0:1:10;u_unconstrained = 0(大小(t_unconstrained));Unconstrained_LQR =特遣部队([1])*反馈(ss (A, B,眼(2),0,Ts), K_lqr);lsim (Unconstrained_LQR“- - -”, t_unconstrained u_unconstrained x0);持有

设计带有终端重量的自定义MPC控制器

设计一个自定义的MPC控制器,在最后的预测步骤中应用终端权重。

由线性模型生成的预测状态序列X(k)与输入序列U(k)可表示为:X(k) = M* X(k) + CONV*U(k).在本例中,使用四个预测步骤(N = 4)。

M = [; ^ 2; ^ 3 ^ 4);CONV = [B 0 (2,1) 0 (2,1) 0 (2,1);...A*B 0 (2,1) 0 (2,1);...A^2* ba * b0 (2,1);...A^3* b A^2* b A* b];

MPC目标函数为J (k) = (x (k)和' * Q * x (k) + u (k) ' * R * u (k) + x (k + N) ' * Q_bar * x (k + N)).为了保证MPC目标函数具有与LQR所使用的无限水平二次代价相同的二次代价,终端权值Q_bar通过求解李雅普诺夫方程得到:

Q = C ' * C;Q_bar = dlyap((A-B*K_lqr))', Q+K_lqr'*R*K_lqr;

将MPC问题转化为具有目标函数的标准QP问题J(k) = U(k)'*H*U(k) + 2*x(k)'*F'*U(k)

Q_hat = blkdiag (Q Q Q, Q_bar);R_hat = blkdiag (R, R, R, R);H = CONV'*Q_hat*CONV + R_hat;F = CONV ' * Q_hat * M;

当无约束条件时,MPC控制器生成的最优预测输入序列U(k)为x - k *,在那里K =发票(H) * F

K = H \ F;

在实践中,只有第一个控制动作u (k) = -K_mpc * x (k)应用于植物(水平后退控制)。

: K_mpc = K (1);

运行一个初始状态为[0.5 -0.5]的模拟。闭环响应稳定。

Unconstrained_MPC =特遣部队([1])*反馈(ss (A, B,眼(2),0,Ts), K_mpc);lsim (Unconstrained_MPC‘*’传说,t_unconstrained u_unconstrained x0)显示

LQR和MPC控制器产生相同的结果,因为控制律是相同的。

K_lqr K_mpc
K_mpc = 4.3608 18.7401

应用约束时LQR控制性能下降

限制控制器输出u(k)在-1到1之间。由于饱和,LQR控制器产生一个缓慢振荡的闭环响应。

x = x0;t_constrained =今日;ct = t_constrained uLQR(ct+1) = -K_lqr*x;uLQR (ct + 1) = max(1分钟(1,uLQR (ct + 1)));x = x + B * * uLQR (ct + 1);yLQR (ct + 1) = C * x;结束图subplot(2,1,1) plot(t_constrained,uLQR)“时间”) ylabel (“u”) subplot(2,1,2) plot(t_constrained,yLQR)“时间”) ylabel (“y”)传说(约束等方面的

MPC控制器在应用约束条件时在线解决QP问题

使用MPC控制器的一个主要好处是,它通过求解每个控制区间的优化问题来显式地处理输入和输出约束。

使用内置的KWIK QP求解器,mpcActiveSetSolver,实现上述设计的自定义MPC控制器。约束矩阵定义为Ac*x>=b0。

Ac = [1 0 0 0;...-1 0 0 0;...0 1 0 0;...0 -1 0 0;...0 0 1 0;...0 0 0 -1 0;...0 0 0 1;...0 0 0 -1];b0 = [1; 1; 1; 1; 1; 1; 1; 1];

因为在这种情况下,Hessian矩阵H是常数,所以可以预先计算其下三角Cholesky分解的逆,然后将其传递给mpcActiveSetSolver函数,而不是直接传递Hessian矩阵。作为一个结果,mpcActiveSetSolver可以避免在每个时间步执行此计算。

L =胆固醇(H,“低”);Linv = L \眼睛(大小(H, 1));

通过调用运行模拟mpcActiveSetSolver在每个模拟步骤。最初所有的不等式都是不活跃的(冷启动)。

x = x0;iA = false(大小(b0));%为解析器创建选项,并指定非hessian优先输入选择= mpcActiveSetOptions;opt.IntegrityChecks = false;opt.UseHessianAsInput = false;ct = t_constrained [u,status,iA] = mpcActiveSetSolver(Linv,F*x,Ac,b0,[], 0 (0,1),iA,opt);uMPC (ct + 1) = u (1);x = x + B * * uMPC (ct + 1);yMPC (ct + 1) = C * x;结束图subplot(2,1,1) plot(t_constrained,uMPC)“时间”) ylabel (“u”) subplot(2,1,2) plot(t_constrained,yMPC)“时间”) ylabel (“y”)传说(“限制政策委员会”

MPC控制器产生的闭环响应具有更快的稳定时间和更少的振荡。

利用Simulink中的MATLAB功能块对自定义MPC进行仿真金宝app

mpcActiveSetSolver可以在MATLAB函数块内使用,在Simulink环境中提供仿真和代码生成。金宝app

mdl =“mpc_activesetqp”;open_system (mdl)

自定义MPC控制器块是一个MATLAB函数块。要检查MATLAB代码,双击代码块。自LinvF交流b0矩阵,选择结构是常数,它们被传递到MATLAB函数块作为参数。

在Simulink中运行仿真。金宝appLQR和MPC控制器的闭合响应与MATLAB仿真中相同。

open_system ([mdl' / u_lqr '(mdl) open_system (' / y_lqr '(mdl) open_system (' / u_mpc '(mdl) open_system (' / y_mpc ']) sim (mdl)

MATLAB中的代码生成

mpcActiveSetSolver金宝app支持C代码生成与MATLAB编码器。假设你有一个函数,mycode,与代码生成标准兼容。

函数[x, iter iA1 lam) = mycode ()% # codegenn = 5;m = 10;q = 2;H =诊断接头(10 *兰德(n, 1));f = randn (n, 1);一个= randn (m, n);b = randn (m, 1);Aeq = randn (q, n);说真的= randn (q, 1);Linv =胆固醇(H,“低”)、眼睛(n);iA = false (m, 1);选择= mpcActiveSetOptions ();[x, iter iA1 lam) = mpcActiveSetSolver (Linv f A、b Aeq,说真的,iA,选择);

你可以使用MATLAB Coder生成C代码:

有趣的=“mycode”;Cfg = coder.config (墨西哥人的);%或'lib', 'dll'等codegen (“配置”Cfg,有趣,“o”、有趣的);

承认

这个例子的灵感来自于牛津大学Mark Cannon教授的模型预测控制课堂讲稿。该工厂模型与“预测与优化”部分的示例2.1中使用的模型相同。

bdclose (mdl)

另请参阅

|

相关的话题