【问题标题】:Constrained minimization using fmincon使用 fmincon 进行约束最小化
【发布时间】:2016-10-11 18:38:08
【问题描述】:

我想使用fmincon 解决一个约束最小化问题。但是约束是根据f(x_0)<a 之类的函数定义的,其中x_0 是问题的解决方案。有可能吗?

在文档中,示例仅包含此 x_0<a 表单。

代码:

f_obj = @(x)var_zcors(x,t_cw);
opt_theta = fminbnd(f_obj,0,360);

现在,x 应该被限制为 f_constraint(x)< a

更新(来自@Phil Goddard 的回答):

f_obj = @(x)var_zcors(x,t_cw);
f_nl = @(x)deal(f_constraint(x)-a,[]);
x0 = 180; % or whatever is appropriate
opt_theta = fmincon(f_obj,x0,[],[],[],[],0,360,f_nl);

在上面的代码中说f_constraint返回一个向量[x_min y_max]而不是一个标量。我想指定以下约束:

x_min>b
y_max<a

有什么方法可以做到这一点?

【问题讨论】:

  • 你有一个非线性约束,需要使用fmincon的第9个输入。有关详细信息和使用示例,请参阅文档。
  • @PhilGoddard 抱歉找不到。你指的是这个吗? in.mathworks.com/help/optim/ug/fmincon.html#busqazq-1
  • 是的,根据我评论中的链接。
  • @PhilGoddard 谢谢,我又经历了一遍。不确定会这样做,您能否为我的问题显示代码以更好地解释。在我的问题中,f_constraint 是 matlab 函数。

标签: matlab optimization constraints


【解决方案1】:

您有一个非线性约束,因此需要使用非线性约束输入到fmincon。也就是说,

f_obj = @(x)var_zcors(x,t_cw);
f_nl = @(x)deal(f_constraint(x)-a,[]);
x0 = 180; % or whatever is appropriate
opt_theta = fmincon(f_obj,x0,[],[],[],[],0,360,f_nl);

如果您有多个(非线性)约束,那么根据文档中的示例,您编写一个函数来返回一个约束向量。在您的情况下,您想在单独的文件中编写一个函数,如下所示:

function [c,ceq] = my_nonlinear_constraints(x,ab)

% define the non-linear inequality constraints
% (This assumes that ab is a 2 element vector containing your a and b
% variables.)
[x_min,y_max] = f_constraint(x);
c = nan(2,1);
c(1) = -x_min+ab(2); % this is x_min>b
c(2) = y_max-ab(1);  % this is y_max<a

% There are no non-linear equality constraints, but this is required
ceq = [];

然后,要执行优化,您需要

% Variables a and b must be defined prior to this.
f_obj = @(x)var_zcors(x,t_cw);
f_nl = @(x)my_nonlinear_constraints(x,[a b]);
x0 = 180; % or whatever is appropriate
opt_theta = fmincon(f_obj,x0,[],[],[],[],0,360,f_nl);

【讨论】:

  • 谢谢!在f_nl = @(x)deal(f_constraint(x)-a,[]); 中为什么要减去a。另外,为了确保我理解,它将评估每个解决方案的 f_nl (x_0),f_nl 应该返回什么,以便告诉 fmincon x_0 不满足约束。
  • 根据文档,减去a,因为必须以constraint &lt;= 0 的形式指定非线性约束,即0 必须在不等式的右侧。 f_nl 还必须返回 2 个输出:第一个必须是非线性不等式约束,第二个必须是非线性等式约束(您没有任何等式约束,因此上面的代码返回一个空矩阵 []
  • 感谢您的清晰解释!你能否告诉我对两个这样的约束而不是像现在的答案那样只做一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多