• MATLAB优化问题(1)


    5章  优化问题

    5.1  线性规划问题

    线性规划问题是目标函数和约束条件均为线性函数的问题,MATLAB6.0解决的线性规划问题的标准形式为:

    min  

    sub.to:

                 

                            

    其中f、x、b、beq、lb、ub为向量,AAeq为矩阵。

    其它形式的线性规划问题都可经过适当变换化为此标准形式。

    MATLAB6.0版中,线性规划问题(Linear Programming)已用函数linprog取代了MATLAB5.x版中的lp函数。当然,由于版本的向下兼容性,一般说来,低版本中的函数在6.0版中仍可使用。

    函数  linprog

    格式  x = linprog(f,A,b)   %min  f ' *x   sub.to  线性规划的最优解。

    x = linprog(f,A,b,Aeq,beq)   %等式约束,若没有不等式约束,则A=[ ]b=[ ]

    x = linprog(f,A,b,Aeq,beq,lb,ub)   %指定x的范围,若没有等式约束 ,则Aeq=[ ]beq=[ ]

    x = linprog(f,A,b,Aeq,beq,lb,ub,x0)   %设置初值x0

    x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)    % options为指定的优化参数

    [x,fval] = linprog()   % 返回目标函数最优值,即fval= f ' *x

    [x,lambda,exitflag] = linprog()   % lambda为解x的Lagrange乘子。

    [x, lambda,fval,exitflag] = linprog()   % exitflag为终止迭代的错误条件。

    [x,fval, lambda,exitflag,output] = linprog()   % output为关于优化的一些信息

    说明  若exitflag>0表示函数收敛于解x,exitflag=0表示超过函数估值或迭代的最大数字,exitflag<0表示函数不收敛于解x;若lambda=lower 表示下界lb,lambda=upper表示上界ublambda=ineqlin表示不等式约束,lambda=eqlin表示等式约束,lambda中的非0元素表示对应的约束是有效约束;output=iterations表示迭代次数,output=algorithm表示使用的运算规则,output=cgiterations表示PCG迭代次数。

    5-1  求下面的优化问题

    min  

    sub.to    

                

                         

                          

    解:

    >>f = [-5; -4; -6];

    >>A =  [1 -1  1;3  2  4;3  2  0];

    >>b = [20; 42; 30];

    >>lb = zeros(3,1);

    >>[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)

    结果为:

    x =      %最优解

        0.0000

       15.0000

        3.0000

    fval =     %最优值

      -78.0000

    exitflag =     %收敛

         1

    output = 

          iterations: 6   %迭代次数

        cgiterations: 0

           algorithm: 'lipsol'   %所使用规则

    lambda = 

        ineqlin: [3x1 double]

          eqlin: [0x1 double]

          upper: [3x1 double]

          lower: [3x1 double]

    >> lambda.ineqlin

    ans =

        0.0000

        1.5000

        0.5000

    >> lambda.lower

    ans =

        1.0000

        0.0000

        0.0000

    表明:不等约束条件23以及第1个下界是有效的

    5.2  foptions函数

    对于优化控制,MATLAB提供了18个参数,这些参数的具体意义为:

    options(1)-参数显示控制(默认值为0)。等于1时显示一些结果。

        options(2)-优化点x的精度控制(默认值为1e-4)

        options(3)-优化函数F的精度控制(默认值为1e-4)

        options(4)-违反约束的结束标准(默认值为1e-6)

        options(5)-算法选择,不常用。

        options(6)-优化程序方法选择,为0则为BFCG算法,为1则采用DFP算法。 

        options(7)-线性插值算法选择,为0则为混合插值算法,为1则采用立方插算法。

        options(8)-函数值显示 (目标—达到问题中的Lambda )

        options(9)-若需要检测用户提供的梯度,则设为1

        options(10)-函数和约束估值的数目。

        options(11)-函数梯度估值的个数。

        options(12)-约束估值的数目。

        options(13)-等约束条件的个数。

        options(14)-函数估值的最大次数(默认值是100×变量个数) 

        options(15)-用于目标 — 达到问题中的特殊目标。 

        options(16)-优化过程中变量的最小有限差分梯度值。

        options(17)- 优化过程中变量的最大有限差分梯度值。

        options(18)-步长设置 (默认为1或更小)

    Foptions已经被optimset和optimget代替,详情请查函数optimset和optimget。

    5.3  非线性规划问题

    5.3.1  有约束的一元函数的最小值

    单变量函数求最小值的标准形式为     sub.to  

    MATLAB5.x中使用fmin函数求其最小值。

    函数  fminbnd

    格式  x = fminbnd(fun,x1,x2)   %返回自变量x在区间上函数fun取最小值时x值,fun为目标函数的表达式字符串或MATLAB自定义函数的函数柄。

    x = fminbnd(fun,x1,x2,options)   % options为指定优化参数选项

    [x,fval] = fminbnd()   % fval为目标函数的最小值

    [x,fval,exitflag] = fminbnd()   %xitflag为终止迭代的条件

    [x,fval,exitflag,output] = fminbnd()   % output为优化信息

    说明  若参数exitflag>0,表示函数收敛于x,若exitflag=0,表示超过函数估计值或迭代的最大数字,exitflag<0表示函数不收敛于x;若参数output=iterations表示迭代次数,output=funccount表示函数赋值次数,output=algorithm表示所使用的算法。

    5-2  计算下面函数在区间(0,1)内的最小值。

     

    解:>> [x,fval,exitflag,output]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1)

    x =

        0.5223

    fval =

        0.3974

    exitflag =

         1

    output = 

        iterations: 9

         funcCount: 9

         algorithm: 'golden section search, parabolic interpolation'

    5-3  在[05]上求下面函数的最小值

    解:先自定义函数:在MATLAB编辑器中建立M文件为:

    function f = myfun(x)

    f = (x-3).^2 - 1;

    保存为myfun.m,然后在命令窗口键入命令:

    >> x=fminbnd(@myfun,0,5)

    则结果显示为:

    x =

         3

    5.3.2  无约束多元函数最小值

    多元函数最小值的标准形式为

    其中:x为向量,如

    MATLAB5.x中使用fmins求其最小值。

    命令  利用函数fminsearch求无约束多元函数最小值

    函数  fminsearch

    格式  x = fminsearch(fun,x0)   %x0为初始点,fun为目标函数的表达式字符串或MATLAB自定义函数的函数柄。

    x = fminsearch(fun,x0,options)   % optionsoptimset

    [x,fval] = fminsearch()   %最优点的函数值

    [x,fval,exitflag] = fminsearch()   % exitflag与单变量情形一致

    [x,fval,exitflag,output] = fminsearch()  %output与单变量情形一致

    注意:fminsearch采用了Nelder-Mead型简单搜寻法。

    5-4  求的最小值点

    解:>>X=fminsearch('2*x(1)^3+4*x(1)*x(2)^3-10*x(1)*x(2)+x(2)^2',  [0,0])

    结果为

    X =

        1.0016    0.8335

    或在MATLAB编辑器中建立函数文件

    function  f=myfun(x)

    f=2*x(1)^3+4*x(1)*x(2)^3-10*x(1)*x(2)+x(2)^2;

    保存为myfun.m,在命令窗口键入

    >> X=fminsearch ('myfun',  [0,0]) 或 >> X=fminsearch(@myfun,  [0,0])

    结果为:

    X =

        1.0016    0.8335

    命令  利用函数fminunc求多变量无约束函数最小值

    函数  fminunc

    格式  x = fminunc(fun,x0)   %返回给定初始点x0的最小函数值点

    x = fminunc(fun,x0,options)   % options为指定优化参数

    [x,fval] = fminunc()   %fval最优点x处的函数值

    [x,fval,exitflag] = fminunc()   % exitflag为终止迭代的条件,与上同。

    [x,fval,exitflag,output] = fminunc()   %output为输出优化信息

    [x,fval,exitflag,output,grad] = fminunc()   % grad为函数在解x处的梯度值

    [x,fval,exitflag,output,grad,hessian] = fminunc()   %目标函数在解x处的海赛(Hessian)值

    注意:当函数的阶数大于2时,使用fminunc比fminsearch更有效,但当所选函数高度不连续时,使用fminsearch效果较好。

    5-5  求的最小值。

    >> fun='3*x(1)^2+2*x(1)*x(2)+x(2)^2';

    >> x0=[1 1];

    >> [x,fval,exitflag,output,grad,hessian]=fminunc(fun,x0)

    结果为:

    x =

      1.0e-008 *

       -0.7591    0.2665

    fval =

      1.3953e-016

    exitflag =

         1

    output = 

           iterations: 3

            funcCount: 16

             stepsize: 1.2353

        firstorderopt: 1.6772e-007

            algorithm: 'medium-scale: Quasi-Newton line search'

    grad =

      1.0e-006 *

       -0.1677

        0.0114

    hessian =

        6.0000    2.0000

        2.0000    2.0000

    或用下面方法:

    >> fun=inline('3*x(1)^2+2*x(1)*x(2)+x(2)^2')

    fun =

         Inline function:

         fun(x) = 3*x(1)^2+2*x(1)*x(2)+x(2)^2

    >> x0=[1 1]

    >> x=fminunc(fun,x0)

    x =

      1.0e-008 *

       -0.7591    0.2665

    5.3.3  有约束的多元函数最小值

    非线性有约束的多元函数的标准形式为:

     

    sub.to    

     

     

     

     

    其中:x、b、beq、lb、ub是向量,A、Aeq为矩阵,C(x)、Ceq(x)是返回向量的函数,f(x)为目标函数,f(x)、C(x)、Ceq(x)可以是非线性函数。

    MATLAB5.x中,它的求解由函数constr实现。

    函数  fmincon

    格式  x = fmincon(fun,x0,A,b)

    x = fmincon(fun,x0,A,b,Aeq,beq)

    x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)

    x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

    x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

    [x,fval] = fmincon()

    [x,fval,exitflag] = fmincon()

    [x,fval,exitflag,output] = fmincon()

    [x,fval,exitflag,output,lambda] = fmincon()

    [x,fval,exitflag,output,lambda,grad] = fmincon()

    [x,fval,exitflag,output,lambda,grad,hessian] = fmincon()

    参数说明:fun为目标函数,它可用前面的方法定义;

    x0为初始值;

    Ab满足线性不等式约束,若没有不等式约束,则取A=[ ]b=[ ]

    Aeq、beq满足等式约束,若没有,则取Aeq=[ ]beq=[ ]

    lb、ub满足,若没有界,可设lb=[ ]ub=[ ]

    nonlcon的作用是通过接受的向量x来计算非线性不等约束和等式约束分别在x处的估计CCeq,通过指定函数柄来使用,如:>>x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon),先建立非线性约束函数,并保存为mycon.m:function [C,Ceq] = mycon(x)

    C = …    计算x处的非线性不等约束的函数值。

    Ceq = …   计算x处的非线性等式约束的函数值。

    lambdaLagrange乘子,它体现哪一个约束有效。

    output输出优化信息;

    grad表示目标函数在x处的梯度;

    hessian表示目标函数在x处的Hessiab值。

    5-6  求下面问题在初始点(01)处的最优解

    min  

    sub.to    

     

    解:约束条件的标准形式为

    sub.to  

     

    先在MATLAB编辑器中建立非线性约束函数文件:

    function  [c, ceq]=mycon (x)

    c=(x(1)-1)^2-x(2);

    ceq=[ ];      %无等式约束

    然后,在命令窗口键入如下命令或建立M文件:

    >>fun='x(1)^2+x(2)^2-x(1)*x(2)-2*x(1)-5*x(2)';     %目标函数

    >>x0=[0 1];

    >>A=[-2 3];   %线性不等式约束

    >>b=6;

    >>Aeq=[ ];    %无线性等式约束

    >>beq=[ ];

    >>lb=[ ];       %x没有下、上界

    >>ub=[ ];

    >>[x,fval,exitflag,output,lambda,grad,hessian]

    =fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@mycon)

    则结果为

    x =

         3     4

    fval =

       -13

    exitflag =      %解收敛

         1

    output = 

           iterations: 2

            funcCount: 9

             stepsize: 1

            algorithm: 'medium-scale: SQP, Quasi-Newton, line-search'

        firstorderopt: [ ]

         cgiterations: [ ]

    lambda = 

             lower: [2x1 double]   %x下界有效情况,通过lambda.lower可查看。

             upper: [2x1 double]   %x上界有效情况,为0表示约束无效。

             eqlin: [0x1 double]    %线性等式约束有效情况,不为0表示约束有效。

          eqnonlin: [0x1 double]    %非线性等式约束有效情况。

           ineqlin: 2.5081e-008    %线性不等式约束有效情况。

        ineqnonlin: 6.1938e-008    %非线性不等式约束有效情况。

    grad =      %目标函数在最小值点的梯度

      1.0e-006 *

       -0.1776

             0

    hessian =    %目标函数在最小值点的Hessian值

        1.0000   -0.0000

       -0.0000    1.0000

    5-7  求下面问题在初始点x=(10, 10, 10)处的最优解。

    Min  

    Sub.to  

    解:约束条件的标准形式为

    sub.to     

     

    >> fun= '-x(1)*x(2)*x(3)';

    >> x0=[10,10,10];

    >> A=[-1 -2 -2;1 2 2];

    >> b=[0;72];

    >> [x,fval]=fmincon(fun,x0,A,b)

    结果为:

    x =

       24.0000   12.0000   12.0000

    fval =

           -3456

    5.3.4  二次规划问题

    二次规划问题(quadratic programming)的标准形式为:

     

    sub.to  

        

        

    其中,HAAeq为矩阵,f、b、beq、lb、ub、x为向量

    其它形式的二次规划问题都可转化为标准形式。

    MATLAB5.x版中的qp函数已被6.0版中的函数quadprog取代。

    函数  quadprog

    格式  x = quadprog(H,f,A,b)   %其中H,f,A,b为标准形中的参数,x为目标函数的最小值。

    x = quadprog(H,f,A,b,Aeq,beq)   %Aeq,beq满足等约束条件

    x = quadprog(H,f,A,b,Aeq,beq,lb,ub)   % lb,ub分别为解x的下界与上界。

    x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)   %x0为设置的初值

    x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)   % options为指定的优化参数

    [x,fval] = quadprog()   %fval为目标函数最优值

    [x,fval,exitflag] = quadprog()   % exitflag与线性规划中参数意义相同

    [x,fval,exitflag,output] = quadprog()   % output与线性规划中参数意义相同

    [x,fval,exitflag,output,lambda] = quadprog()   % lambda与线性规划中参数意义相同

    5-8  求解下面二次规划问题

     

    sub.to 

     

     

     

     

    解:

    则,,

    MATLAB中实现如下:

    >>H = [1 -1; -1 2] ;

    >>f = [-2; -6];

    >>A = [1 1; -1 2; 2 1];

    >>b = [2; 2; 3];

    >>lb = zeros(2,1);

    >>[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[ ],[ ],lb)

    结果为:

    x =     %最优解

        0.6667

        1.3333

    fval =     %最优值

       -8.2222

    exitflag =    %收敛

         1

    output = 

           iterations: 3

            algorithm: 'medium-scale: active-set'

        firstorderopt: [ ]

         cgiterations: [ ]

    lambda = 

          lower: [2x1 double]

          upper: [2x1 double]

          eqlin: [0x1 double]

        ineqlin: [3x1 double]

    >> lambda.ineqlin

    ans =

        3.1111

        0.4444

             0

    >> lambda.lower

    ans =

         0

         0

    说明  第12个约束条件有效,其余无效。

    例5-9  求二次规划的最优解

    max   f (x1, x2)=x1x2+3

    sub.to    x1+x2-2=0

    解:化成标准形式: 

     

    sub.to    x1+x2=2

    在Matlab中实现如下:

    >>H=[0,-1;-1,0];

    >>f=[0;0];

    >>Aeq=[1 1];

    >>b=2;

    >>[x,fval,exitflag,output,lambda] = quadprog(H,f,[ ],[ ],Aeq,b)

    结果为:

    x =

        1.0000

        1.0000

    fval =

       -1.0000

    exitflag =

         1

    output = 

        firstorderopt: 0

           iterations: 1

         cgiterations: 1

            algorithm: [1x58 char]

    lambda = 

          eqlin: 1.0000

        ineqlin: [ ]

          lower: [ ]

          upper: [ ]

  • 相关阅读:
    docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面
    maven构建的项目相关的命令
    gradle build文件中文乱码解决
    adobe acrobat看PDF文档显示字体发虚,有毛刺的解决办法
    Jenkins 用Tomcat部署War出现 反向代理设置有误
    变量 $cfg['TempDir'] (./tmp/)无法访问。phpMyAdmin无法缓存模板文件,所以会运行缓慢。
    phpMyAdmin配置文件中的密文(blowfish_secret)太短
    phpmyadmin报错:mysqli_real_connect(): (HY000/2002): No such file or directory 错误正确解决方法
    Gradle编译设置编码格式
    redis中的hash
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2339220.html
Copyright © 2020-2023  润新知