主要内容

解决自定义MPC二次编程问题并生成代码

此示例显示如何使用内置的主动集QP求解器来实现支持Matlab中的C代码生成的自定义MPC算法。金宝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_unconstromed = 0:1:10;u_unconstromed = zeros(size(t_unconstrain));uncthi6_lqr = tf([ -  1 1])*反馈(ss(a,b,眼睛(2),0,ts),k_lqr);lsim(und thari6_lqr,' - ',u_unconstromed,t_unconstromed,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 Zeros(2,1)零(2,1)零(2,1);......a * b zeros(2,1)零(2,1);......a ^ 2 * b a * b zeros(2,1);......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.通过解决以下Lyapunov方程来获得:

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 = inv(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 thar6_mpc,'*',u_unconstromed,t_unconstromed,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_constroming = 0:40;为了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('是') 传奇('约束lqr'

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

使用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是恒定的,您可以在其较低三角形的尖弦分解的倒数中预高,然后将其传递给mpcactiveseteolver功能,而不是直接传递Hessian矩阵。因此,mpcactiveseteolver可以避免在每次步骤执行该计算。

l = chol(h,'降低');linv = l \眼睛(尺寸(h,1));

通过致电进行模拟mpcactiveseteolver在每个模拟步骤。最初所有不平等都是无效的(冷启动)。

x = x0;ia =假(大小(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;结尾图形子图(2,1,1)绘图(T_Constrain,UMPC)XLabel('时间')ylabel('U')子图(2,1,2)绘图(T_Constrain,YMPC)XLabel('时间')ylabel('是') 传奇('约束MPC'

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

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

mpcactiveseteolver可以在MATLAB功能块内使用,以在Simulink环境中提供仿真和代码生成。金宝app

mdl ='mpc_activesetqp';Open_System(MDL)

自定义MPC控制器块是MATLAB功能块。要检查MATLAB代码,请双击块。自从Linv.FAC.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)

Matlab中的代码

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

功能[x,iter,ia1,lam] = mycode()%#codegen.n = 5;m = 10;q = 2;h = diag(10 * rand(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,IA1,IA1,LAM] = MPCactivesetsolver(Linv,F,A,B,AEQ,Beq,IA,OPT);

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

乐趣='mycode';cfg = coder.config('mex');%或'lib','dll'等。Codegen('-config',cfg,有趣,'-O',乐趣);

承认

这个例子是由Mark Cannon教授的讲座,为牛津大学的模型预测控制课程的教授。植物模型在“预测和优化”部分中的实施例2.1中使用的植物模型是相同的。

BdClose(MDL)

也可以看看

|

相关话题