Нелинейные ограничения равенства и неравенства в наборе инструментов оптимизации Matlab - PullRequest
0 голосов
/ 24 декабря 2018

Мне нужно оптимизировать следующую функцию:
f (x) = x ^ 2 + y ^ 3 + z ^ 4

с ограничениями:
x + y + z = 10
1,5 + x y - z <= 0 <br>x y> = -10

и ограничения:
-10 <= x <= 10 <br>-5<= y <= 5 <br>0 <= z <= inf <br>

Мне нужно использовать следующие параметры: 'LargeScale' = 'off', 'GradObj' = 'on', 'GradConstr'=' on ',
и мой код выглядит так:

options = optimset('LargeScale', 'off', 'GradObj','on','GradConstr','on');
A = [-1 0 0
  1 0 0
  0 -1 0
  0 1 0
  0 0 -1];
b = [-10 10 -5 5 0];
Aeq = [1 1 1];
beq = [10];
[x fval] = fmincon(@fun,[0 0 0],A, b, Aeq, beq,[],[],@constr, options);

function [y,g] = fun(x)
y = x(1).^2+x(2).^3+x(3).^4;
    if nargout > 1
        g = [2*x(1), 3*x(2).^2, 4*x(3).^3];
    end
end
function [c,ceq, GC, GCeq] = constr(x)
    c(1) = 1.5 + x(1)*x(2) - x(3);
    c(2) = -10 - x(1)*x(2);
    ceq = [];
    if nargout > 2
        GC = [x(2), -x(2);
              x(1), -x(1);
              0   ,    0];
        GCeq = [];
    end
end

Ожидаемые результаты: x = 10
y = -1
z = 0,05

Можете ли вы дать мне совет?

1 Ответ

0 голосов
/ 24 декабря 2018

Линейные ограничения, которые вы применяете к x(1) и x(2), неверны.Два ограничения, действующие на x(1), как вы их задали, будут выражаться как:

x(1) <= 10
-x(1) <= -10

Единственное значение, которое удовлетворяет этим требованиям, - x(1)=10.Установите оба значения RHS на 10, и вы наложите ограничения на x(1), которых вы пытаетесь достичь.

Кроме того, градиент, который вы указываете для первого нелинейного ограничения, является неправильным, вы пропускаете значение -1 для градиента относительно x(3).

Я внес изменения ниже.Когда я запускаю это, я получаю оптимальное решение [8.3084 0.0206 1.6710].Я не считаю, что ожидаемые вами результаты верны, они не удовлетворяют условию равенства x + y + z = 10

options = optimset('LargeScale', 'off', 'GradObj','on','GradConstr','on');
A = [-1 0 0
  1 0 0
  0 -1 0
  0 1 0
  0 0 -1];
b = [10 10 5 5 0];
Aeq = [1 1 1];
beq = [10];
[x fval] = fmincon(@fun,[0 0 0],A, b, Aeq, beq,[],[],@constr, options);

function [y,g] = fun(x)
y = x(1).^2+x(2).^3+x(3).^4;
    if nargout > 1
        g = [2*x(1), 3*x(2).^2, 4*x(3).^3];
    end
end
function [c,ceq, GC, GCeq] = constr(x)
c(1) = 1.5 + x(1)*x(2) - x(3);
c(2) = -10 - x(1)*x(2);
ceq = [];
if nargout > 2
    GC = [x(2), -x(2);
          x(1), -x(1);
          -1   ,    0];
    GCeq = [];
end
...