拨打国际长途的Simulink fmincon(Calling fmincon from Simul

2019-09-27 02:35发布

我想实现一个特定类型在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 ),但我仍然得到错误。

寻找一个解决问题的办法,我发现了同样的问题(即如何调用fmincon从内Simulink的Matlab的功能)的Mathworks公司的博客,但没有答案( https://uk.mathworks.com/matlabcentral/answers/ 65202优化呼-fmincon合Simulink的嵌入式块 )。

谁能给我个忙吗? 提前致谢!

Answer 1:

而不是使用的coder.extrinsicfmincon功能,我通常会写,我要解决一个优化问题的包装.m Matlab的(即文件功能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 。 Let'see它(这里面有两个功能):

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 )。



文章来源: Calling fmincon from Simulink