希望我能够很好地解释我的问题。
我正在研究非线性模型预测控制实现。
我有3个文件: 1)。一个simulink slx文件,它基本上是一个非线性摆模型。 2)。一个函数文件,用于从simulink模型中获取成本函数。 3)。 MPC代码。
费用函数的代码段
**simOut=sim('NonlinearPendulum','StopTime', num2str(Np*Ts));**
%Linearly interpolates X to obtain sampled output states at time instants.
T=simOut.get('Tsim');
X=simOut.get('xsim');
xt=interp1(T,X,linspace(0,Np*Ts,Np+1))';
U=U(1:Nu);
%Quadratic cost function
R=0.01;
J=sum(sum((xt-repmat(r,[1 Np+1])).*(xt-repmat(r,[1 Np+1]))))+R*(U-ur)*...
(U-ur)';
现在我使用此成本函数并使用fmincon对其进行优化,以使用我的MPC代码生成要应用于模型的输入序列。 我的MPC代码的代码片段。
%Constraints -1<=u(t)<=1;
Acons=[eye(Nu,Nu);-eye(Nu,Nu)];
Bcons=[ones(Nu,1);ones(Nu,1)];
options = optimoptions(@fmincon,'Algorithm','active-set','MaxIter',100);
warning off
for a1=1:nf
X=[]; %Prediction output
T=[]; %Prediction time
Xsam=[];
Tsam=[];
%Nonlinear MPC controller
Ubreak=linspace(0,(Np-1)*Ts,Np); %Break points for 1D lookup, used to avoid
% several calls/compilations of simulink model in fmincon.
**J=@(v) pendulumCostFunction(v,x0,ur,r(:,a1),Np,Nu,Ts);**
U=fmincon(J,U0,Acons,Bcons,[],[],[],[],[],options);
%U=fmincon(J,U0,Acons,Bcons);
U0=U;
UUsam=[UUsam;U(1)];%Apply only the first selected input
%Apply the selected input to plant.
Ubreak=[0 Ts]; %Break points for 1D lookup
U=[UUsam(end) UUsam(end)];
**simOut=sim('NonlinearPendulum','StopTime', num2str(Ts));**
在这两个代码中,我标记了我们称之为simulink模型的时间。现在,问题是在我的Windows机器MATLAB R2014B上运行整个模拟仅需5秒钟,大约需要7-8分钟。 有没有办法优化这个?因为,我打算将这个算法扩展到九阶系统,不像二阶摆模型。
如果有人建议使用simulink编码器生成C代码: 我试过了,我遇到的问题是我不知道如何处理生成的几个文件。请尽可能详细。
答案 0 :(得分:0)
从代码片段中可以看出,您正在求解具有二次目标的线性时不变模型。这是overhead crane pendulum和inverted pendulum的一些MATLAB(和Python)代码,都具有状态空间线性模型和二次目标。
使其运行更快的方法之一是避免使用Simulink界面和解决MPC的射击方法。在有限元上采用正交配置的同时方法更快,并且如果您要使用非线性模型,还可以启用higher index DAE model forms。