我尝试在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
并且在搜索最佳期间,违反了这种非线性约束。 有人可以指出我是否没有正确定义非线性条件约束?
答案 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'函数的东西......即。在您希望约束适用的地方,只有零的东西。
使用多个非线性约束来实现这一目标可能是有意义的。