基于离散、连续、线性和非线性模型进行模型预测(MPC)控制(Matlab代码实现)

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现

💥1 概述

模型预测控制MPC(Model Predictive Control)是70年代末发展起来的新型计算机控制算法。经过多年的理论研究和应用实践,MPC在算法改进和理论分析方面都有很大发展。它的典型算法有三种:模型算法控制MAC(Model Algorithm Control),动态矩阵控制DMC(Dynamic Matrix Control)和广义预测控制GPC(Generalized Predictive Control) [1.2l。目前,MPC在石油、化工、冶金等多个工业部门都得到了成功的应用。与此同时,不少国外软件公司已经推出了各具特色的MPC商业化应用软件。现在人们已普遍认为MPC是一类最具实用性,有着广泛应用前景的先进控制策略[3]。

模型预测控制 (MPC) 可预测和优化未来时间范围内的时变过程。此控制包接受线性或非线性模型。利用APOPT、IPOPT等大规模非线性规划求解器,解决数据调和、移动视界估计、实时优化、动态仿真、非线性MPC问题[4]。

📚2 运行结果

 部分代码:

% define 2 x 2 control matrix in s-domain (continuous)
G11 = 2/((5*s+1)*(2*s+1))*exp(-6*s);
G12 = -1/((4*s+1)*(2*s+1));
G21 = 2/((4*s+1)*(2*s+1))*exp(-4*s);
G22 = 4/((2*s+1)*(s+1)^3)*exp(-3*s);

% overall transfer function
Gc = [G11 G12;...
      G21 G22];

% get step response
figure(1)
step(Gc)

% convert to discrete form with 1 second sampling (z-domain)
Gd = c2d(Gc,1);
hold on
step(Gd)

% convert to state space
sys = absorbDelay(ss(Gd));
step(sys)

% extract A, B, C, D matrices in sparse form
[n,m] = size(sys.B);
[p,m] = size(sys.D);

[ai,aj,av] = find(sparse(sys.A));
a = [ai,aj,av]';
[bi,bj,bv] = find(sparse(sys.B));
b = [bi,bj,bv]';
[ci,cj,cv] = find(sparse(sys.C));
c = [ci,cj,cv]';
[di,dj,dv] = find(sparse(sys.D));
d = [di,dj,dv]';
if(size(d,2)==0),
    d = [1,1,0]';
end

fid = fopen('lti.apm','w');
fprintf( fid,'\n');
fprintf( fid,'Objects \n');
fprintf( fid,'  sys = lti\n');
fprintf( fid,'End Objects \n');
fprintf( fid,'\n');
fprintf( fid,'Connections\n');
fprintf( fid,'  u[1:%d] = sys.u[1:%d]\n',m,m);
fprintf( fid,'  x[1:%d] = sys.x[1:%d]\n',n,n);
fprintf( fid,'  y[1:%d] = sys.y[1:%d]\n',p,p);
fprintf( fid,'End Connections\n');
fprintf( fid,'\n');
fprintf( fid,'Model \n');
fprintf( fid,'  Parameters \n');
fprintf( fid,'    u[1:%d] = 0\n',m);
fprintf( fid,'  End Parameters \n');
fprintf( fid,'\n');
fprintf( fid,'  Variables \n');
fprintf( fid,'    x[1:%d] = 0\n',n);
fprintf( fid,'    y[1:%d] = 0\n',p);
fprintf( fid,'  End Variables \n');
fprintf( fid,'\n');
fprintf( fid,'  Equations \n');
fprintf( fid,'    ! add any additional equations here \n');
fprintf( fid,'  End Equations \n');
fprintf( fid,'End Model \n');
fprintf( fid,'\n');
fprintf( fid,'! dimensions\n');
fprintf( fid,'! (nx1) = (nxn)*(nx1) + (nxm)*(mx1)\n');
fprintf( fid,'! (px1) = (pxn)*(nx1) + (pxm)*(mx1)\n');
fprintf( fid,'!\n');
fprintf( fid,'! discrete form\n');
fprintf( fid,'! x[k+1] = A * x[k] + B * u[k]\n');
fprintf( fid,'!   y[k] = C * x[k] + D * u[k]\n');

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]万鹏. 基于模型预测控制(MPC)车道保持系统的研究[D].安徽工程大学,2022.DOI:10.27763/d.cnki.gahgc.2022.000005.

[2]哈迪(DHAIF ALLAH HADI). 基于模型预测控制(MPC)的光伏发电智能控制研究[D].华北电力大学(北京),2020.DOI:10.27140/d.cnki.ghbbu.2020.001065.

[3]John Hedengren (2022). Model Predictive Control.

[4]隋丹,冯乐,陈蓓.模型预测控制(MPC)在飞机自动着陆系统中的应用[J].航空计算技术,2003(03):23-26.

🌈4 Matlab代码实现

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的DMC-PID串级控制MATLAB代码示例: ``` % 参数设置 N = 10; % 控制时域长度 Nu = 3; % 控制移动时域长度 lambda = 1; % 调节参数 T = 1; % 采样时间 sim_time = 100; % 模拟时间 r = 1; % 参考信号 % 进程模型 num = [0.9 -0.1]; den = [1 -0.8]; Gp = tf(num, den, T); % 控制器参数 Kp = 1.0; Ki = 0.2; Kd = 0.1; Td = 0.5; % DMC参数 D = 50; % DMC控制时域长度 L = 10; % DMC预测时域长度 P = 1; % DMC控制器输出权重 M = 1; % DMC参考信号权重 % 初始化 y = zeros(sim_time, 1); u = zeros(sim_time, 1); e = zeros(sim_time, 1); du = zeros(sim_time, 1); y_sp = zeros(sim_time, 1); % 稳态增益 Gp_ss = dcgain(Gp); Kp = Kp/Gp_ss; % DMC预测模型 Gp_pred = zeros(D, L); for i = 1:D for j = 1:L if i+j <= length(num) Gp_pred(i,j) = num(i+j) - den(2:end)*Gp_pred(max(1,i-1):i-1,j); else Gp_pred(i,j) = -den(2:end)*Gp_pred(max(1,i-1):i-1,j); end end end % 控制循环 for k = 1:sim_time % 实时更新误差 y(k) = lsim(Gp, u(1:k), T*(0:k-1)'); e(k) = r - y(k); % DMC预测 y_sp(k+1:k+D) = y(k) + Gp_pred(:,1:L)*du(max(1,k-L):k-1); % DMC控制器 Mp = zeros(Nu, Nu); for i = 1:Nu for j = 1:Nu Mp(i,j) = Gp_pred(i+j-1, 1:L)*Gp_pred(j, 1:L)'; end end M = diag([M*ones(D,1);zeros(Nu-D,1)]); I = eye(Nu); K = (Mp+lambda*I)\M; delta_u = K*[y_sp(k+1:k+N);zeros(Nu-N,1)] - du(k); % PID控制器 u(k) = Kp*e(k) + Ki*T*sum(e(1:k)) + Kd*(e(k) - e(max(1,k-Td/T))); u(k) = u(k) + delta_u(P); % 串级控制器,将DMC控制器输出作为PID控制器的参考信号 du(k+1) = u(k) - u(k-1); end % 输出结果 t = T*(0:sim_time-1)'; plot(t, y, 'b', t, r*ones(sim_time,1), 'r'); xlabel('Time (s)'); ylabel('Output'); legend('Output', 'Reference'); ``` 这个示例演示了如何将DMC控制器和PID控制器串联起来实现更好的控制效果。其中,DMC控制器用于对系统进行预测控制,而PID控制器则用于在实时控制中对DMC控制器输出进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值