нелинейные ограничения, обусловленные параметрами matlab

Я пытаюсь наложить нелинейное ограничение в оптимизаторе 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

а также при поиске оптимума это нелинейное ограничение нарушается. Может ли кто-нибудь указать, правильно ли я определил нелинейное условное ограничение?


person user1545441    schedule 01.04.2013    source источник
comment
Можете ли вы показать, как вы вызываете свою функцию? Поскольку вы не показываете достаточно кода. x = fmincon(..,..,..,..,..), включая определение всех параметров, было бы полезно.   -  person Floris    schedule 02.04.2013


Ответы (1)


Я не уверен, что 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

Теперь это все еще не очень хорошо, потому что в зависимости от других (линейных?) ограничений на параметры функция ограничений может быть прерывистой. В общем, у вас гораздо больше шансов добиться успеха в оптимизации, если функции ограничений непрерывны и гладки, поэтому попробуйте переопределить свою функцию ограничений во что-то без операторов «если» или функций «абс»... т.е. что-то, что просто пересекает ноль, где вы хотите, чтобы ваше ограничение применялось.

Для достижения этой цели может иметь смысл использовать более одного нелинейного ограничения.

person pancake    schedule 02.04.2013