Обычно, стандартные программы минимизации используют числовые градиенты, вычисленные приближением конечной разности. Эта процедура систематически тревожит каждую из переменных в порядке вычислить ограничительные частные производные и функция. Также можно обеспечить функцию, чтобы вычислить частные производные аналитически. Как правило, проблема решена более точно и эффективно если такая функция обеспечивается.
Рассмотрите, как решить
подвергните ограничениям
x 1x2 – x 1 – x 2 ≤ –1.5,
x 1x2 ≥ –10.
Чтобы решить проблему, использующую аналитически определенные градиенты, сделайте следующее.
function [f,gradf] = objfungrad(x) f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1); % Gradient of the objective function: if nargout > 1 gradf = [ f + exp(x(1)) * (8*x(1) + 4*x(2)), exp(x(1))*(4*x(1)+4*x(2)+2)]; end
function [c,ceq,DC,DCeq] = confungrad(x) c(1) = 1.5 + x(1) * x(2) - x(1) - x(2); % Inequality constraints c(2) = -x(1) * x(2)-10; % No nonlinear equality constraints ceq=[]; % Gradient of the constraints: if nargout > 2 DC= [x(2)-1, -x(2); x(1)-1, -x(1)]; DCeq = []; end
gradf
содержит частные производные целевой функции, f
, возвращенного objfungrad(x)
, относительно каждого из элементов в x
:
(1) |
Столбцы DC
содержат частные производные для каждого соответствующего ограничения (т.е. i
th столбец DC
является частной производной i
th ограничение относительно x
). Таким образом в вышеупомянутом примере, DC
(2) |
Поскольку вы обеспечиваете градиент цели в objfungrad.m
и градиент ограничений в confungrad.m
, необходимо сказать fmincon
, что эти файлы содержат эту дополнительную информацию. Используйте optimoptions
, чтобы повернуть опции SpecifyObjectiveGradient
и SpecifyConstraintGradient
к true
в существующем options
примера:
options = optimoptions(options,'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true);
Если вы не устанавливаете эти опции на 'on'
, fmincon
не использует аналитические градиенты.
Аргументы lb
и ub
помещают нижние и верхние границы в независимые переменные в x
. В этом примере нет никаких связанных ограничений, таким образом установите обоих на []
.
x0 = [-1,1]; % Starting guess options = optimoptions(@fmincon,'Algorithm','sqp'); options = optimoptions(options,'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true); lb = [ ]; ub = [ ]; % No upper or lower bounds [x,fval] = fmincon(@objfungrad,x0,[],[],[],[],lb,ub,... @confungrad,options);
Результаты:
x,fval x = -9.5474 1.0474 fval = 0.0236 [c,ceq] = confungrad(x) % Check the constraint values at x c = 1.0e-13 * -0.1066 0.1066 ceq = []