主要内容

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

此示例演示如何使用内置的活动集QP解算器实现自定义MPC算法,该算法支持在MATLAB中生成C代码。万博1manbetx

定义植物模型

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

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_unconstraint=0:1:10;u_unconstraint=0(大小(t_unconstraint));unconstraint_LQR=tf([-11])*反馈(ss(A,B,眼睛(2),0,Ts),K_LQR);lsim(unconstraint_LQR,“- - -”, t_unconstrained u_unconstrained x0);持有在…上

设计具有终端重量的定制MPC控制器

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

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

M=[A;A^2;A^3;A^4];CONV=[B零(2,1)零(2,1)零(2,1);...A*B = 0 (0,1);...A^2*B A*B零(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_巴通过求解以下李雅普诺夫方程得到:

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)为-K*x哪里K=库存(高)*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'*',u_无约束,t_无约束,x0)图例显示

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

K_lqr K_mpc
K_lqr=4.3608 18.7401 K_mpc=4.3608 18.7401

应用约束时,LQR控制性能恶化

将控制器输出u(k)限制在-1和1之间。LQR控制器因饱和而产生缓慢且振荡的闭环响应。

x=x0;t_=0:40;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) xlabel(“时间”)伊拉贝尔(“u”)子plot(2,1,2) plot(t_constrained,yLQR) xlabel(“时间”)伊拉贝尔(“是的”)传说(“约束LQR”

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

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

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

Ac=[1 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是常数,所以可以预先计算其下三角Cholesky分解的逆,然后将其传递给mpcActiveSetSolver函数,而不是直接传递Hessian矩阵。因此,mpcActiveSetSolver可以避免在每个时间步骤执行此计算。

L=chol(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,[],zeros(0,1),iA,opt);uMPC (ct + 1) = u (1);x = x + B * * uMPC (ct + 1);yMPC (ct + 1) = C * x;结束图子地块(2,1,1)图(t_约束,uMPC)xlabel(“时间”)伊拉贝尔(“u”) subplot(2,1,2) plot(t_constrained,yMPC) xlabel(“时间”)伊拉贝尔(“是的”)传说(“受限MPC”

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

在Simulink中使用MATLAB函数块模拟自定义MPC万博1manbetx

mpcActiveSetSolver可以在MATLAB函数块中使用,在Simulink环境中提供仿真和代码生成。万博1manbetx

mdl =“mpc_activesetqp”;开放式系统(mdl)

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

在Simulink中运行仿真。LQR和M万博1manbetxPC控制器的闭合响应与MATLAB仿真中的对应控制器相同。

开放式系统([mdl' / u_lqr '(mdl) open_system (' / y_lqr '(mdl) open_system (“/u_mpc”(mdl) open_system (' / y_mpc ']) sim (mdl)

MATLAB中的代码生成

mpcActiveSetSolver万博1manbetx支持使用MATLAB编码器生成C代码。假设你有一个函数,麦可德,它与代码生成标准兼容。

作用[x, iter iA1 lam) = mycode ()% # codegenn=5;m=10;q=2;H=diag(10*rand(n,1));f=randn(n,1);A=随机数n(m,n);b=随机数n(m,1);Aeq=随机数(q,n);beq=randn(q,1);Linv=chol(H,“更低”)\眼睛(n);iA=false(m,1);Opt=mpcActiveSetOptions();[x,iter,iA1,lam]=mpcActiveSetSolver(Linv,f,A,b,Aeq,beq,iA,Opt);

你可以使用以下命令生成C代码与MATLAB编码器:

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

承认

这个例子的灵感来自于Mark Cannon教授在牛津大学的模型预测控制课程的课堂笔记。该工厂模型与示例2.1中“预测和优化”一节中使用的模型相同。

bdclose(mdl)

另请参阅

|

相关话题