Нелинейные ограничения неравенства

В этом примере показано, как решить скалярную задачу минимизации с нелинейными ограничениями неравенства. Проблема состоит в том, чтобы найти x это решает

minxf(x)=ex1(4x12+2x22+4x1x2+2x2+1),

удовлетворяющее ограничениям

x1x2-x1-x2-1.5x1x2-10.

Поскольку ни одно из ограничений не линейно, создайте функцию, confun.m, это возвращает значение обоих ограничений в векторном c. Поскольку fmincon решатель ожидает, что ограничения будут написаны в форме c(x)  0, запишите свою ограничительную функцию, чтобы возвратить следующее значение:

c(x)=[x1x2-x1-x2+1.5-10-x1x2].

Создайте целевую функцию

Функция помощника 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

Похожие темы