MATLAB 与 Casadi 一起生成代码

问题描述 投票:0回答:0

我正在尝试从使用 CasADi 的 MATLAB 代码 (MPC) 生成 C 代码。我最初尝试使用 MATLAB Coder 来执行此操作,但它无法从 casadi.Function() 生成代码,因为它包含一些 MATLAB Coder 不支持的语句。

因此我尝试使用Casadi本身的代码生成功能,但从用户指南和示例中,我了解到它仅从函数生成C代码,这是正确的吗?这是否意味着我应该从 casadi.Function() 生成 C 代码,并使用 MATLAB Coder 完成其余工作?

这就是为什么我对如何生成 C 代码感到困惑。 MATLAB代码的大致结构如下(仅显示使用Casadi的部分):

ocp.vars.E_BSPb = casadi.SX.sym('E_BSPb');
ocp.vars.E_BSLi = casadi.SX.sym('E_BSLi');
..... and some more symbolic variable declerations
..... (some more code)

ocp.sys.f = casadi.Function('f', {ocp.sys.x, ocp.sys.u}, {ocp.sys.rhs});
..... (some more code)
for k = 1:ocp.N
    ocp.lftsys.X(:, k+1) = ocp.sys.f(ocp.lftsys.X(:, k), ocp.lftsys.U(:, k));
end
.....
ocp.lp_prob = struct('f', ocp.J, 'x', ocp.lftsys.U, 'g', ocp.cnstr.g, 'p', ocp.lftsys.P);
ocp.solver = casadi.nlpsol('solver', 'ipopt', ocp.lp_prob, ocp.solver_opts);
.....
for k = 1:prms.sim.n_days * 24 / prms.sim.dt
    .....
    ocp.sol = ocp.solver('x0', ocp.sol_guess, 'lbx', ocp.cnstr.lbu, 'ubx', ocp.cnstr.ubu,...
                         'lbg', ocp.cnstr.lbg, 'ubg', ocp.cnstr.ubg, 'p', ocp.prmvals);
    .....
end

我想到为 casadi.Function() 生成代码,然后以某种方式将该生成的函数分配给 ocp.sys.f,然后使用 MATLAB Coder 生成 C 代码。但我什至不知道这样的分配是否可行。

有人知道从这段代码生成 C 代码的最佳方法是什么吗?

非常感谢:)

matlab optimization symbolic-math control-theory casadi
© www.soinside.com 2019 - 2024. All rights reserved.