精华内容
下载资源
问答
  • MATLAB 求解最优化问题

    万次阅读 多人点赞 2017-08-17 20:49:03
    MATLAB 求解最优化问题 MATLAB 优化工具箱解线性规划 模型1 minz=cXs.t.AX≤b \text{min} \quad z=cX \\ s.t.\quad AX\leq b 命令:x=linprog(c,A,b)x=\text{linprog}(c,A,b) 模型2 minz=cXs.t.AX≤...

    MATLAB 求解最优化问题

    MATLAB 优化工具箱解线性规划

    模型1

    minz=cXs.t.AXb

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

    模型2

    minz=cXs.t.AXbAeqX=beq

    命令:x=linprog(c,A,b,Aeq,beq)

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

    模型3

    minz=cXs.t.AXbAeqX=beqVLBXVUB

    命令:[1] x=linprog(c,A,b,Aeq,beq,VLB,VUB),[2] x=linprog(c,A,b,Aeq,beq,VLB,VUB,x0)

    注意:[1] 若没有等式约束:AeqX=beq,则令Aeq=[ ]beq=[ ];[2] 其中x0表示初始点

    命令:[x,fval]=linprog()

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

    求解优化问题的主要函数

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

    类型 模型 基本函数名
    一元函数极小
    min F(x)s.t. x1<x<x2
    x=fminbnd(F,x1,x2)
    无约束极小
    min F(X)
    X=fminunc(F,x0)X=fminsearch(F,x0)
    线性规划
    min cTXs.t. AXb
    X=linprog(c,A,b)
    二次规划
    min 12XTHX+cTXs.t. AXb
    X=quadprog(H,c,A,b)
    约束极小(非线性规划)
    min F(X)s.t. G(X)b
    X=fmincon(FG,x0)
    达到目标问题
    min rs.t. F(x)wrgoal
    X=fgoalattain(F,x,goal,w)
    极小极大问题
    min maxx {Fi(x)}s.t. G(x)0
    X=fminimax(FG,x0)

    2. 优化函数的输入变量

    变量 描述 调用函数
    f 线性规划的目标函数fX或二次规划的目标函数XHX+fX中线性项的系数向量 linprog, quadprog
    fun 非线性优化的目标函数。fun必须为行命令对象或M文件、嵌入函数或MEX文件的名称 fminbnd, fminsearch,fminunc, fmincon, lsqcurvefit, lsqnonlin, fgoalattain, fminimax
    H 二次规划的目标函数XHX+fX中二次项的系数矩阵 quadprog
    A, b A矩阵和b向量分别为线性不等式约束:AXb中的系数矩阵和右端向量 linprog, quadprog, fgoalattain, fmincon, fminimax
    Aeq, beq Aeq矩阵和beq向量分别为线性等式约束:AeqX=beq中的系数矩阵和右端向量 linprog, quadprog, fgoalattain, fmincon, fminimax
    vlb, vub X的下限和上限向量:vlbXvub linprog, quadprog, fgoalattain, fmincon, fminimax, lsqcurvefit, lsqnonlin
    X_0 迭代初始点坐标 除fminbnd外所有优化函数
    X1, X2 函数最小化的区间 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. 一元函数无约束优化问题

    min f(x)s.t. x1xx2

    常用格式如下

    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解非线性规划

    标准型为:

    min F(X)s.t. AXbAeqX=beqG(X)0Ceq(X)=0VLBXVUB

    其中Xn维变元向量,G(X)Ceq(X)均为非线性函数组成的向量,其他变量的含义和线性规划、二次规划相同。MATLAB求解:
    1. 首先建立M文件fun.m,定义目标函数F(X)

      function f=fun(X);
      f=F(X);
    2. 若约束条件中有非线性约束:G(X)0Ceq(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的选取有关。

    展开全文
  • matlab求解最优化问题(数学建模)

    千次阅读 2020-06-08 19:48:04
    matlab求解最优化问题(数学建模) 1.线性规划 matlab中线性规划优化计算方法和实例 在matlab中用于线性规划优化计算的是linprog()函数。 公式:[x,fval,exitflag,output,lambda]=linprog(c,A,b,Aeq,beq,lb,ub,x0); ...

    matlab求解最优化问题(数学建模)

    1.线性规划

    matlab中线性规划优化计算方法和实例

    在matlab中用于线性规划优化计算的是linprog()函数。
    公式:[x,fval,exitflag,output,lambda]=linprog(c,A,b,Aeq,beq,lb,ub,x0);
    %x:表示最优解,fval:表示目标函数最优值,exitflag:表示求解的结果是成功还是失败,1代表成功。
    %output优化过程中的各种输出信息,lambda:结构体,包含最优解处的拉格朗日乘子。
    %c:目标函数系数矩阵,如果求最小值,那么c就是各个变量的系数,如果求最大值,那么c就是各个变量的系数的相反数,A:不等式约束的系数矩阵,b:不等式约束的常向量。
    %Aeq:等式约束的系数矩阵,beq:等式约束的常向量,lb、ub表示自变量的上下范围。
    %x0:表示变量的初始值,可以缺省。

    线性规划优化计算求最优解的方法很多,有单纯形法,大M法,内点法等,linprog函数集中了这几种线性规划算法。
    在这里插入图片描述

    例1:
    在这里插入图片描述

    >> c=[-10;-15];
    >> A=[5,2;2,3;1,5];
    >> b=[200;100;150];
    >> lb=[0;0];
    >> ub=[];
    >> [x,fval]=linprog(c,A,b,[],[],lb,ub)
    
    Optimal solution found.
    
    
    x =
    
        7.1429
       28.5714
    
    
    fval =
    
     -500.0000
    

    例2:

    在这里插入图片描述

    >> c=[0;0.1;0.2;0.3;0.8];
    >> aeq=[1,2,0,1,0;0,0,2,2,1;3,1,2,0,3];
    >> beq=[100;100;100];
    >> lb=[0;0;0;0;0];
    >> [x,fval]=linprog(c,[],[],aeq,beq,lb)
    
    Optimal solution found.
    
    
    x =
    
       30.0000
       10.0000
             0
       50.0000
             0
    
    
    fval =
    
        16
    

    上面解决了简单的线性规划问题的求解,线性规划有两种比较特殊的情况,即整数规划和0-1整数规划。(在旧版本中的matlab是不能直接求解这两种特殊的的线性规划。bintprog函数可以用来求0-1整数规划,但求解过程比较麻烦,而且最新版的matlab已经遗弃了这个函数,同时提供了一个比较新的函数——intlinprog)

    公式:[x,fval,exitflag]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)
    %该函数的使用和linprog函数的使用十分相似,其仅仅在linprog函数的基础上多了一个参数——intcon。

    通过一个例子来了解一下该函数的用法:
    在这里插入图片描述

    在这个例子中,变量的取值范围不再是有理数集,而是整数集。

    >> c=[-1;-1];
    >> intcon=[1,2];%intcon为整数约束变量的位置。
    >> b=[-1;11;-1];
    >> c=[-1;-1];
    >> intcon=[1,2];
    >> a=[-4,2;4,2;0,-2];
    >> b=[-1;11;-1];
    >> lb=[0;0];
    >> [x,fval]=intlinprog(c,intcon,a,b,[],[],lb)
    
    x =
    
         2
         1
    
    
    fval =
    
        -3
    

    求解0-1整数规划时,只需要在求解整数规划的基础上加上一个对变量的最大值约束为1就行了。
    看一个例子

    在这里插入图片描述

    >> c=[7;5;9;6;3];
    >> intcon=[1,2,3,4,5];
    >> a=[56,20,54,42,15;1,4,1,0,0;-1,-2,0,-1,-2];
    >> b=[100;4;-2];
    >> lb=[0;0;0;0;0];
    >> ub=[1;1;1;1;1];
    >> [x,fval]=intlinprog(c,intcon,a,b,[],[],lb,ub)
    LP:                Optimal objective value is 3.000000.                                             
    
    
    
    
         0
         0
         0
         0
         1
    
    
    fval =
    
         3
    

    2.二次规划

    matlab中二次规划优化计算方法和实例
    什么是二次规划?
    · 非线性规划的目标函数自变量为x的二次函数;
    · 约束条件全是线性的;

    在matlab中用于二次规划优化计算的是quadprog()函数。
    公式:[x,fval,exitflag,output,lambda]=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
    %上述参数与线性规划中的参数含义相同,H为实对称矩阵,在求解前需要把二次规划化为标准形式。

    在这里插入图片描述
    下面通过两个例子来看一次如何通过matlab求解二次规划
    例1:
    在这里插入图片描述

    >> H=[4,-1;-1,2];
    >> f=[-3;-5];
    >> a=[1,1;-1,2];
    >> b=[5;4];
    >> lb=[0;0];
    >> [x,fval]=quadprog(H,f,a,b,[],[],lb)
    
    
    
    
    x =
    
        1.5714
        2.7857
    
    
    fval =
    
      -10.3214
    

    从而原问题的最优值为:-6.3214
    例2:
    在这里插入图片描述

    >> H=[2,1,1;1,2,0;1,0,2];
    >> f=[-5;-3;-6];
    >> a=[5,4,7];
    >> b=[22];
    >> lb=[0;0;0];
    >> [x,fval]=quadprog(H,f,a,b,[],[],lb)
    
    x =
    
        0.5725
        0.9237
        2.2061
    
    
    fval =
    
      -11.0305
    

    原问题的最优值为:11.0305

    3.非线性规划

    在matlab软件中,函数fmincon用于求解非线性规划问题。
    [x,fval,exitflag,output,lambda,grad,hessian]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
    %nonlcon表示非线性约束条件(需要写自定义函数),x0为初值。

    在这里插入图片描述
    例1:
    在这里插入图片描述

    %编写目标函数
    function f=fun1(x)
    f=exp(x(1))*(x(1)^2+2*x(2)^2+3*x(1)*x(2)+5*x(1)+4*x(2)+2);
    %编写非线性约束条件函数
    function[c,ceq]=fun2(x)
    c=[3+x(1)*x(2)-x(1)-x(2);x(1)*x(2)-12];
    ceq=[];
    %编写主程序
    >> Aeq=[1,2];
    >> beq=[0];
    >> x0=[-1;1];
    >> [x,fval]=fmincon(@fun1,x0,[],[],Aeq,beq,[],[],@fun2)
    %运行结果
    
    x =
    
       -3.0000
        1.5000
    
    
    fval =
    
       -0.3485
    
    

    fmincon函数是默认从给定的x0为中心开始搜索,直至找到函数的z最小值,并返回距离x0最近的函数最小值对应的值,在计算的时候就必须预先判定函数最小值的对应的x值的大概范围,确保定的初值x0在所求的x附近,以减少计算量。
    在利用调用f(x)就可以求得最小值了
    如果给的是周期函数
    那给不同的值一般应该会得到不同x值
    但应该f(x)值是一致的

    例2:
    在这里插入图片描述

    %编写目标函数
    function f=fun1(x)
    f=-0.201*x(1)^4*x(2)*x(3)^2/10^7;
    %编写非线性约束条件函数
    function[c,ceq]=fun2(x)
    c=[x(1)^2*x(2)-675;x(1)^2*x(3)^2/10^7-0.419];
    ceq=[];
    
    >> x0=[4;5;50];
    >> lb=[0;0;0];
    >> ub=[36;5;125];
    >> [x,fval]=fmincon(@fun1,x0,[],[],[],[],lb,ub,@fun2)
    %运行结果
    x =
    
       28.0299
        0.8591
       73.0273
    
    
    fval =
    
      -56.8478
    
    

    fmincon求解优化问题,最优解不一定唯一。选择不同的迭代初始值x0,可能得到不同的局部最优解(局部最优解不一定为全局最优解)
    例3
    在这里插入图片描述

    %编写目标函数
    function f=fun1(x)
    f=-(x(2)+x(1)*cos(x(3)))*x(1)*sin(x(3));
    %主程序
    >> Aeq=[2,1,0];
    >> beq=[100];
    >> lb=[0;0;0];
    >> ub=[100;100;pi/2];
    >> x0=[25;20;1];
    >> [x,fval]=fmincon(@fun1,x0,[],[],Aeq,beq,lb,ub)
    %运行结果
    x =
    
       33.3333
       33.3333
        1.0472
    
    
    fval =
    
      -1.4434e+03
    
    

    4.无约束优化

    一、无约束一元函数最优解

    在matlab中用于一元无约束优化计算的是fminbnd()函数。
    公式:[x,fval,exitflag,output]=fminbnd(fun,x1,x2,options)

    在这里插入图片描述

    例:
    在这里插入图片描述

    >> f=@(x)(x^3+cos(x)+x*log(x))/exp(x);
    >> [x,fval]=fminbnd(f,0,2)
    
    x =
    
        0.5223
    
    
    fval =
    
        0.3974
    

    二、无约束多元函数最优解

    在matlab中用于多元无约束优化计算的是fminunc()函数fminsearch函数。
    公式[x,fval,exitflag,output,grad,hessian] =fminunc(fun,x0,options)
    公式[x,fval,exitflag,output]=fminsearch(fun,x0,options)
    当目标函数阶数大于2时,fminunc()比fminsearch()更有效;当目标函数高度不连续时,fminsearch()更具稳健性。

    在这里插入图片描述

    在这里插入图片描述

    >> f=@(x)x(1)^3+x(2)^3-3*x(1)*x(2);
    >> [x,fval]=fminunc(f,[0.5,3])
    
    
    x =
    
        1.0000    1.0000
    
    
    fval =
    
       -1.0000
    

    在这里插入图片描述

    >> f=@(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2;
    >> [x,fval]=fminsearch(f,[-1,3])
    
    x =
    
        1.0000    1.0000
    
    
    fval =
    
       1.4253e-10
    
    展开全文
  • matlab求解非线性优化问题

    实验环境

    Matlab 2018b.

    非线性优化

    非线性优化算法主要有梯度类算法和牛顿法两大类,包括DFP方法BFGS方法,约束变尺度(SQP)算法(Han, Powell)和Lagrange乘子法(Powell,Hestenes),随着计算机技术的发展,80年代出现了信赖域算法,稀疏拟牛顿法,大规模问题求解算法和并行计算算法,90年代出现了内点法和有限存储算法,目前免费的非线性求解软件包括LANCELOTMINPACTENMINSNOPT等.

    无约束非线性优化

    无约束优化的一般形式为
    minf(x),xRn \min f(x), x\in\mathbb{R}^n
    其中ff为非线性函数.
    一个典型的非线性函数banana function
    f(x)=100×(x2x12)2(1x1)2 f(x)=100\times(x_2-x_1^2)^2-(1-x_1)^2
    函数图像绘制如下
    banana

    绘图代码

    %% Banana function
    axis off;
    x=-2:0.2:2;
    y=-1:0.2:3;
    [xx, yy]=meshgrid(x, y); % 网格化操作
    zz=100*(yy-xx.^2).^2+(1-xx).^2;
    % 绘制三维图
    surfc(xx, yy, zz);
    

    约束非线性优化

    约束非线性优化的一般形式为
    minf(x)s.t.{gi(x)0,i=1,2,,mhj(x)=0,j=1,2,,l \min f(x)\\ s.t.\begin{cases} g_i(x)\leq 0, i=1, 2, \dots, m\\ h_j(x)=0, j=1,2 ,\dots, l \end{cases}

    Matlab求解函数

    fminunc(无约束)

    优化计算中需要使用函数的导数,如果用户没有提供目标函数的导数,那么matlab会采用差分方法计算函数的导数值.
    函数语法:

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

    输出信息中
    grad表示最优点/迭代最终点的导数
    hessian表示最优点/迭代最终点的二阶导数
    求解代码

    clear all;
    clc;
    close all;
    Bana_Func=@(x)(100*(x(2)-x(1)^2)^2+(1-x(1))^2);
    
    options=optimset('display', 'iter');
    x=[-1.9, 2];
    [x, fval, exitflag, output]=fminunc(Bana_Func, x, options)
    

    提供导数信息计算
    目标函数及导函数

    function [f, g]=BanaFuncGrad(x)
    f=100*(x(2)-x(1)^2)^2+(1-x(2))^2;
    g=[100*(4*x(1)^3-4*x(1)*x(2))+2*x(1)-2; 100*(2*x(2)-2*x(1)^2)];
    

    求解函数

    options=optimset('HessUpdate', 'bfgs', 'gradobj', 'on', 'display', 'iter');
    x=[-1.9, 2];
    [x, fval, exitflag, output]=fminunc(@BanaFuncGrad, x, options)
    

    从求解信息中可以发现,提供目标函数的导函数信息会减少迭代次数.

    fminsearch

    fminsearch函数求解算法是可变多面体算法(Neldero-Mead Simplex)
    函数语法

    x=fminsearch(fun, x0)
    x=fminsearch(fun, x0, options)
    [x, fval, exitflag, output]=fminsearch(...)
    

    目标函数文件BanaFunc.m

    function f=BanaFunc(x)
    f=100*(x(2)-x(1)^2)^2+(1-x(1))^2
    

    求解函数

    options=optimset('display', 'iter');
    x=[-1.9, 2];
    [x, fval, exitflag, output]=fminsearch(@BanaFunc, x, options)
    

    fmincon

    fmincon是matlab主要的内置约束最优化求解函数,该函数的求解的优化问题的主要形式为
    minf(x)s.t.{c(x)0ceq(x)=0AxbAeqx=beqlbxub \min f(x)\\ s.t. \begin{cases} c(x)\leq 0\\ ceq(x)=0\\ A\cdot x\leq b\\ Aeq\cdot x=beq\\ lb\leq x\leq ub \end{cases}
    对于中等约束优化问题,使用序列二次优化(SQP)算法,对于大规模约束优化使用基于内点反射牛顿法的信赖域算法,对于大规模线性系统使用共轭梯度算法(PCG).
    例 1:求解优化问题
    minf(x)=x12+x22+x32s.t.{x1x2x3+720xi0 \min f(x)=x_1^2+x_2^2+x_3^2\\ s.t. \begin{cases} -x_1-x_2-x_3+72\leq 0\\ x_i\geq 0 \end{cases}
    函数文件func_1.m

    function f = func_1(x)
    f=x(1)^2+x(2)^2+x(3)^2;
    

    约束文件con_1.m

    function [c, ceq]=con_1(x)
    c=72-x(1)-x(2)-x(3); % 不等式约束
    ceq=[]; % 等式约束
    

    求解函数

    %% 非线性约束优化
    options=optimset('display', 'iter');
    x0=[10, 10, 10]; % 起始迭代点
    lb=[0, 0, 0];
    [x, fval, exitflag, output]=fmincon(@func_1, x0, [], [], [], [], lb, [], @con_1, options)
    

    求解结果
    ans

    大规模优化问题

    测试大规模优化问题
    minf=i=1100[x(i)1i]2 \min f=\sum_{i=1}^{100}[x(i)-\frac{1}{i}]^2
    目标函数文件func_2.m

    function f=func_2(x)
    v=x-1./(1:100);
    f=v*v';
    

    求解函数

    %% 大规模优化
    x0=1*ones(1,100);
    options=optimset('LargeScale', 'on', 'display', 'iter', 'TolFun', 1e-8);
    [x, fval, exitflag, output]=fminunc(@func_2, x0, options)
    

    含参数优化

    函数为
    minxf(x,a)=a1sin(x1)+a2x22 \min_x f(x, a)=a_1\sin(x_1)+a_2x_2^2
    参数函数文件为func_3.m

    function f=func_3(x, a)
    f=a(1)*sin(x(1))+a(2)*x(2)^2;
    

    求解函数

    %% 参数优化
    a=[1, 1];
    x0=[0, 0];
    [x, fval, exitflag, output]=fminsearch(@(x)func_3(x, a), x0)
    

    参考资料

    金融数量分析 北京航天航空大学出版社 郑志勇

    展开全文
  • matlab求解线性规划问题

    线性规划问题求解

    目前matlab求解线性规划算法主要内点法(interior-point methods)和单纯形法(simplex method)
    线性规划的标准数学模型为
    minf(x)s.t.{AxbAeqx=beqlbxub \min f(x)\\ s.t.\begin{cases} A\cdot x\leq b\\ Aeq \cdot x=beq\\ lb\leq x\leq ub \end{cases}

    linprog函数

    函数语法

    [x, fval, exitflag, output, lambda]=linprog(f, A, b, Aeq, beq, lb, ub, x0, options)
    

    输入参数中,x0表示起始迭代点,options为优化参数的设置
    输出参数中,fval为找到的最优解,exitflag为迭代停止标识,具体数值含义如下

    数值 含义
    1 算法收敛于解xx
    0 达到最大迭代次数算法停止,输出的xx未必为最优解
    2 算法没有找到可行解,问题的可行解集为空集
    3 原问题为无解,解为无穷
    4 算法出现异常,出现非数值情况
    5 线性规划的原问题和对偶问题均不可解
    7 可行搜索方向向量太小,无法再提高最优解的质量

    output为算法计算信息,含义表如下

    项目 含义
    Algorithm 计算时使用的优化算法
    Cgiterations 算法迭代次数
    iterations 算法迭代次数
    Exit message 返回结束信息

    lambda为返回点的拉格朗日乘子信息,含义表如下

    项目 含义
    Lower 求得解越下界
    Upper 求得解越上界
    Neqlin 求得解不满足不等式约束
    Eqlin 求得解不满足等式约束

    案例

    线性规划的目标函数为
    minf=x1x2x3s.t.{7x1+3x2+9x318x1+5x2+4x316x1+9x2+5x31x1,x2,x30 \min f=-x_1-x_2-x_3\\ s.t.\begin{cases} 7x_1+3x_2+9x_3\leq 1\\ 8x_1+5x_2+4x_3\leq 1\\ 6x_1+9x_2+5x_3\leq 1\\ x_1, x_2, x_3\geq 0 \end{cases}
    matlab求解代码如下
    使用对偶单纯形法

    %%
    % 目标函数系数
    f=[-1, -1, -1];
    % 不等式约束的系数矩阵A
    A=[7, 3, 9; 8, 5, 4; 6, 9, 5];
    % 不等式约束b
    b=[1, 1, 1];
    
    % 等式约束矩阵
    Aeq=[];
    beq=[];
    % 变量的上下界
    lb=[0, 0, 0];
    ub=[];
    
    % 对偶单纯形求解
    options=optimset('LargeScale', 'off', 'Algorithm','dual-simplex', 'Display', 'iter');
    [x, fval, exitflag, output, lambda]=linprog(f, A, b, Aeq, beq, ub)
    

    求解信息如下
    ip

    使用内点法求解

    %%
    % 目标函数系数
    f=[-1, -1, -1];
    % 不等式约束的系数矩阵A
    A=[7, 3, 9; 8, 5, 4; 6, 9, 5];
    % 不等式约束b
    b=[1, 1, 1];
    
    % 等式约束矩阵
    Aeq=[];
    beq=[];
    % 变量的上下界
    lb=[0, 0, 0];
    ub=[];
    
    %% 内点法法求解
    options=optimset('LargeScale', 'off', 'Algorithm','interior-point', 'Display', 'iter');
    [x, fval, exitflag, output, lambda]=linprog(f, A, b, Aeq, beq, lb, ub, [], options)
    

    含参数线性规划

    求解如下目标函数含参数的线性规划
    minf=a1x1a2x2a3x3s.t.{7x1+3x2+9x318x1+5x2+4x316x1+9x2+5x31x1,x2,x30 \min f=-a_1x_1-a_2x_2-a_3x_3\\ s.t. \begin{cases} 7x_1+3x_2+9x_3\leq 1\\ 8x_1+5x_2+4x_3\leq 1\\ 6x_1+9x_2+5x_3\leq 1\\ x_1, x_2,x_3\geq 0 \end{cases}

    求解代码如下,在matlab 2018b中默认使用dual-simplex算法进行求解

    %% 含参数线性规划
    f0=[-1, -1, -1];
    a=[1, 1,  1];
    f=a.*f0; % 产生目标函数系数
    % 不等式约束的系数矩阵A
    A=[7, 3, 9; 8, 5, 4; 6, 9, 5];
    % 不等式约束b
    b=[1, 1, 1];
    
    % 等式约束矩阵
    Aeq=[];
    beq=[];
    % 变量的上下界
    lb=[0, 0, 0];
    ub=[];
    options=optimset('Display', 'iter'); % 显示迭代过程
    [x, fval, exitflag, output, lambda]=linprog(f, A, b, Aeq, beq, lb, ub, [], options)
    

    参考资料

    金融数量分析 北京航天航空大学出版社 郑志勇

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 463
精华内容 185
关键字:

matlab求解最优化问题

matlab 订阅