1

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

如您所见,Matlab S-function 会调用fminconor quadprog,但我想将 fmincon 用于我的特定控件类型。请忽略到目前为止与计算效率相关的任何问题。

我尝试了这种方法,但是有两个非常明显的问题: *首先,为了编译代码不会出错(基本上是获得一个.mex文件,我不需要用C编程),我添加了命令

coder.extrinsic('fmincon');

这是必需的,否则 Simulink 无法编译 mex 文件。但是,如果您这样做,则会收到以下错误:

Function handles cannot be passed to extrinsic functions.

我试图将调用 Simulink 的成本函数更改为另一个更简单的成本函数 ( x.^2),但仍然出现错误。

寻找问题的解决方案,我fmincon在 Mathworks 博客上发现了相同的问题(即如何从 Simulink 中的 Matlab 函数调用),但没有答案(https://uk.mathworks.com/matlabcentral/answers/65202 -optimization-calling-fmincon-in-simulink-embedded-block)。

谁能帮我一把?提前致谢!

4

1 回答 1

1

coder.extrinsic我通常不会在函数上使用,而是为fmincon我必须解决的优化问题编写一个包装器,作为.mMatlab 的文件函数(即opt_problem)并coder.extrinsic('opt_problem')在 simulink Matlab 函数中声明。我给你一个简单的例子:

考虑这个 Simulink“模型”,在每个集成步骤中,我想解决一些生成数据的线性回归问题。优化问题的形式如下:

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在尊重约束 ( ) 的同时最小化目标函数的参数(在两个显示中m = 1.2 → m_opt = 1)。

于 2018-05-29T13:46:09.917 回答