【问题标题】:Calling fmincon from Simulink从 Simulink 调用 fmincon
【发布时间】:2020-02-19 22:30:30
【问题描述】:

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

如您所见,Matlab S-Function 会调用 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)。

谁能帮帮我?提前致谢!

【问题讨论】:

  • 从您的描述看来,您使用的是 MATLAB Function 块,而不是 m 代码 S-Function。 MATLAB Function 块在模型初始化期间转换为 C 并编译,并且仅支持 MATLAB 语言的子集。您需要编写一个 m 代码 S-Function。它们不会将 m 代码转换为 C,而是在标准 MATLAB 计算引擎中运行它(作为解释代码),因此支持完整的 MATLAB 语言。
  • 您也可以只使用 MATLAB Function 块作为另一个 m 代码函数的包装器。在MATLAB Function 中,您将其他函数定义为外部函数,只需将适当的输入传递给它,然后将其输出返回到 Simulink 模型。然后在另一个函数中定义需要执行的优化。
  • 谢谢!没错,为了节省编程时间,我选择了 Matlab 功能块。我现在将再试一次并将其表示为 S-Function。
  • 我尝试了第二种方法,效果也不错。但是,我认为 S-Function 方法更简洁。如果您发布一个总结您的两点的答案,我会投赞成票。
  • @PhilGoddard 如果我错了,请纠正我,但从 Mathworks 的文档(S-Func;MATLAB Func)看来,两者都被编译为 C MEX。此外,来自第二个链接:“外部函数在模型模拟期间在工作区中执行”,因此它们在 MATLAB 中进行解释。不确定fmincon提到的错误OP来自哪里。

标签: matlab simulink s-function fminsearch


【解决方案1】:

我通常不会在fmincon 函数上使用coder.extrinsic,而是为我必须解决的优化问题编写一个包装器,作为Matlab 的.m 文件函数(即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)。

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多