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