Линейные ограничения, которые вы применяете к 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