这个例子说明了如何使用内置的有源集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。该控制器作为基线将与定制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控制器。
所预测的状态的序列,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
限制控制器输出,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控制器的主要优点是,它通过在每个控制间隔解决优化问题明确处理输入和输出的限制。
使用内置的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控制器产生具有更快的沉降时间和更少的振荡闭环响应。
mpcActiveSetSolver
可以在MATLAB功能块内部被用来在Simulink环境提供仿真和代码生成。金宝app
MDL ='mpc_activesetqp';open_system(MDL)
自定义MPC控制器块是MATLAB功能块。要检查MATLAB代码,双击该块。以来Linv
,F
,AC
,B0
基质,和选择
结构是不变的,它们被传递到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)
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)
mpcqpsolver
|mpcqpsolverOptions