非线性不等式约束
此示例说明如何求解具有非线性不等式约束的标量最小化问题。问题是要找到求解下式的
需满足以下约束
由于两个约束都不是线性约束,请创建一个以向量 c
形式返回两个约束的值的函数 confun.m
。由于 fmincon
求解器要求约束以 形式编写,请编写约束函数以返回以下值:
.
创建目标函数
辅助函数 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