MATLAB 求解最优化问题

MATLAB 求解最优化问题

MATLAB 优化工具箱解线性规划

模型1

\[\text{min} \quad z=cX \\ s.t.\quad AX\leq b \]

命令:\(x=\text{linprog}(c,A,b)\)

模型2

\[\text{min} \quad z=cX \\ s.t.\quad AX\leq b\\ \qquad \qquad \quad Aeq\cdot X=beq \]

命令:\(x = \text{linprog}(c, A, b, Aeq, beq)\)

注意:若没有不等式:\(AX\leq b\)存在,则令\(A = \left [ \ \right ]\)\(b=\left [ \ \right ]\)

模型3

\[\text{min} \quad z=cX \\ s.t.\quad AX\leq b\\ \qquad \qquad \quad Aeq\cdot X=beq \\ VLB\leq X\leq VUB \]

命令:[1] \(x= \text{linprog}(c, A, b, Aeq, beq, VLB, VUB)\),[2] \(x= \text{linprog}(c, A, b, Aeq, beq, VLB, VUB, x_0)\)

注意:[1] 若没有等式约束:\(Aeq\cdot X = beq\),则令\(Aeq = \left [ \ \right ]\)\(beq = \left [ \ \right ]\);[2] 其中\(x_0\)表示初始点

命令:\([x, fval]=\text{linprog}(\dots)\)

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

求解优化问题的主要函数

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

类型 模型 基本函数名
一元函数极小 $$min \ F(x) \ s.t. \ x_1<x<x_2$$ \(x=\text{fminbnd}('F',x_1,x_2)\)
无约束极小 $$ min\ F(X) $$ $$X=\text{fminunc}('F', x_0)\ X=\text{fminsearch}('F', x_0)$$
线性规划 $$min \ c^TX\ s.t. \ AX\leq b$$ \(X=\text{linprog}(c,A,b)\)
二次规划 $$min \ \frac{1}{2}XTHX+cTX\ s.t. \ AX\leq b$$ \(X = \text{quadprog}(H,c,A,b)\)
约束极小(非线性规划) $$min \ F(X)\ s.t.\ G(X)\leq b$$ \(X=\text{fmincon}('FG', x_0)\)
达到目标问题 $$min \ r \ s.t.\ F(x)-wr\leq goal$$ \(X = \text{fgoalattain}('F', x,goal,w)\)
极小极大问题 $$min\ \underset{x}{max} \ {F_i(x)} \ s.t. \ G(x)\leq 0$$ \(X=\text{fminimax}('FG',x_0)\)

2. 优化函数的输入变量

变量 描述 调用函数
f 线性规划的目标函数\(\text{f}*X\)或二次规划的目标函数\(X'*H*X+\text{f}*X\)中线性项的系数向量 linprog, quadprog
fun 非线性优化的目标函数。fun必须为行命令对象或M文件、嵌入函数或MEX文件的名称 fminbnd, fminsearch,fminunc, fmincon, lsqcurvefit, lsqnonlin, fgoalattain, fminimax
H 二次规划的目标函数\(X'*H*X+\text{f}*X\)中二次项的系数矩阵 quadprog
A, b A矩阵和b向量分别为线性不等式约束:\(AX\leq b\)中的系数矩阵和右端向量 linprog, quadprog, fgoalattain, fmincon, fminimax
Aeq, beq Aeq矩阵和beq向量分别为线性等式约束:\(Aeq\cdot X= beq\)中的系数矩阵和右端向量 linprog, quadprog, fgoalattain, fmincon, fminimax
vlb, vub X的下限和上限向量:$vlb\leq X\leq vub $ linprog, quadprog, fgoalattain, fmincon, fminimax, lsqcurvefit, lsqnonlin
X_0 迭代初始点坐标 除fminbnd外所有优化函数
\(X_1\), \(X_2\) 函数最小化的区间 fminbnd
options 优化选项参数结构,定义用于优化函数的参数 所有优化函数

3. 优化函数的输出变量表

变量 描述 调用函数
x 由优化函数求得的值。若\(exitflag>0\),则x为解;否则x不是最终解,它只是迭代终止时优化过程的值 所有优化函数
fval 解x处的目标函数值 linprog, quadprog, fgoalattain, fmincon, fminimax, lsqcurvefit, lsqnonlin, fminbnd
exitflag 描述退出条件:\(exitflag>0\),表明目标函数收敛于解x处;\(exitflag0=\),表明目标函数评价或迭代的最大次数;\(exitflag<0\),表明目标函数不收敛
output 包含优化结果信息的输出结构:Iterations:迭代次数;Algorithm:所采用的算法;FuncCount:函数评价次数 所有优化函数

4. 控制参数options的设置

用MATLAB解无约束问题

1. 一元函数无约束优化问题

\[\text{min}\ f(x) \\ s.t.\ x_1\leq x \leq x_2 \]

常用格式如下

x=fminbnd(fun,x1,x2);
x=fminbnd(fun,x1,x2,options);
[x,fval]=fminbnd(...);
[x,fval,exitflag]=fminbnd(...);
[x,fval,exitflag,output]=fminbnd(...);
%%其中3、4、5的等式右边可用1或2的等式右边

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

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

标准型为:\(min \ 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的算法:

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

使用fminuncfminsearch可能会得到局部最优解

用MATLAB解非线性规划

标准型为:

\[\text{min} \ F(X) \\ s.t. \ AX\leq b\\ Aeq\cdot X =beq\\ G(X)\leq 0\\ Ceq(X)=0\\ VLB\leq X\leq VUB \]

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

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

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

    function [G,Ceq]=nonlcon(X);
    G=...
    Ceq=...
    
  3. 建立主程序,非线性规划求解的函数是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的选取有关。

posted @ 2017-08-17 20:49  main_c  阅读(4048)  评论(0)    收藏  举报