我正在尝试在Simulink-Matlab框架中实现特定类型的模型预测控制。为此,我的计划是让Simulink中的动态模型调用外部Matlab S函数,该函数依次运行调用不同Simulink文件的优化。因此,程序流程如下:
Simulink - > Matlab(fmincon
或quadprog
) - > Simulink中。
如您所见,Matlab S函数将调用fmincon
或quadprog
,但我想将fmincon用于我的特定控件类型。请忽略迄今为止与计算效率相关的任何问题。
我试过这种方法,但有两个非常明显的问题: *首先,为了编译代码没有错误(基本上获取.mex文件,我不需要在C中编程),我添加了命令
coder.extrinsic( 'fmincon');
这是必需的,否则Simulink无法编译mex文件。但是,如果这样做,则会出现以下错误:
Function handles cannot be passed to extrinsic functions.
我试图改变我的成本函数,将Simulink改为另一个更简单的成本函数(x.^2
),但我仍然得到错误。
在寻找问题的解决方案时,我在Mathworks博客上找到了相同的问题(即如何从Simulink中的Matlab函数调用fmincon
,但没有答案(https://uk.mathworks.com/matlabcentral/answers/65202-optimization-calling-fmincon-in-simulink-embedded-block)。
有人能帮我一把吗?提前谢谢!
答案 0 :(得分:1)
我不是在coder.extrinsic
函数上使用fmincon
,而是编写优化问题的包装器,我必须将其作为Matlab的.m
文件函数来解决(即{{1 }})并在simulink Matlab函数中声明opt_problem
。我给你一个简单的例子:
考虑这个Simulink“模型”,其中在每个集成步骤中我想解决一些生成数据的线性回归问题。优化问题的形式如下:
coder.extrinsic('opt_problem')
该计划非常简单,请注意回归者调用minimize (y - m x - q)²
subject to 0 ≤ m ≤ 1
0 ≤ q ≤ 1
:
让我们看看回归内部:
fmincon
此函数只是外部函数function [m, q] = regressor(xs, ys, mic, qic)
coder.extrinsic('opt_problem'); % <- Informing the Coder
m = 0;
q = 0;
[m, q] = opt_problem(xs, ys, mic, qic); % <- Optimal problem wrapper call
end
的包装器。让我们看看(里面有两个功能):
opt_problem
就是这样。正如您在图片中看到的那样,该方案运行并且解决方案是function [m, q] = opt_problem(xs, ys, mic, qic)
fmincon_target = @(mq)(target(mq, xs, ys));
mq = fmincon(fmincon_target, [mic; qic], [], [], [], [], [0; 0], [1; 1]);
m = mq(1);
q = mq(2);
end
function r = target(mq, xs, ys)
r = norm(ys - xs.*mq(1) - mq(2));
end
参数(在两个显示中),它们在遵守约束(m, q
)的同时最小化目标函数。