2013-04-01 112 views
0

我尝试在fmincon优化器中强加一个非线性约束。问题是只有当其中一个参数为负时,非线性约束才应该是相关的。该代码是这样的:非线性约束条件参数matlab

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

你能告诉你如何调用你的函数吗?因为它没有显示足够的代码。 'x = fmincon(..,..,..,..,'),并且包括所有参数的定义将会有所帮助。 – Floris

回答

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”函数的东西......即。在你想要应用约束的地方,只是跨过零点。

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