知识库 > 数学方法 > 优化方法

非线性规划    

  •     线性规划问题,其目标函数和约束条件都是自变量的一次函数。但是还有一类问题:其目标函数或约束条件中含有非线性函数,我们称这样的规划问题为非线性规划。
        非线性规划问题远比线性规划问题复杂,可分为无约束的非线性规划问题和有约束的非线性规划问题两大类。非线性规划间历的求解方法大体可分为两类:一类是将非线性规划问题化为线性问题来求解,另一类是直接求解。
          
        以上是有约束的非线性规划问题,如果我们将约束条件去掉:
         
        就变成了无约束的非线性规划问题。
        

        定义: Prog_N (Fun:string,x0:array,A:array,B:array,Aeq:array,Beq:array,Lb:array,Ub: array, nlc:string,options):array;
        说明:采用拟牛顿下山方法求解非线性规划求解。 
        参数:
        Fun : 目标函数,目标函数名字符串类型,不可缺省
        x0 : 初始值,一维数字数组,不可缺省
        A : 不等式约束,二维数组,缺省为空
        B : 不等式约束,一维数组,缺省为空
        Aeq : 等式约束,二维数组,缺省为空
        Beq : 等式约束,一维数组,缺省为空
        Lb : 下界,一维数组,缺省为空
        Ub : 上界,一维数组,缺省为空
        Nlc : 非线性约束,函数名,字符串
        Options:算法参数设置
        

        非线性规划option字段介绍
    字段含义取值
    'maxiter'最大迭代次数400
    'maxfunevals'目标回调最大次数'100*numberofvariables'
    'tolcon'约束容忍误差1.0e-6
    'tolfun'目标最小误差1.0e-6
    'tolx'变量最小变化1.0e-6
    'diffmaxchange'差分时最大步长1e-1
    'diffminchange'差分时最小步长1e-8

        例:非线性优化(参见平台下的Prog_N_Demo函数)
         
        

        Function Prog_N_Demo();
        Begin
           A :=ARRAY((1,1),(4,1));
           B := array(3,9);
           AEQ := ARRAY();
           BEQ := ARRAY();
           lb:= array(0,0);
           ub := array(5,5);
           x0:=array(1,1);//初始值
           options:=array('tolx':1.0e-6,'tolcon':1.0e-6,'tolfun':1.0e-6);
           return prog_n('Prog_N_Demo.obj',x0,a,b,aeq,beq,lb,ub,'Prog_N_Demo.constr',options);
        End;
        Function obj(x);
        Begin
           //目标函数
           Return 2*x[0]^2-4*x[0]*x[1]+4*x[1]^2-6*x[0]-3*x[1];
        End;
        Function constr(x);
        begin
           //非线性约束函数
           ne := array();
           e := array() ;
           ne[0]:= x[0]+x[1]^2-5;
           e[0]:=x[1]^2+x[0]^2-4;
           return array(ne,e);
        end
        

        下面我们再来介绍两个无约束非线性规划的公用函数。
        

        定义: NonLP_Fminsearch (Fun:string,x0:array,methods:integer):array;
        说明:无约束最小值求解,求解模型如下:
        min fun(x)
        参数:
        Fun : 目标函数,函数名字符串
        X0 : 初始值,一维数字数组
        Methods : 方法选择
        0 单纯形法
        1  转轴法
        2  模式搜索法
        3  拟牛顿下山法 (默认方法,推荐使用)
        

        例:无约束最小值求解(参见平台下的NonLP_Fminsearch_Demo函数)
        

        Function NonLP_Fminsearch_Demo();
        Begin
           x0 := array(1,1) ;//初始值;
           methods :=3;//
           Return NonLP_Fminsearch ('NonLP_Fminsearch_Demo.obj',x0,methods);
        End;
        function obj(x); //目标函数
        begin
            return 3*x[0]^2+x[1]^2-2*x[0]*x[1]+4*x[0]+3*x[1];
        end
        

        结果:
        array("x":(-1.75,-3.25),"opt":-8.375,"iter":4)
        

        定义: NonLP_Fminbnd (Fun:string,a:real,b:real,Methods:Integer):array;
        说明:一维最小值搜索,求解模型如下:
        min fun(x)
        参数:
        Fun : 目标函数(函数名字符串)
        A : 下界,实数
        B : 上界,实数
        Methods : 方法选择
        0 : 黄金分割法+抛物线法(默认)
                 1 : 盲人收索法
                 2 : 黄金分割法
                 3 : 斐波那契法
        

        例:一维最小值搜索(参见平台下的NonLP_Fminbnd_Demo函数)
        

        Function NonLP_Fminbnd_Demo();
        Begin
           A := 1 ;//下界;
           B := 7;//上界;
           methods :=0;//
           return ret := NonLP_Fminbnd ('NonLP_Fminbnd_Demo.obj',a,b,methods);
        End;
        function obj(x);  //目标函数
        begin
           return x^2-5*x+8;
        End;
        

        结果:
        array("x":2.49999998509884,"opt":1.75,"iter":2)