这个例子展示了如何使用内置的活动集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。该控制器作为基准,与自定义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' - ',u_unconstroming,t_unconstromed,x0);抓住在
设计具有终端重量的自定义MPC控制器,在最后的预测步骤中应用。
由线性模型和输入序列U(k)生成的预测状态序列X(k)可表示为:x(k)= m * x(k)+ conv * u(k)
.在本例中,使用四个预测步骤(N = 4)。
M = [; ^ 2; ^ 3 ^ 4);CONV = [B零(2,1)零(2,1)零(2,1)];......a * b b zeros(2,1)零(2,1);......A^2*B ^2*B ^2*B......A^3* b A^2* b A* b b
MPC目标函数是j(k)= sum(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]的初始状态进行模拟。闭环响应稳定。
uncthi6_mpc = tf([ - 1 1])*反馈(ss(a,b,眼睛(2),0,ts),k_mpc);lsim(und throwing_mpc,‘*’传说,t_unconstrained u_unconstrained x0)展示
LQR和MPC控制器产生相同的结果,因为控制法是相同的。
k_lqr k_mpc.
K_lqr = 4.3608 18.7401 K_mpc = 4.3608 18.7401
限制控制器输出u(k)在-1和1之间。由于饱和,LQR控制器产生一个缓慢的振荡闭环响应。
x = x0;t_constrained =今日;为了ct = t_constrainer ulqr(ct + 1)= -k_lqr * x;ULQR(CT + 1)= MAX(-1,min(1,ULQR(CT + 1))));x = a * x + b * ULQR(CT + 1);YLQR(CT + 1)= C * x;结尾图形子图(2,1,1)绘图(t_constrain,ulqr)xlabel('时间') ylabel ('U')子图(2,1,2)绘图(t_constrain,ylqr)xlabel('时间') ylabel (“y”) 传奇(约束等方面的的)
使用MPC控制器的主要优点之一是它通过在每个控制间隔处解决优化问题来显式处理输入和输出约束。
使用内置的KWIK QP求解器,MPCactiveseteolver
,实现上面设计的自定义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];
因为在这种情况下Hessian矩阵H是常数,你可以预先计算它的下三角choolesky分解的逆,然后将它传递给MPCactiveseteolver
函数,而不是直接传递Hessian矩阵。作为一个结果,MPCactiveseteolver
可以避免在每次步骤执行该计算。
L =胆固醇(H,“低”);linv = l \眼睛(大小(h,1));
通过调用运行一个模拟MPCactiveseteolver
在每个模拟步骤。最初所有不平等都是无效的(冷启动)。
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,1),ia,选择;UMPC(CT + 1)= U(1);x = a * x + b * umpc(ct + 1);YMPC(CT + 1)= C * x;结尾图subplot(2,1,1) plot(t_constrained,uMPC) xlabel('时间') ylabel ('U')子图(2,1,2)绘图(t_constrain,ympc)xlabel('时间') ylabel (“y”) 传奇(“限制政策委员会”的)
MPC控制器产生闭环响应,具有更快的稳定时间和更少的振荡。
MPCactiveseteolver
可以在MATLAB功能块内使用,以在Simulink环境中提供模拟和代码生成。金宝app
mdl ='mpc_activesetqp';open_system (mdl)
自定义MPC控制器块是一个MATLAB函数块。要检查MATLAB代码,双击代码块。自Linv.
那F
那AC.
那B0.
矩阵,而且选择
结构是常量的,它们作为参数传递到MATLAB功能块。
在Simulink中运行一个仿真。金宝app在MATLAB仿真中,LQR控制器和MPC控制器的闭合响应与相应的控制器相同。
open_system ([mdl'/ u_lqr'])Open_System([MDL'/ y_lqr'])Open_System([MDL' / u_mpc '])Open_System([MDL'/ y_mpc'])SIM(MDL)
MPCactiveseteolver
金宝app支持C代码生成与MATLAB编码器。假设有一个函数,mycode
,与代码生成标准兼容。
函数[x,iter,ia1,lam] = mycode()%#codegen.n = 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编码器生成C代码:
有趣='mycode';cfg = coder.config('mex');%或'lib', 'dll'等。Codegen('-config',cfg,有趣,'-O',乐趣);
这个例子是由Mark Cannon教授的推动,为牛津大学的模型预测控制课程的讲义说明。工厂模型在“预测和优化”部分中的示例2.1中使用的植物模型是相同的。
bdclose (mdl)
mpcqpsolver
|mpcqpsolverOptions