В этом примере показано, как решить нелинейную задачу с нелинейными ограничениями с помощью производной информации.
Обычно, стандартные программы минимизации используют числовые градиенты, вычисленные приближением конечной разности. Эта процедура систематически тревожит каждую переменную для того, чтобы вычислить ограничительные частные производные и функция. В качестве альтернативы можно обеспечить функцию, чтобы вычислить частные производные аналитически. Как правило, когда вы предоставляете производную информацию, решатели работают более точно и эффективно.
Проблема состоит в том, чтобы решить
удовлетворяющее ограничениям
Поскольку fmincon
решатель ожидает, что ограничения будут написаны в форме , запишите свою ограничительную функцию, чтобы возвратить следующее значение:
.
Целевая функция
.
Вычислите градиент относительно переменных и .
.
objfungrad
функция помощника в конце этого примера возвращает обоих целевая функция и его градиент во втором выходе gradf
. Установите @objfungrad
как цель.
fun = @objfungrad;
Функция помощника confungrad
нелинейная ограничительная функция; это появляется в конце этого примера.
Производная информация для ограничения неравенства имеет каждый столбец, соответствуют одному ограничению. Другими словами, градиент ограничений находится в следующем формате:
Установите @confungrad
как нелинейная ограничительная функция.
nonlcon = @confungrad;
Укажите к fmincon
решатель, что цель и ограничительные функции предоставляют производную информацию. Для этого используйте optimoptions
установить SpecifyObjectiveGradient
и SpecifyConstraintGradient
значения опции к true
.
options = optimoptions('fmincon',... 'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true);
Установите начальную точку на [-1,1]
.
x0 = [-1,1];
Проблема не имеет никаких границ или линейных ограничений, таким образом, устанавливает те значения аргументов на []
.
A = []; b = []; Aeq = []; beq = []; lb = []; ub = [];
Вызовите fmincon
решать задачу.
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
x = 1×2
-9.5473 1.0474
fval = 0.0236
Решение совпадает с в примере Нелинейными Ограничениями неравенства, который решает задачу, не используя производную информацию. Преимущество использования производных состоит в том, что решение проблемы берет меньше вычислений функции при получении робастности, несмотря на то, что это преимущество не очевидно в этом примере. Используя еще большую производную информацию, как в fmincon Алгоритме Внутренней точки с Аналитическим Гессианом, приносит еще больше пользы, такой как меньше итераций решателя.
Этот код создает objfungrad
функция помощника.
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 end
Этот код создает confungrad
функция помощника.
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 end