主要内容

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

此示例显示了如何使用内置的Active-Set 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_unconcontain = 0:1:10;u_unconcontain = zeros(size(t_unconcontained));uncontained_lqr = tf([ -  1 1])*反馈(ss(a,b,eight(2),0,ts),k_lqr);lsim(uncontained_lqr,' - ',u_unconcontain,t_uncondered,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];cons = [b zeros(2,1)零(2,1)零(2,1);...a*b b zeros(2,1)零(2,1);...a^2*b a*b 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*cons + 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]的初始状态运行模拟。闭环响应是稳定的。

uncontained_mpc = tf([ -  1 1])*反馈(ss(a,b,eight(2),0,ts),k_mpc);LSIM(无约束_MPC,'*',u_unconcontain,t_uncodented,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_concontain = 0:40;为了ct = t_concontained 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_CONTER,ULQR)XLABEL('时间')ylabel('U')子图(2,1,2)图(t_conconted,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; 1];

由于在这种情况下,Hessian矩阵H是恒定的,因此您可以预测其下三角形cholesky分解的倒数,然后将其传递给mpcactivesetsolver功能,而不是直接传递Hessian矩阵。因此,mpcactivesetsolver可以避免在每个时间步骤执行此计算。

l = chol(h,'降低');linv = l \ eye(size(h,1));

通过打电话运行模拟mpcactivesetsolver在每个模拟步骤中。最初,所有不平等现象都是不活跃的(冷启动)。

x = x0;ia = false(size(b0));%为求解器创建选项,并指定非赫西安第一输入opt = mpcactivesetoptions;opt.integritychecks = false;opt.usehessianasinput = false;为了ct = t_concontain [u,status,ia] = mpcactivesetsolver(linv,f*x,ac,b0,[],零(0,1),ia,opt);UMPC(CT+1)= U(1);x = a*x+b*umpc(ct+1);YMPC(CT+1)= C*X;结尾图子图(2,1,1)图(t_conconted,umpc)xlabel('时间')ylabel('U')子图(2,1,2)图(t_conconted,ympc)xlabel('时间')ylabel('y') 传奇(“约束MPC”

MPC控制器会产生闭环响应,并以更快的沉降时间和更少的振荡响应。

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

mpcactivesetsolver可以在MATLAB功能块中使用,以在Simulink环境中提供模拟和代码生成。金宝app

mdl ='mpc_activesetqp';Open_System(MDL)

自定义MPC控制器块是MATLAB功能块。要检查MATLAB代码,请双击块。自从linv,,,,F,,,,交流,,,,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中的代码生成

mpcactivesetsolver金宝app使用MATLAB编码器支持C代码生成。假设您有一个功能,mycode,这与代码生成标准兼容。

功能[x,iter,ia1,lam] = mycode()%#codegenn = 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,'降低')\ eye(n);ia = false(m,1);opt = mpcactivesetoptions();[X,ITER,IA1,LAM] = mpcactivesetsolver(linv,f,a,b,aeq,beq,ia,opt);

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

有趣='mycode';cfg = coder.config('Mex');%或“ lib”,“ dll”,等等。Codegen(Codegen)('-config',CFG,有趣,'-o',乐趣);

致谢

这个示例的灵感来自牛津大学的Mark Cannon教授的讲义。植物模型与“预测与优化”部分中示例2.1中使用的模型相同。

BDCLOSE(MDL)

也可以看看

|

相关话题