解决定制MPC二次规划问题,生成代码
这个例子展示了如何使用内置的有效集QP解算器实现一个自定义MPC算法在MATLAB支持C代码生成。金宝app
定义植物模型
植物模型是一个离散时间状态空间系统和开环不稳定。我们假设所有的植物状态是可衡量的。因此,我们避免需要设计一个状态估计量,超出了这个例子的范围。
= (1.1 - 2;0 0.95);B = [0;0.0787);C = [1];D = 0;Ts = 1;sys = ss (A, B, C, D, Ts);x0 = [0.5, -0.5];%初始状态时(0.5 - -0.5)
设计无约束线性二次调节器(等)
设计一个无约束等方面与输出权重。这个控制器作为基线与自定义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),可以制定为:(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 B 0 (2, 1) 0 (2, 1);…^ 2 * A * B B 0 (2, 1);…3 ^ * ^ 2 * B A * B];
货币政策委员会目标函数J (k) = (x (k)和' * Q * x (k) + u (k) ' * R * u (k) + x (k + N) ' * Q_bar * x (k + N))
。确保货币政策委员会目标函数有相同的二次成本无限的地平线等使用的二次成本,终端的重量Q_bar
通过求解李雅普诺夫方程如下:
Q = C ' * C;Q_bar = dlyap ((a - b * K_lqr), Q + K_lqr * R * K_lqr);
货币政策委员会的问题转化为一个标准的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;
当没有约束,最优预测输入序列U (k)由MPC控制器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)显示
等和MPC控制器产生相同的结果,因为控制规律是相同的。
K_lqr K_mpc
K_lqr K_mpc = 4.3608 - 18.7401 = 4.3608 18.7401
当应用约束等控制性能恶化
限制控制器输出,u (k), 1 - 1。等控制器生成一个缓慢而振动闭环反应由于饱和。
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;结束图次要情节(2,1,1)情节(t_constrained, uLQR)包含(“时间”)ylabel (“u”次要情节(2,1,2)情节(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 1 0;…0 0 0 1);…0 0 0 1);b0 = [1; 1; 1; 1; 1; 1; 1; 1];
因为在这种情况下,海赛矩阵H是常数,可以precalculate逆矩阵的下三角柯列斯基分解,然后将它传递给mpcActiveSetSolver
函数,而不是直接通过海赛矩阵。作为一个结果,mpcActiveSetSolver
可以避免在每次执行此计算步骤。
L =胆固醇(H,“低”);Linv = L \眼睛(大小(H, 1));
运行一个仿真通过调用mpcActiveSetSolver
在每个模拟步骤。最初所有的不平等是不活跃(冷启动)。
x = x0;iA = false(大小(b0));%为解算器创建选项,并指定non-hessian第一输入选择= mpcActiveSetOptions;opt.IntegrityChecks = false;opt.UseHessianAsInput = false;为ct = t_constrained [u,地位,iA] = mpcActiveSetSolver (Linv, F * x, Ac, b0, [], 0 (0, 1), iA,选择);uMPC (ct + 1) = u (1);x = x + B * * uMPC (ct + 1);yMPC (ct + 1) = C * x;结束图次要情节(2,1,1)情节(t_constrained, uMPC)包含(“时间”)ylabel (“u”次要情节(2,1,2)情节(t_constrained, yMPC)包含(“时间”)ylabel (“y”)传说(“限制政策委员会”)
MPC控制器产生一个闭环响应更快的解决时间和振荡。
模拟定制MPC使用MATLAB仿真软件的功能块金宝app
mpcActiveSetSolver
可以使用MATLAB功能块内部提供模拟和仿真软件环境的代码生成。金宝app
mdl =“mpc_activesetqp”;open_system (mdl)
自定义MPC控制器块是一个MATLAB函数块。检查MATLAB代码,双击。自Linv
,F
,交流
,b0
矩阵,选择
结构常数,它们传递到MATLAB功能块作为参数。
运行一个仿真模型。金宝appclosed-responses等方面和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,选择);
你可以使用下面的命令来生成C代码与MATLAB编码器:
有趣的=“mycode”;Cfg = coder.config (墨西哥人的);%或“自由”,“dll”等。codegen (“配置”Cfg,有趣,“o”、有趣的);
承认
这个例子是灵感来自马克大炮教授的课堂讲稿为模型预测控制类在牛津大学。例子中使用的植物模型是相同的一个2.1“预测和优化”一节。
bdclose (mdl)
另请参阅
mpcqpsolver
|mpcqpsolverOptions