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

这个例子说明了如何使用内置的有源集QP求解器来实现自定义的MPC算法,支持C代码生成的MATLAB。金宝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 =零(大小(t_unconstrained));Unconstrained_LQR = TF([ -  1 1])*反馈(β(A,B,眼(2),0,TS),K_lqr);lsim(Unconstrained_LQR,' - ',u_unconstrained,t_unconstrained,X0);保持

设计定制MPC控制器,终端重量

设计具有在最后预测步骤中应用的终端重定制MPC控制器。

所预测的状态的序列,X(k)的,由线性模型和输入序列产生,U(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 B零(2,1)零(2,1);...A ^ 2 * B A * B B零(2,1);...甲^ 3 * B A ^ 2 * B A * B B];

MPC的目标函数是Ĵ(K)=总和(X(k)的 '* Q * X(K)+ U(k)的' * R * U(K)+ X(K + N)'* Q_bar * X(K + N))。为了确保目标MPC函数具有相同的二次成本由LQR,终端使用重量无穷水平二次成本Q_bar通过求解下面的Lyapunov方程获得:

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

转换MPC问题转化为一个标准的QP问题,其目标函数Ĵ(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 = INV(H)* F

K为H \ F;

在实践中,只有第一个控制移动U(k)的= -K_mpc * X(k)的被施加到植物(滚动时域控制)。

K_mpc = K(1,:);

运行在[0.5 -0.5]与初始状态的模拟。闭环反应是稳定的。

Unconstrained_MPC = TF([ -  1 1])*反馈(β(A,B,眼(2),0,TS),K_mpc);lsim(Unconstrained_MPC,'*',u_unconstrained,t_unconstrained,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_constrained = 0:40;对于CT = t_constrained uLQR(CT + 1)= -K_lqr * X;uLQR(CT + 1)= MAX(-1,分钟(1个,uLQR(CT + 1)));X = A * X + B * uLQR(CT + 1);yLQR(CT + 1)= C * X;结束图副区(2,1,1)图(t_constrained,uLQR)xlabel('时间')ylabel('U')副区(2,1,2)图(t_constrained,yLQR)xlabel('时间')ylabel('Y')图例(“约束LQR”

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];

mpcActiveSetSolver函数需要第一输入是Hessian矩阵H的下三角Cholesky分解的逆

L = CHOL(H,'降低');Linv = L \眼(尺寸(H,1));

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

X = X0;IA =假(大小(B0));选择= mpcActiveSetOptions;opt.IntegrityChecks = FALSE;对于CT = t_constrained [U,状态,IA] = mpcActiveSetSolver(Linv,F * X,AC,B 0,[],零(0,1),IA,优化);UMPC(CT + 1)= U(1);X = A * X + B * UMPC(CT + 1);yMPC(CT + 1)= C * X;结束图副区(2,1,1)图(t_constrained,UMPC)xlabel('时间')ylabel('U')副区(2,1,2)图(t_constrained,yMPC)xlabel('时间')ylabel('Y')图例(“约束MPC”

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

模拟自定义MPC在Simulink中使用MATLAB功能块金宝app

mpcActiveSetSolver可以在MATLAB功能块内部被用来在Simulink环境提供仿真和代码生成。金宝app

MDL ='mpc_activesetqp';open_system(MDL)

自定义MPC控制器块是MATLAB功能块。要检查MATLAB代码,双击该块。以来LinvFACB0基质,和选择结构是不变的,它们被传递到MATLAB功能块作为参数。

运行在Simulink仿真。金宝appLQR和MPC控制器的闭环反应,也等同于在MATLAB模拟对应物。

open_system([MDL'/ u_lqr'])open_system([MDL'/ y_lqr'])open_system([MDL'/ u_mpc'])open_system([MDL'/ y_mpc'])SIM(MDL)

代码生成在MATLAB

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

功能[X,ITER,IA1,林] = mycode的()%#代码生成N = 5;米= 10;当q = 2;H = DIAG(10 *兰特(N,1));F = randn(N,1);A = randn(M,N);B = randn(M,1);AEQ = randn(Q,N);BEQ = randn(Q,1);Linv = CHOL(H,'降低')\眼(N);IA =假(M,1);选择= mpcActiveSetOptions();[X,ITER,IA1,林] = mpcActiveSetSolver(Linv,F,A,B,AEQ,BEQ,IA,OPT);

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

有趣='mycode的';CFG = coder.config('MEX');%或 'LIB', 'DLL' 等代码生成('-config',CFG,乐趣,'-o',乐趣);

承认

这个例子是由马克·坎农教授的讲义在牛津大学的模型预测控制类的启发。工厂模型是同一个的“预测和优化”一节中例2.1中使用。

bdclose(MDL)

也可以看看

|

相关话题