热门标签 | 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文件或技术支持的童鞋请联系我。

 

 

 

 

 


推荐阅读
  • 利用 Jest 和 Supertest 实现接口测试的全面指南
    本文深入探讨了如何使用 Jest 和 Supertest 进行接口测试,通过实际案例详细解析了测试环境的搭建、测试用例的编写以及异步测试的处理方法。 ... [详细]
  • 本文探讨了在JavaScript中执行字符串形式代码的多种方法,包括使用eval()函数以及跨页面调用的方法。同时,文章详细介绍了JavaScript中字符串的各种常用方法及其应用场景。 ... [详细]
  • 本文分析了一个基于ASP代码改编的PHP MD5加密函数,指出其存在的问题,并提供了解决方案。通过对比ASP和PHP在处理相同数据时的不同表现,探讨了两种语言在实现MD5算法上的细微差别。 ... [详细]
  • Webpack中实现环境与代码的有效分离
    本文探讨了如何在Webpack中有效地区分开发与生产环境,并实现代码的合理分离,以提高项目的可维护性和加载性能。 ... [详细]
  • 本文通过探讨React中Context的使用,解决了在多层级组件间传递状态的难题。我们将详细介绍Context的工作原理,并通过实际案例演示其在项目中的具体应用。 ... [详细]
  • 精通C++并非易事,为何它比其他语言更难掌握?这主要归因于C++的设计理念,即不强迫用户接受特定的编程风格或限制创新思维。本文探讨了如何有效学习C++,并介绍了几本权威的学习资源。 ... [详细]
  • 本文介绍如何在Ubuntu环境下为OpenWrt系统构建并安装首个'Hello World'应用程序的IPK包。文章不仅涵盖了基本的环境搭建,还详细说明了代码编写、Makefile配置及最终的IPK包生成与安装过程。 ... [详细]
  • 本文探讨了STL迭代器的最佳实践,包括iterator与const_iterator、reverse_iterator及其const版本之间的关系,以及如何高效地转换和使用这些迭代器类型。 ... [详细]
  • addcslashes—以C语言风格使用反斜线转义字符串中的字符addslashes—使用反斜线引用字符串bin2hex—函数把包含数据的二进制字符串转换为十六进制值chop—rt ... [详细]
  • 本文探讨了Java编程中MVC模式的优势与局限,以及如何利用Java开发一款基于鸟瞰视角的赛车游戏。 ... [详细]
  • 详细的介绍针对graphiclayer的空间查询。首先,空间查询的方式:提供多种类型的空间查询,包括点周边、线周边、面内等多种方式;其次,图形绘制完成后状态的展示;再次 ... [详细]
  • 1、文件位置:mntwwwrootaddonswe7_wmallincwebstoretangshitable.inc.php改为下面这个$paramsarr ... [详细]
  • 解决VSCode中文乱码问题的综合方案
    在使用VSCode进行开发时,尤其是涉及Python编程,可能会遇到中文乱码的问题。本文总结了多种有效的解决方案,帮助开发者快速解决这一常见问题。 ... [详细]
  • 本文总结了WebSphere应用服务器出现宕机问题的解决方法,重点讨论了关键参数的调整,包括数据源连接池、线程池设置以及JVM堆大小等,旨在提升系统的稳定性和性能。 ... [详细]
  • MyBatis 开发技巧:延迟加载与查询缓存详解
    本文详细探讨了 MyBatis 中的延迟加载和查询缓存机制,旨在帮助开发者更好地理解和利用这些特性来优化数据库访问性能。 ... [详细]
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社区 版权所有