我想使用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
实现这一目标的可行方法是什么?
答案 0 :(得分:6)
您有非线性约束,因此需要使用非线性约束输入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);