热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MPC控制算法代码matlab实现,matlabfunc实现,自编写matlabfunction实现MPC算法

MPC工具箱提供的MPC模块不能实现权重参数的实时修改,有必要自己编写一个实现模型预测控制算法的matlabfunction。主义事项求解QP问题的时候使用哪一个

MPC工具箱提供的MPC模块不能实现权重参数的实时修改,有必要自己编写一个实现模型预测控制算法的matlab function。


  • 主义事项

求解QP问题的时候使用哪一个函数更好????

mpcqpsolver   (To be removed) Solve a quadratic programming problem using the KWIK algorithm

quadprog

mpcInteriorPointSolver

以下物理量必须设置相同,不然容易报错或求解不出理论控制量:

1. matlab func模块的调用频率

2. MPC算法的采样频率。

3. 被控对象的状态空间方程的离散化频率。

以一个双积分系统为例子,MPC的实现代码如下

function U = fcn(Ref,x,v,q1,ut)
% clear
% s=tf('s')
% G=1/s^2
% G=ss(G)
% A=G.A
% B=G.B
% C=eye(2)
% D=zeros(2,1)
% sys=ss(A,B,C,D)
% plant=c2d(sys,0.01)
coder.extrinsic('quadprog');
U = 0;
deltaU =0;Ak = ...[1 0;0.01 1];Bk = ...
[0.01;
5e-05];Ck=eye(2);
Dk=zeros(2,1);dk=zeros(6,1);
ek=zeros(4,1);
% 权重矩阵
Q=diag([1.5+q1,100]); % 1.52 100 2.8
R=diag([0]);
S=diag([0]);
pho=0.05;
e=0.1;Ts=0.01;xk=[v;x;ut];
yref=Ref;% 维数说明
m=1; % 控制
n=2; % 状态变量
n0=m+n; % 新的状态维度
Hc=2;
Hp=10;
p=size(Ck,1) ; %输出量维数
% 已知量
u_1 = ut;
U_1=kron(ones(Hc,1),u_1);
% syms deltau deltau1 deltau2 deltau3 deltau4
% deltaU=[deltau;deltau1;deltau2;deltau3;deltau4]
% U=M*deltaU+U_1%% 令 x=[x(k);u(k-1)] 控制量变为 delta u 则新系统的状态空间为
Ak=[ Ak,Bk;zeros(m,n),eye(m) ];
Bk=[Bk;eye(m)];
Ck=[Ck,Dk];
Dk=Dk;
dk=[dk;zeros(m,1)];
ek=ek;
%% 预测输出矩阵 k+1 ... K+Hp 共Hp个
% 控制输出矩阵 k...K+Hc-1 共Hc个% compute PSIk
[m1,n1]=size(Ck*Ak);
PSIk=zeros(m1*Hp , n1);
for i=1:HpPSIk( (i-1)*m1+1 :(i-1)*m1+m1 , 1:n1)=Ck*Ak^i;
end
% compute THETAk
[m2,n2]=size(Ck*Bk);
THETAk=zeros(m2*Hp , n2*Hc);
for i=1:Hpfor j=1:Hcif i>=jTHETAk( (i-1)*m2+1:(i-1)*m2+m2, (j-1)*n2+1:(j-1)*n2+n2 ) = Ck*Ak^(i-j)*Bk;elseif j-i==1THETAk( (i-1)*m2+1:(i-1)*m2+m2, (j-1)*n2+1:(j-1)*n2+n2)=Dk;elseTHETAk( (i-1)*m2+1:(i-1)*m2+m2, (j-1)*n2+1:(j-1)*n2+n2)=zeros(m2,n2);endend
end
% compute TAUk
[m3,n3]=size(Ck);
TAUk=zeros(m3*Hp , n3*Hp);
for i=1:Hpfor j=1:Hpif i>=jTAUk( (i-1)*m3+1:(i-1)*m3+m3, (j-1)*n3+1:(j-1)*n3+n3 ) = Ck*Ak^(i-j);elseTAUk( (i-1)*m3+1:(i-1)*m3+m3, (j-1)*n3+1:(j-1)*n3+n3)=zeros(m3,n3);endend
end
% compute PHIk
PHIk=zeros(n0*Hp,1);
% compute LAMBDA
LAMBDAk=zeros(p*Hp,1); %% 线性时变时候不为0!!!!!!!!!!!!!% compute Qe
[m4,n4]=size(Q);
Qe=zeros(m4*Hp,n4*Hp);
for i=1:Hpfor j=1:Hpif i==jQe( (i-1)*m4+1:(i-1)*m4+m4, (j-1)*n4+1:(j-1)*n4+n4 ) = Q;elseQe( (i-1)*m4+1:(i-1)*m4+m4, (j-1)*n4+1:(j-1)*n4+n4 )=zeros(m4,n4);endend
end
% compute Re
[m5,n5]=size(R);
Re=zeros(m5*Hc,n5*Hc);
for i=1:Hcfor j=1:Hcif i==jRe( (i-1)*m5+1:(i-1)*m5+m5, (j-1)*n5+1:(j-1)*n5+n5 ) = R;elseRe( (i-1)*m5+1:(i-1)*m5+m5, (j-1)*n5+1:(j-1)*n5+n5 )=zeros(m5,n5);endend
end
% compute Se
[m6,n6]=size(S);
Se=zeros(m6*Hc,n6*Hc);
for i=1:Hcfor j=1:Hcif i==jSe( (i-1)*m6+1:(i-1)*m6+m6, (j-1)*n6+1:(j-1)*n6+n6 ) = S;elseSe( (i-1)*m6+1:(i-1)*m6+m6, (j-1)*n6+1:(j-1)*n6+n6 )=zeros(m6,n6);endend
endK=tril(ones(Hc));
Im=eye(m,m);
M=kron(K,Im);[m7,n7]=size(yref);
Yrefk=zeros(m7*Hp,1);
for i=1:HpYrefk( (i-1)*m7+1:(i-1)*m7+m7 , 1)=yref;
end
epsilon=PSIk*xk+TAUk*PHIk+LAMBDAk-Yrefk;
%% 最终变量 Hk Gk Pk
Hk=...[ 2*(THETAk'*Qe*THETAk+Re+M'*Se*M) , zeros(m*Hc,1) ;zeros(1,m*Hc) , pho ];Gk=...[ 2*epsilon'*Qe*THETAk+2*U_1'*Se*M , 0 ];Pk=...[ epsilon'*Qe*epsilon + U_1'*Se*U_1 + pho*e^2 ];%% QP问题
H=Hk;
c=Gk';
A=[];
b=[];
Aeq=[];
beq=[];
Minv=M^-1;
VLB=[Minv*(-ones(m*Hc,1)-U_1);-1];
VUB=[Minv*(ones(m*Hc,1)-U_1);1];
[x,z,fla,out]=quadprog(H,c,A,b,Aeq,beq,VLB,VUB);
deltaU = x(1);U = ut(1)+deltaU ;


MPC算法的参考文献为:

基于模型预测控制的无人驾驶车辆轨迹跟踪控制算法研究_孙银健

 

!!!!!

声明:若果您觉得您被侵犯了权利,请联系本博客作者,同样的,若引用了本文也请注明出处。

!!!!!

需要源代码、slx文件或技术支持的童鞋请联系我。

 

 

 

 

 


推荐阅读
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
author-avatar
宝一一0702
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有