首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Simulink调用fmincon

从Simulink调用fmincon
EN

Stack Overflow用户
提问于 2017-02-06 00:46:38
回答 1查看 2.7K关注 0票数 1

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

正如您所看到的,Matlab函数将调用fminconquadprog,但我希望为我的特定控件类型使用fmincon.请忽略到目前为止与计算效率相关的任何问题。

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

coder.extrinsic('fmincon');

这是必需的,因为否则Simulink将无法编译mex文件。但是,如果执行此操作,则会出现以下错误:

代码语言:javascript
复制
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)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-29 21:46:10

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

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

代码语言:javascript
复制
minimize (y - m x - q)²
subject to  0 ≤ m ≤ 1
            0 ≤ q ≤ 1

这个方案非常简单,我打赌回归器调用fmincon

让我们看看回归器的内部:

代码语言:javascript
复制
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的包装器。让我们来看看它(它里面有两个函数):

代码语言:javascript
复制
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 = 1.2 → m_opt = 1)的同时最小化目标函数的m, q参数(在两个显示中)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42054642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档