0

我尝试在 fmincon 优化器中施加非线性约束。问题是非线性约束应该仅在参数之一为负时才相关。代码是这样的:

function [c, ceq] = confun_Model11(param)
% Nonlinear inequality constraints: c(x)<=0
if  param(6)<0
    c = (-4)*param(5)*param(7) + param(6)^2+eps;
else
    c = [];
end

%Nonlinear equality constraints: ceq(x)=0
ceq = [];
end

问题是,例如,当使用诊断选项时,Matlab 说没有非线性约束:

Constraints
 Number of nonlinear inequality constraints: 0
 Number of nonlinear equality constraints:   0

并且在寻找最优值的过程中也违反了这种非线性约束。有人可以指出我是否没有正确定义非线性条件约束吗?

4

1 回答 1

2

我不确定 fmincon 能否应对运行时变化的约束数量。

当您不希望约束处于活动状态时,最好返回一个满足约束 c(x)<=0 的值,而不是尝试在代码评估中关闭约束。

function [c, ceq] = confun_Model11(param)
% Nonlinear inequality constraints: c(x)<=0
c = (-4)*param(5)*param(7) + param(6)^2+eps;

% Ensure constraint isn't violated if param(6) is positive
if param(6) >= 0
    c = -abs(c);
end

%Nonlinear equality constraints: ceq(x)=0
ceq = [];
end

现在,这仍然不是很好,因为根据参数上的其他(线性?)约束,约束函数可能是不连续的。一般来说,如果约束函数是连续且平滑的,那么您更有可能在优化方面取得成功 - 因此请尝试将您的约束函数重新定义为没有“if”语句或“abs”函数的东西......即。在您希望应用约束的地方刚刚越过零的东西。

使用多个非线性约束来实现这一目标可能是有意义的。

于 2013-04-02T04:45:14.110 回答