matlab优化工具箱中的非线性等式和不等式约束
Nonlinear Equality and Inequality Constraints in matlab optimization toolbox
我需要优化以下功能:
f(x) = x^2 + y^3 + z^4
有约束条件:
x + y + z = 10
1.5 + xy - z <= 0
xy >= -10
和限制:
-10 <= x <= 10
-5 <= y <= 5
0 <= z <= inf
我需要使用这些选项:
'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
你能给我一个建议吗?
您应用于 x(1)
和 x(2)
的线性约束不正确。正如您给定的那样,作用于 x(1)
的两个约束将表示为:
x(1) <= 10
-x(1) <= -10
唯一满足这些的值是x(1)=10
。将两个 RHS 值都设置为 10,您将强制执行您试图达到的 x(1)
的界限。
此外,您为第一个非线性约束提供的梯度不正确,您缺少关于 x(3)
的梯度的 -1 值。
我已经进行了以下修改。当我 运行 时,我得到了 [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
我需要优化以下功能:
f(x) = x^2 + y^3 + z^4
有约束条件:
x + y + z = 10
1.5 + xy - z <= 0
xy >= -10
和限制:
-10 <= x <= 10
-5 <= y <= 5
0 <= z <= inf
我需要使用这些选项:
'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
你能给我一个建议吗?
您应用于 x(1)
和 x(2)
的线性约束不正确。正如您给定的那样,作用于 x(1)
的两个约束将表示为:
x(1) <= 10
-x(1) <= -10
唯一满足这些的值是x(1)=10
。将两个 RHS 值都设置为 10,您将强制执行您试图达到的 x(1)
的界限。
此外,您为第一个非线性约束提供的梯度不正确,您缺少关于 x(3)
的梯度的 -1 值。
我已经进行了以下修改。当我 运行 时,我得到了 [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