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

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

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

подвергните ограничениям

x 1x2 x 1x 2 ≤ –1.5,
x 1x2 ≥ –10.

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

x 1x2 x 1x 2 + 1,5 ≤ 0,
x 1x2 – 10 ≤ 0.
(2)

Шаг 1: Запишите файл objfun.m для целевой функции.

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);

Шаг 2: Запишите файл confun.m для ограничений.

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 = [];

Шаг 3: Вызовите ограниченную стандартную программу оптимизации.

x0 = [-1,1];     % Make a starting guess at the solution
options = optimoptions(@fmincon,'Algorithm','sqp');
[x,fval] = ... 
fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options);

fmincon производит решение x со значением функции fval:

x,fval
x = 
   -9.5474  1.0474 
fval =
    0.0236

Можно оценить ограничения в решении путем ввода

[c,ceq] = confun(x)

Это возвращает числа близко к нулю, такой как

c =

   1.0e-14 *

    0.5107
   -0.5329


ceq =

     []

Обратите внимание на то, что оба ограничительных значения, к в маленьком допуске, меньше чем или равном 0; то есть, x удовлетворяет c (x) ≤ 0.

Похожие темы