Main Content

非线性不等式约束

此示例说明如何求解具有非线性不等式约束的标量最小化问题。问题是要找到求解下式的 x

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

需满足以下约束

x1x2-x1-x2-1.5x1x2-10.

由于两个约束都不是线性约束,请创建一个以向量 c 形式返回两个约束的值的函数 confun.m。由于 fmincon 求解器要求约束以 c(x) 0 形式编写,请编写约束函数以返回以下值:

c(x)=[x1x2-x1-x2+1.5-10-x1x2].

创建目标函数

辅助函数 objfun 是目标函数;它出现在此示例末尾。将 fun 参量设置为 objfun 函数的函数句柄。

fun = @objfun;

创建非线性约束函数

非线性约束函数必须返回两个参量:不等式约束 c 和等式约束 ceq。由于此问题没有等式约束,此示例末尾的辅助函数 confun 返回 [] 作为等式约束。

求解问题

将初始点设置为 [-1,1]

x0 = [-1,1];

此问题没有边界或线性约束。将这些参量设置为 []

A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];

使用 fmincon 求解问题。

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@confun)
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 = 1×2

   -9.5473    1.0474

fval = 0.0236

检查解

退出消息表明该解在约束下可行。要再次检查,请计算在解处的非线性约束函数。负值表示满足约束。

[c,ceq] = confun(x)
c = 2×1
10-4 ×

   -0.3179
   -0.3063

ceq =

     []

两个非线性约束均为负并且接近于零,这表明解是可行的,并且两个约束在解处均为活动约束。

辅助函数

以下代码会创建 objfun 辅助函数。

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

以下代码会创建 confun 辅助函数。

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

相关主题