而不是在 fmincon 函数上使用 coder.extrinsic ,我通常为优化问题编写一个包装器,我必须将其解析为Matlab的 .m 文件函数(即 opt_problem )并在simulink Matlab函数中声明 coder.extrinsic('opt_problem') . 我给你一个简单的例子:
考虑一下这个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'); %
m = 0;
q = 0;
[m, q] = opt_problem(xs, ys, mic, qic); %
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 )的同时最小化目标函数 .