min z = c X s . t . A X b A e q X = b e q

命令: x = linprog ( c , A , b , A e q , b e q )

注意:若没有不等式: A X b 存在,则令 A = [ ] b = [ ]

min z = c X s . t . A X b A e q X = b e q V L B X V U B

命令:[1] x = linprog ( c , A , b , A e q , b e q , V L B , V U B ) ,[2] x = linprog ( c , A , b , A e q , b e q , V L B , V U B , x 0 )

注意:[1] 若没有等式约束: A e q X = b e q ,则令 A e q = [ ] b e q = [ ] ;[2] 其中 x 0 表示初始点

命令: [ x , f v a l ] = linprog ( )

返回最优解 x x 出的目标函数的值 fval

求解优化问题的主要函数

1. MATLAB求解优化问题的主要函数

达到目标问题
m i n r s . t . F ( x ) w r g o a l
X = fgoalattain ( F , x , g o a l , w ) 极小极大问题
m i n m a x x { F i ( x ) } s . t . G ( x ) 0
X = fminimax ( F G , x 0 ) 非线性优化的目标函数。fun必须为行命令对象或M文件、嵌入函数或MEX文件的名称 fminbnd, fminsearch,fminunc, fmincon, lsqcurvefit, lsqnonlin, fgoalattain, fminimax 二次规划的目标函数 X H X + f X 中二次项的系数矩阵 quadprog A矩阵和b向量分别为线性不等式约束: A X b 中的系数矩阵和右端向量 linprog, quadprog, fgoalattain, fmincon, fminimax Aeq, beq Aeq矩阵和beq向量分别为线性等式约束: A e q X = b e q 中的系数矩阵和右端向量 linprog, quadprog, fgoalattain, fmincon, fminimax vlb, vub X的下限和上限向量: v l b X v u b linprog, quadprog, fgoalattain, fmincon, fminimax, lsqcurvefit, lsqnonlin 迭代初始点坐标 除fminbnd外所有优化函数 X 1 , X 2 函数最小化的区间 fminbnd options 优化选项参数结构,定义用于优化函数的参数 所有优化函数 解x处的目标函数值 linprog, quadprog, fgoalattain, fmincon, fminimax, lsqcurvefit, lsqnonlin, fminbnd exitflag 描述退出条件: e x i t f l a g > 0 ,表明目标函数收敛于解x处; e x i t f l a g 0 = ,表明目标函数评价或迭代的最大次数; e x i t f l a g < 0 ,表明目标函数不收敛 output 包含优化结果信息的输出结构:Iterations:迭代次数;Algorithm:所采用的算法;FuncCount:函数评价次数 所有优化函数 [x,fval] =fminbnd(...); [x,fval,exitflag] =fminbnd(...); [x,fval,exitflag,output] =fminbnd(...); %%其中3、4、5的等式右边可用1或2的等式右边

函数 fminbnd 的算法基于黄金分割法和二次插值法,它要求目标函数必须是连续函数,并可能只给出局部最优解。

2. 多元函数无约束优化问题

标准型为: m i n F ( X )

命令格式为:

x=fminunc(fun,X0);  %或x=fminsearch(fun,X0)
x=fminunc(fun,X0,options);  %或x=fminsearch(fun,X0,options)
[x,fval]=fminunc(...);  %或[x,fval]=fminsearch(...)
[x,fval,exitflag]=fminunc(...); %或[x,fval,exitflag]=fminsearch(...)
[x,fval,exitflag,output]=fminunc(...);  %或[x,fval,exitflag,output]=fminsearch(...)

fminsearch 是用单纯性法寻优

fminunc 的算法:

  • fminunc 为无约束优化提供了大型优化和中型优化算法。
    1. options 中的参数 LargeScale 控制: LargeScale='on' 使用大型算法, LargeScale='off' 使用小型算法
  • fminunc 为中型优化算法的搜素方向提供了4种算法,由 options 中的参数 HessUpdate 控制
    1. HessUpdate='bfgs' (默认值),拟牛顿法的 BFGS 公式
    2. HessUpdate='dfp' ,拟牛顿法的 DFP 公式
    3. HessUpdate='steepdesc' ,最速下降法
  • fminunc 为中型优化算法的步长一维搜索提供了两种算法,由 options 中参数 LineSearchType 控制:
    1. LineSearchType='quadcubic' (缺省值),混合的二次和三次多项式插值
    2. LineSearchType='cubicpoly' ,三次多项式插值
  • 使用 fminunc fminsearch 可能会得到局部最优解

    用MATLAB解非线性规划

    标准型为:

    min F ( X ) s . t . A X b A e q X = b e q G ( X ) 0 C e q ( X ) = 0 V L B X V U B

    其中 X n 维变元向量, G(X) Ceq(X) 均为非线性函数组成的向量,其他变量的含义和线性规划、二次规划相同。MATLAB求解:

  • 首先建立M文件 fun.m ,定义目标函数 F(X)

    function f=fun(X);
    f=F(X);
  • 若约束条件中有非线性约束: G ( X ) 0 C e q ( X ) = 0 ,则建立M文件 nonlcon.m 定义函数 G(X) Ceq(X)

    function [G,Ceq]=nonlcon(X);
    G=...
    Ceq=...
  • 建立主程序,非线性规划求解的函数是 fmincon ,命令的基本格式如下:

    x=fmincom('fun',X0,A,b);
    x=fmincon('fun',X0,A,b,Aeq,beq);
    x=fmincon('fun',X0,A,b,Aeq,beq,VLB,VUB);
    x=fmincon('fun',X0,A,b,Aeq,beq,VLB,VUB,'nonlcon');
    x=fmincon('fun',X0,A,b,Aeq,beq,VLB,VUB,'nonlcon',options);
    [x,fval]=fmincon(...);
    [x,fval,exitflag]=fmincon(...);
    [x,fval,exitflag,output]=fmincon(...);
  • fmincon 函数提供了大型优化算法和中型优化算法。默认时,若在 fun 函数中提供了梯度( options 参数的 GradObj 设置为 on ),并且只有上下界存在或只有等式约束, fmincon 函数将选择大型算法。当既有等式约束又有梯度约束时,使用中型算法。

    fmincon 函数的中型算法使用的是序列二次规划法。在每一步迭代中求解二次规划子问题,并用 BFGS 法更新拉格朗日 Hessian 矩阵。

    fmincon 函数可能会给出局部最优解,这与初值 X0 的选取有关。