【发布时间】:2015-06-03 19:45:04
【问题描述】:
希望我能很好地解释我的问题。
我正在研究非线性模型预测控制实施。
我有 3 个文件: 1)。一个 simulink slx 文件,它基本上是一个非线性摆模型。 2)。一个函数文件,用于从 simulink 模型中获取成本函数。 3)。 MPC 代码。
代价函数的代码sn-p
**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 代码的代码 sn-p。
%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 coder 生成 C 代码有建议: 我已经尝试过了,我面临的问题是我不知道如何处理生成的几个文件。请尽可能详细。
【问题讨论】:
-
fmincon 是收敛还是达到 MaxIter?你的预测范围是多少?运行分析器并检查大部分时间是什么。
-
检查 ACADO:“ACADO 代码生成工具可以自动生成用于快速非线性 MPC 和 MHE 应用的 Gauss-Newton 实时迭代算法 [4, 5]。” ACADO 也有一个 Matlab 界面,而且很容易设置(它有很多例子,包括 NMPC)。
-
fmincon 没有达到 maxiter。我必须尝试从 5 到 20 的预测范围。运行分析器告诉我,从 simulink 模型获取成本函数需要大量时间(几乎 90%),即在成本函数代码的最后一行代码 sn-p
-
我不太了解这些 sn-ps 的顶级算法的整体流程。也许您正在使用 FMINCON 实施顺序二次规划方法来解决 QP 子问题,然后根据新的 SIMULINK 评估细化 AP 目标?也许你是,或者如果不应该是,在 FMINCON 活动集下整体运行(虽然使用昂贵的 SIMULINK 评估,sqp 可能会更好)有限差分准牛顿。 KNITRO 类似于 FMINCON,但可能需要更少的迭代。如果你表现出整体的流程,可以做出更好的评估。但我对 SIMULINK 不是很熟悉。
-
上面的错字(来不及编辑:应该是“QP 目标”,而不是“AP 目标”。
标签: matlab optimization code-generation simulink