zoukankan      html  css  js  c++  java
  • 3. 用MATLAB优化工具箱的测试

    线性规划

    题目: 

     

     第0问  如何安排生产使利润最大

    假设生产甲饮料x百箱,乙饮料y百箱,利润为z

      

     上代码

    c=[-10 -9];%因为linprog找的是最小值,所以这个地方取相反数。
    % <=条件约束
    A=[6 5; 10 20];
    b=[60; 150];
    %  =条件约束
    Aeq=[];
    beq=[];
    %变量范围约束
    vlb=[0,0];
    vub=[];
    [x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub); 

    运行结果

    x =

        6.4286

        4.2857 

    fval =

     -102.8571

     当X =642 Y = 428 时候大概取最优值(是不是X应该多一个或者Y少一个,我懒得算了,正式比赛再说)

    此时利润 Z = 102.72

     

    第1问  若投资0.8万元可增加原料1千克,问应否作这项投资.

    假设生产甲饮料x百箱,乙饮料y百箱,利润为z,增加了W千克

     

     代码

    c=[-10 -9 0.8];%因为linprog找的是最小值,所以这个地方取相反数。
    % <=条件约束
    A=[6 5 -1; 10 20 0];
    b=[60; 150];
    %  =条件约束
    Aeq=[];
    beq=[];
    %变量范围约束
    vlb=[0,0,0];
    vub=[8,1000,1000];   %1000视为无穷大,表示没有限制
    [x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub); 

    结果

    x =

        8.0000

        3.5000

        5.5000

    fval =

     -107.1000

    所以要投资5.5千克比较好

    第2问  若每百箱甲饮料获利可增加1万元,问应否改变生产计划。

    代码

    c=[-11 -9 0.8];%因为linprog找的是最小值,所以这个地方取相反数。
    % <=条件约束
    A=[6 5 -1; 10 20 0];
    b=[60; 150];
    %  =条件约束
    Aeq=[];
    beq=[];
    %变量范围约束
    vlb=[0,0,0];
    vub=[8,1000,1000];   %1000视为无穷大,表示没有限制
    [x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub); 

    结果

    x = 

        8.0000

        3.5000

        5.5000 

    fval = 

     -115.1000 

    由此可得不需要改变策略。

    非线性规划 

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

    function f= =fun (X) ;

    f= =F(X) ;

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

    function [G,Ceq]=nonlcon(X)

    G=...

    Ceq=...

     3.建立主程序.非线性规划求解的函数是fmincon,命令的基本格式如下:

    (1)x=fmincon( 'fun' ,Xo,A,b)

    (2) x=fmincon( 'fun' ,Xo,A,b, Aeq, beq)

    (3) x=fmincon( 'fun' ,Xo,A,b, Aeq, beq, VLB, VUB)

    (4) x=fmincon( 'fun' ,Xo,A,b, Aeq, beq, VLB, VUB, ' nonlcon' )

    (5)x-fmincon( 'fun' ,Xo,A,b, Aeq, beq, VLB, VUB, 'nonlcon' ,options)

    (6) [x, fval]= fmincon(...)

    (7) [x, fval,exitflag]= fmincon(...) 

    (8) [x, fval, exi tflag, output]= fmincon(.. .)

    非线性案例

    案例1

     代码:

    fun.m

    function f=fun(x);
    f=-x(1)-2*x(2)+(1/2)*x(1)^2+(1/2)*x(2)^2

    main.m

    x0=[1;1];
    A=[2 3 ;1 4]; b=[6;5];
    Aeq=[];beq=[];
    VLB=[0;0]; VUB=[];
    [x,fval]=fmincon('fun',x0,A,b,Aeq,beq,VLB,VUB)

    结果

    x = 

        0.7647

        1.0588

    fval =

       -2.0294

    案例二

     

     fun.m

    function f=fun(x);
    f=-2*x(1)-x(2);

    mycon.m

    function [g,ceq]=mycon(x)
    g=[x(1)^2+x(2)^2-25;x(1)^2-x(2)^2-7];
    ceq = [];

    main.m

    x0=[3;2.5];
    A=[];b=[];
    Aeq=[];beq=[];
    vlb=[0 0];vub=[5 10];
    [x,fval]=fmincon('fun',x0,A,b,Aeq,beq,vlb,vub,'mycon')

    解得结果是

    x =

        4.0000

        3.0000

    fval =

      -11.0000

    一元函数求极值

    f= '2*exp(-x).*sin(x)' ; 
    %找最小值
    fplot(f,[0,8]); %作图语句
    [miny_X,miny_Y]=fminbnd (f, 0,8); %找最小y的横纵坐标 
    %找的最大值
    f1='-2*exp(-x).*sin(x)';
    [maxy_X,maxy_Y]=fminbnd (f1, 0,8) 

     

     多元函数无约束优化

    main.m

    x0 = [-1, 1];
    x=fminunc('fun',x0);
    y=fun(x)

    fun.m

    function f = fun (x)
    f = exp(x(1))*(4*x(1)^2+2*x(2)^2 +4*x(1)*x(2)+2*x(2)+1);

     结果:

    x =

    0.5000 -1.0000 

    y =

    3.6609e-15

    二次规划

    写成标准式:

     代码

    H=[1 -1; -1 2]; 
    c=[-2 ;-6];A=[1 1; -1 2];b=[2;2];
    Aeq=[];beq=[]; VLB=[0;0];VUB=[];
    [x,z]=quadprog(H,c,A,b,Aeq,beq,VLB,VUB)

    结果

    x =0.6667
    1.3333
    z = -8.2222

  • 相关阅读:
    tile38 复制配置
    The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
    tile38 一款开源的geo 数据库
    sqler sql 转rest api 的docker 镜像构建(续)使用源码编译
    sqler sql 转rest api javascript 试用
    sqler sql 转rest api redis 接口使用
    sqler sql 转rest api 的docker image
    sqler sql 转rest api 的工具试用
    apache geode 试用
    benthos v1 的一些新功能
  • 原文地址:https://www.cnblogs.com/SunChuangYu/p/13440222.html
Copyright © 2011-2022 走看看