首页 > 编程笔记 > MATLAB笔记 阅读:59

MATLAB fmincon()函数求解约束优化问题(附带实例)

多元约束优化问题的标准形式为:


在 MATLAB 中,这种优化问题通过 fmincon() 函数求解。fmincon() 函数的调用格式如下:
1) x=fmincon(f,x0,A,b)。以 x0 为初始点,求解如下约束优化问题:
min f(x)
s.t. Ax≤b

2) x=fmincon(f,x0,A,b,Aeq,beq)。以 x0 为初始点,求解如下约束优化问题:


若没有不等式约束,则设Aeq=[ ],beq=[ ],此时等价于第一个调用格式。

3) x=fmincon(f,x0,A,b,Aeq,beq,lb,ub)。以 x0 为初始点,求解下面的约束优化问题:


若没有界约束,则令 lb、ub 为空向量;若 x 无下界,则令 lb=-Inf;若 x 无上界,则令 ub=Inf。

4) x=fmincon(f,x0,A,b,Aeq,beq,lb,ub,nonlcon)。以 x0 为初始点,求解约束优化问题:



其中,nonlcon() 函数的定义如下:
function [C1,C2,GC1,GC2]=nonlcon(x)
C1=…                %  x处的非线性不等式约束
C2=…                %  x处的非线性等式约束
if nargout>2
    GC1=…           % 非线性不等式约束在x处的梯度
    GC2=…           % 非线性等式约束在x处的梯度
end

5) x=fmincon(f,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)。options 为指定优化参数(见表 2),可以由 optimset 进行设置。

6) x=fmincon(problem)。返回结构体 problem 指定的问题的最小值。

7) [x,fval]=fmincon(…)。除了输出最优解 x 外,还输出相应目标函数最优值 fval。

8) [x,fval,exitflag,output]=fmincon(…)。在实现上述调用格式对应功能的基础上,输出终止迭代的条件信息 exitflag,以及关于算法的信息变量 output。exitflag 的值及含义说明如表 1 所示;output 的内容如表 2 所示。

表 1 exitflag的值及含义说明
exitflag 的值 说明
1 表示已满足一阶最优性条件
2 表示相邻两次迭代点的变化小于预先给定的容忍度(除 active-set 之外的所有算法)
3 表示目标函数值在相邻两次迭代点处的变化小于预先给定的容忍度(只适用于 trust-region-reflective 算法)
4 表示搜索方向的级小于给定的容忍度且约束的违背量小于 options.TolCon(只适用于 active-set 算法)
5 表示方向导数的级小于给定的容忍度且约束的违背量小于 options.TolCon(只适用于 active-set 算法)
0 表示迭代次数超过 options.MaxIter 或函数的赋值次数超过 options.FunEvals
-1 表示算法被输出函数终止
-2 表示该优化问题没有可行解
-3 表示目标函数在当前迭代低于 options.ObjectiveLimit,最大约束违背量小于 options.ConstraintTolerance(只适用于 interior-point,sqp-legacy 和 sqp 算法)

表 2 output的结构及说明
output 结构 说明
iterations 迭代次数
funcCount 函数赋值次数
lssteplength 相对于搜索方向的线性搜索步长(只适用于 active-set 和 sqp 算法)
stepsize 算法在最后一步所选取的步长
algorithm 函数所调用的算法
cgiterations 共轭梯度迭代次数(只适用于大规模算法)
firstorderopt 一阶最优性条件(如果用的话)
message 算法终止的信息

9) [x,fval,exitflag,output,lambda,g,H]=fmincon(…)。在实现上述调用格式对应功能的基础上,输出各个约束所对应的拉格朗日乘子、目标函数在最优解 x 处的梯度 g、目标函数在最优解 x 处的黑塞(Hessian)矩阵 H。拉格朗日乘子 lambda 是一个结构体变量,其内容如下表所示。

表 3 lambda的结构及说明
lambda 结构 说明
lower 表示下界约束 x≥lb 对应的拉格朗日乘子向量
upper 表示上界约束 x≤ub 对应的拉格朗日乘子向量
ineqlin 表示不等式约束对应的拉格朗日乘子向量
eqlin 表示等式约束对应的拉格朗日乘子向量
ineqnonlin 表示非线性不等式约束对应的拉格朗日乘子向量
eqnonlin 表示非线性等式约束对应的拉格朗日乘子向量

【实例】求下面优化问题的最优解,并求出的相应梯度、黑塞(Hessian)矩阵以及拉格朗日乘子。


先将该优化问题转化为标准形式,即:


编写目标函数的 M 文件,代码如下:
function y=yhzyj(x)
y=(x(1)-2)^2+(x(2)-1)^2;

编写非线性约束函数的 M 文件,代码如下:
function [c1,c2]=nonlin(x)
c1=x(1)^2-x(2);
c2=[];                      % 没有非线性等式约束

然后在命令行窗口输入如下命令:
>> close all          % 关闭当前已打开的文件
>> clear             % 清除工作区的变量
>> A=[1 1];          % 输入约束条件系数矩阵
>> b=2;              % 输入约束条件右端项
>> Aeq=[];beq=[];lb=[];ub=[]; % 没有非线性等式约束及界约束
>> x0=[0 0]';        % 初始点
% 以 x0 为初始点,求解约束优化问题
>> [x,fval,exitflag,output,lambda,g,H]=fmincon(@hyz,x0,A,b,Aeq,beq,lb,ub,@nonlin)
Local minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
x =                  % 最优解
    1.0000
    1.0000
fval =               % 最优值
    1.0000
exitflag =           % 说明解已经满足一阶最优性条件
    1
output =            % 包含以下字段的 struct:
    iterations: 10   % 共迭代 10 次
    funcCount: 33    % 函数赋值 33 次
    constrviolation: 0 % 函数错误 0 次
    stepsize: 1.4912e-07 % 算法最后一步所选的步长
    algorithm: 'interior-point' % 所调用的算法
    firstorderopt: 2.0000e-06 % 一阶最优性条件
    cgiterations: 0 % 没有共轭梯度迭代
    message: 'Local minimum found that satisfies the constraints.' % 说明
    Optimization completed because the objective function is non-decreasing in
    .feasible directions, to within the default value of the optimality tolerance,
    .and constraints are satisfied to within the default value of the constraint tolerance.
    .Stopping criteria details:.Optimization completed.The relative first-order optimality measure,
    .9.999983e-07,.is less than options.OptimalityTolerance = 1.000000e-06, and the relative maximum constraint-violation,
    .0.000000e+00,.is less than options.ConstraintTolerance = 1.000000e-06.--Optimization Metric Options:.relative first-order
    .optimality = 1.0e-06 OptimalityTolerance = 1e-06 (default):.relative max(constraint violation) = 0.0e+00
    .ConstraintTolerance = 1e-06 (default)
lambda =             % 相应的拉格朗日乘子
    包含以下字段的 struct:
        eqlin: [0x1 double] % 等式约束对应的拉格朗日乘子
        ineqlin: 0.6667 % 线性不等式所对应的拉格朗日乘子
        lower: [2x1 double] % 下界约束对应的拉格朗日乘子
        upper: [2x1 double] % 上界约束对应的拉格朗日乘子
        ineqnonlin: 0.6667 % 非线性不等式约束对应的拉格朗日乘子
        eqnonlin: [] % 非线性等式约束对应的拉格朗日乘子
g =                  % 目标函数在最优解处的梯度
   -2.0000
   0.0000
H =                  % 目标函数在最优解处的海色矩阵
    3.1120   0.1296
    0.1296   1.9335

相关文章