В этом примере показано, как решить скалярную задачу минимизации с нелинейными ограничениями неравенства. Проблема состоит в том, чтобы найти это решает
удовлетворяющее ограничениям
Поскольку ни одно из ограничений не линейно, создайте функцию, confun.m
, это возвращает значение обоих ограничений в векторном c
. Поскольку fmincon
решатель ожидает, что ограничения будут написаны в форме , запишите свою ограничительную функцию, чтобы возвратить следующее значение:
.
Функция помощника objfun
целевая функция; это появляется в конце этого примера. Установите fun
аргумент как указатель на функцию к objfun
функция.
fun = @objfun;
Нелинейные ограничительные функции должны возвратить два аргумента: c
, ограничение неравенства и ceq
, ограничение равенства. Поскольку эта проблема не имеет никакого ограничения равенства, функция помощника confun
в конце этого примера возвращает []
как ограничение равенства.
Установите начальную точку на [-1,1]
.
x0 = [-1,1];
Проблема не имеет никаких границ или линейных ограничений. Установите те аргументы на []
.
A = []; b = []; Aeq = []; beq = []; lb = []; ub = [];
Решите задачу с помощью fmincon
.
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@confun)
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
Выходное сообщение указывает, что решение выполнимо относительно ограничений. Чтобы перепроверить, выполните нелинейную ограничительную функцию в решении. Отрицательные величины указывают на ограничения, которым удовлетворяют.
[c,ceq] = confun(x)
c = 2×1
10-4 ×
-0.3179
-0.3063
ceq = []
И нелинейные ограничения отрицательны и близко к нулю, указывая, что решение выполнимо и что оба ограничения активны в решении.
Этот код создает objfun
функция помощника.
function f = objfun(x) f = exp(x(1))*(4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1); end
Этот код создает confun
функция помощника.
function [c,ceq] = confun(x) % Nonlinear inequality constraints c = [1.5 + x(1)*x(2) - x(1) - x(2); -x(1)*x(2) - 10]; % Nonlinear equality constraints ceq = []; end