matlab - 二阶摆模型的 NMPC 优化

标签 matlab optimization code-generation simulink

希望我能够很好地解释我的问题。

我正在研究非线性模型预测控制的实现。

我有 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 ,均具有状态空间线性模型和二次目标。

overhead pendulum

inverted pendulum

让它运行得更快的方法之一是避免使用 Simulink 接口(interface)和求解 MPC 的射击方法。在有限元上采用正交配置的同步方法速度更快,并且还可以实现 higher index DAE model forms如果您想使用非线性模型。

关于matlab - 二阶摆模型的 NMPC 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29352215/

相关文章:

mysql - SQL有没有办法在不使用UNION的情况下保留元数据的同时将多个时间列排序为一个?

java - Enterprise Architect UML 类代码生成

matlab - 在Matlab中从视频中提取音频。音频减速

java - 如何以编程方式拦截 GC 以将信息打印到我的日志中

algorithm - 背包(或分区)算法的变体

mysql - 在哪里可以下载 Codesmith Generator 的 MySQLSchemaProvider?

java - 使用其源代码作为字符串创建一个 java 类

MATLAB:如何重用绘图选项?

matlab - 用 MATLAB 读取 CSV 文件?

matlab - 编程练习: Does not creating variables at first lead to faster computation?