非线性约束条件参数matlab

时间:2013-04-01 22:55:36

标签: matlab constraints nonlinear-optimization

我尝试在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

并且在搜索最佳期间,违反了这种非线性约束。 有人可以指出我是否没有正确定义非线性条件约束?

1 个答案:

答案 0 :(得分:2)

我不确定fmincon能否应对运行期间更改的约束数量。

当您不希望约束处于活动状态时,最好返回满足约束c(x)&lt; = 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'函数的东西......即。在您希望约束适用的地方,只有零的东西。

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