- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
希望我能够很好地解释我的问题。
我正在研究非线性模型预测控制的实现。
我有 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 模型的时间。现在,问题是要运行整个仿真仅 5 秒,在我的 Windows 机器 MATLAB R2014B 上大约需要 7-8 分钟。有没有办法优化这个?因为,与二阶摆模型不同,我计划将该算法扩展到九阶系统。
如果有人对使用 simulink coder 生成 C 代码有建议:我试过了,我面临的问题是我不知道如何处理生成的几个文件。请尽可能详细。
最佳答案
从代码片段来看,您似乎正在求解具有二次目标的线性时不变模型。这是一个 overhead crane pendulum 的一些 MATLAB(和 Python)代码和 inverted pendulum ,均具有状态空间线性模型和二次目标。
让它运行得更快的方法之一是避免使用 Simulink 接口(interface)和求解 MPC 的射击方法。在有限元上采用正交配置的同步方法速度更快,并且还可以实现 higher index DAE model forms如果您想使用非线性模型。
关于matlab - 二阶摆模型的 NMPC 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29352215/
我是一名优秀的程序员,十分优秀!