MPC matlab仿真代码框架

摘抄自B站DR_CAN大神,万分感谢传授知识。我仅在此做一下记录,方便日后学习。

首先写一个MPC函数:

function [M,C,Q_bar,R_bar,G,E,H,U_k,u_k]=MPC_Zero_Ref(A,B,Q,R,F,N,x_k)  % N是预测区间
n=size(A,1); % 得到A的行数
p=size(B,2); % 得到B的列数
M=[eye(n);zeros(N*n,n)]; % 初始化M矩阵,上面是n*n的单位矩阵,下面是n列0矩阵
C=zeros((N+1)*n,N*p);  % 初始化C矩阵

% 定义M和C
tmp=eye(n);  %定义一个n*n的单位矩阵
for i=1:N
    rows=i*n+(1:n);  % i=1,n=2的时候,(1:2)就是对第三行、第四行赋值
    C(rows,:)=[tmp*B,C(rows-n, 1:end-p)]; % 将C矩阵填满
    tmp=A*tmp;
    M(rows,:)=tmp ; % 将矩阵M写满
end
% 定义Q_bar和
s_q=size(Q,1);
s_r=size(R,1);
Q_bar=zeros(N+1*s_q,(N+1)*s_q);
for i=0:N
    Q_bar(i*s_q+1:(i+1)*s_q,i*s_q+1:(i+1)*s_q)= Q;
end
Q_bar(N*s_q+1:(N+1)*s_q,N*s_q+1:(N+1)*s_q)= F;

%定义R——bar
R_bar=zeros(N*s_r,N*s_r);
for i=0:N-1
    R_bar(i*s_r+1:(i+1)*s_r,i*s_r+1:(i+1)*s_r)= R;
end

%   求解
G=M'*Q_bar*M;
E=C'*Q_bar*M;
H=C'*Q_bar*C+R_bar;

%
f=(x_k'*E')';  %定义f矩阵
U_k=quadprog(H,f);
end

然后在命令行输入:

clc;clear;
A=[1,0.1;0,2];
B=[0;0.5];
N=25;
x_k=[5;5];
Q=[1 0;0 1];
R=0.1;
F=[1 0;0 1];
[M,C,Q_bar,R_bar,G,E,H,U_k]=MPC_Zero_Ref(A,B,Q,R,F,N,x_k);  %前面是输出,后面是输入的初始状态量
% M C Q_bar R_bar,G E H是根据MPC推导出来的,主要就是看输出的控制量U_K
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的MPC(模型预测控制)MATLAB代码示例,用于控制一个具有单个输入和单个输出的一阶系统。请注意,这只是一个示例代码,实际应用需要根据实际系统进行修改和调整。 ``` clear all; close all; % System parameters A = 0.9; B = 1; C = 1; D = 0; % Horizon and simulation time N = 10; T = 20; % Cost function weights Q = 1; R = 1; % Constraints umin = -1; umax = 1; xmin = -10; xmax = 10; % Initial state and reference x0 = 0; xr = 1; % MPC setup mpcobj = mpc(A,B,C,D,N); mpcobj.Model.IsContinuousTime = false; mpcobj.Weights.Output = Q; mpcobj.Weights.ManipulatedVariable = R; mpcobj.ManipulatedVariables.Min = umin; mpcobj.ManipulatedVariables.Max = umax; mpcobj.OutputVariables.Min = xmin; mpcobj.OutputVariables.Max = xmax; % Simulate x = x0; u = 0; y = C*x; for t=1:T % Solve MPC problem mpcobj.OutputVariables.Reference = xr*ones(N,1); [uopt,info] = mpcmove(mpcobj,x,u); if info ~= 0 warning('MPC problem infeasible'); end % Apply control input u = uopt(1); y = C*x; x = A*x + B*u; % Plot results subplot(2,1,1); plot(t,y,'bo',t,xr,'r--'); xlabel('Time'); ylabel('Output'); subplot(2,1,2); plot(t,u,'bo'); xlabel('Time'); ylabel('Input'); drawnow; end ``` 这段代码演示了如何使用MATLAB的MPC工具箱来设计和实现一个简单的MPC控制器,并用于控制一个一阶系统。其包括系统参数的定义、控制目标的设定、约束条件的设置等。实际应用,需要根据不同的系统进行修改和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值