Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

非线性约束

一些优化求解器接受非线性约束,包括 fminconfseminffgoalattainfminimax,以及 Global Optimization Toolbox 求解器 ga (Global Optimization Toolbox)gamultiobj (Global Optimization Toolbox)patternsearch (Global Optimization Toolbox)paretosearch (Global Optimization Toolbox)GlobalSearch (Global Optimization Toolbox)MultiStart (Global Optimization Toolbox)。非线性约束允许您将解约束在可以用平滑函数描述的任何区域内。

非线性不等式约束的形式为 c(x) ≤ 0,其中 c 是约束组成的向量,每个约束对应一个分量。同样,非线性等式约束的形式为 ceq(x) = 0

注意

非线性约束函数必须同时返回 cceq,即不等式和等式约束函数,即使它们并不都存在也会返回。对于不存在的约束,返回空条目 []

例如,假设您有以下不等式作为约束:

x129+x2241,x2x121.

请按如下所示在函数文件中编写这些约束:

function [c,ceq] = ellipseparabola(x)
c(1) = (x(1)^2)/9 + (x(2)^2)/4 - 1;
c(2) = x(1)^2 - x(2) - 1;
ceq = [];
end
ellipseparabola 为非线性等式约束函数 ceq 返回空条目 []。同样,需要将第二个不等式重写为 ≤ 0 形式。

ellipseparabola 约束条件下最小化 exp(x(1) + 2*x(2)) 函数。

fun = @(x)exp(x(1) + 2*x(2));
nonlcon = @ellipseparabola;
x0 = [0 0];
A = []; % No other constraints
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
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 =

   -0.2500   -0.9375

在约束函数中包含梯度

如果您为 c 和 ceq 提供梯度,求解器的运行速度可以更快,提供的结果更可靠。

提供梯度还有另一项优势。求解器可以到达点 x,这说明 x 是可行点,但 x 附近的有限差分总是导致不可行点。在这种情况下,求解器可能会失败或过早停止。提供梯度可允许求解器继续。

要包含梯度信息,请编写一个条件化函数,如下所示:

function [c,ceq,gradc,gradceq] = ellipseparabola(x)
c(1) = x(1)^2/9 + x(2)^2/4 - 1;
c(2) = x(1)^2 - x(2) - 1;
ceq = [];

if nargout > 2
    gradc = [2*x(1)/9, 2*x(1); ...
             x(2)/2, -1];
    gradceq = [];
end

请参阅编写标量目标函数了解有关条件化函数的信息。梯度矩阵具有以下形式

gradci, j = [∂c(j)/∂xi]。

梯度矩阵的第一列与 c(1) 相关联,第二列与 c(2) 相关联。这种导数形式是 Jacobian 矩阵形式的转置。

要让求解器使用非线性约束的梯度,请使用 optimoptions 指示这些梯度的存在:

options = optimoptions(@fmincon,'SpecifyConstraintGradient',true);

确保将 options 结构体传递给求解器:

[x,fval] = fmincon(@myobj,x0,A,b,Aeq,beq,lb,ub, ...
           @ellipseparabola,options)

如果您有 Symbolic Math Toolbox™ 许可证,您可以自动计算梯度和 Hessian 矩阵,如Calculate Gradients and Hessians Using Symbolic Math Toolbox™中所述。

匿名非线性约束函数

非线性约束函数必须返回两个输出。第一个输出对应于非线性不等式,第二个输出对应于非线性等式。

匿名函数只返回一个输出。那么该如何将匿名函数写成非线性约束呢?

deal 函数分配多个输出。例如,假设您有非线性不等式

x129+x2241,x2x12-1.

假设您有非线性等式

x2=tanh(x1)

请编写一个如下所示的非线性约束函数。

c = @(x)[x(1)^2/9 + x(2)^2/4 - 1;
        x(1)^2 - x(2) - 1];
ceq = @(x)tanh(x(1)) - x(2);
nonlinfcn = @(x)deal(c(x),ceq(x));

要在满足 nonlinfcn 约束的条件下最小化 cosh(x1) + sinh(x2) 函数,请使用 fmincon

obj = @(x)cosh(x(1))+sinh(x(2));
opts = optimoptions(@fmincon,'Algorithm','sqp');
z = fmincon(obj,[0;0],[],[],[],[],[],[],nonlinfcn,opts)
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.
z = 2×1

   -0.6530
   -0.5737

要检查得到的点 z 满足约束的程度,请使用 nonlinfcn

[cout,ceqout] = nonlinfcn(z)
cout = 2×1

   -0.8704
         0

ceqout = 0

z 在约束容差 ConstraintTolerance 默认值 1e-6 范围内满足所有约束。

有关匿名目标函数的信息,请参阅匿名函数目标

另请参阅

| | (Global Optimization Toolbox) | (Global Optimization Toolbox) | (Global Optimization Toolbox) | (Global Optimization Toolbox)

相关主题