从Simulink调用fmincon

时间:2017-02-05 16:46:38

标签: matlab simulink s-function fminsearch

我正在尝试在Simulink-Matlab框架中实现特定类型的模型预测控制。为此,我的计划是让Simulink中的动态模型调用外部Matlab S函数,该函数依次运行调用不同Simulink文件的优化。因此,程序流程如下: Simulink - > Matlab(fminconquadprog) - > Simulink中。

如您所见,Matlab S函数将调用fminconquadprog,但我想将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)。

有人能帮我一把吗?提前谢谢!

1 个答案:

答案 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

enter image description here

让我们看看回归内部:

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)的同时最小化目标函数。