非线性规划.doc
非线性规划问题目前还没有合适各种问题形式的一般算法,现有的各个算法都有特定的适用范围,带有一定的局限性.实际问题中绝大多数都是有约束的优化问题.目前,求解带约束条件的非线性问题的常见方法是,将约束问题化为无约束问题,将非线性规划问题化为线性规划问题,以及将复杂问题化为较简单的问题的其他方法.利用一般迭代法解决无约束非线性规划问题.2 非线性规划问题 非线性规划的一般(标准)形式: minf(x) (2.1) 式中变量需满足:s.t. (2.2) 其中,x为n维欧式空间中的向量,称为决策向量,f(x)为目标函数,称为约束条件.,f(x)中至少有一个是关于决策变量的非线性函数关系式.同理,决策变量、目标函数、约束条件构成了非线性规划问题的三要素.通常,非线性规划是指非线性约束优化,但只要目标函数是非线性的,也可以讨论无约束优化问题1.2.1 一般迭代法 迭代法发的一般形式,Ax=b改写成x=Hx+g,H为矩阵g 向量而定义向量序列; , 为迭代序列而向量总是由方向和长度确定,即向量总可以写成 (k=1,2,.)其中为一个向量,为一个实数,称为步长,即可由及唯一确定2.2.2 梯度法f(x)具有一阶连续偏导数,它存在极小点X*。X(k)表示极小点的第k次近似,为了求其第k+次近似X(k+1),在X(k)点沿方向P(k)作射线 我们不妨设P(k)的模一定。当P(k)与f(X(k)同向,即取P(k)为梯度方向时,=0,cos=1, f(X(k)TP(k)最大;当P(k)与f(X(k)反向时, =1,cos=0, f(X(k)TP(k)<0,且其值最小,这一 方向为负梯度方向.前曾指出,负梯度方向是函数值下降最快的方向(通常指在X(k)的某一小范围内),沿这一方向搜索,有可能较快地达到极小点,梯度法就采用这样的方向为搜索方向. 为得到下一个近似极小点,在选定了搜索方向之后,还要确定步长。选取步长的一种方法是通过试算,即先取为某一常数,检验下式是否满足: 若满足,就可以取这个值进行迭代;若不满足,就减小使满足上式,由于采用负梯度方法,总是存在的3.3 用Matlab解决非线性规划问题 在Matlab优化工具箱中,fmincon函数是用SQP算法来解决一般的约束非线性规划的函数,它的命令格式为: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)3.1 管道问题天然气开采点S(0,0),需铺设管道分别向城市a(400km,400km),b(400km,600km),c(600km,400km)输送天然气(城市之间也可铺设管道),且知这三个城市的天然气日需量分别为5万,4万,10万立方米,铺设日输天然气能力为1万立方米的管道1km的总费用为5万元(假定总费用与管道的输送能力成正比),试设计管道铺设方案使费用最省4.到个坐标点的横向距离为x,纵向距离为y有已知条件知:目标函数:约束条件:MATLAB软件编写程序如下:function hh X0=500 500; format short g X,FVAL,EXITFLAG=fminsearch(myfun,X0) %test fmin syms x y A=5;B=4;C=10; f0=(A+B+C)*sqrt(x2+y2); fa=A*sqrt(x-400)2+(y-400)2); fb=B*sqrt(x-400)2+(y-600)2); fc=C*sqrt(x-600)2+(y-400)2); f=5*(f0+fa+fb+fc) ezmesh(f,0 500 0 500) function f=myfun(x) A=5;B=4;C=10; f0=(A+B+C)*sqrt(x(1)2+x(2)2); fa=A*sqrt(x(1)-400)2+(x(2)-400)2); fb=B*sqrt(x(1)-400)2+(x(2)-600)2); fc=C*sqrt(x(1)-600)2+(x(2)-400)2); f=5*(f0+fa+fb+fc); 结果: X = 2.2307e-005 1.7288e-005 FVAL = 64620 EXITFLAG = 1 3.2用最速下降法求解无约束非线性规划目标函数为: 其中,要求选取初始点,终止误差5.解: (i)编写M文件detaf.m如下function f,df=detaf(x);f=x(1)2+25*x(2)2;df(1)=2*x(1);df(2)=50*x(2);(ii)编写M文件zuisu.mclcx=2;2;f0,g=detaf(x);while norm(g)>0.000001 p=-g'/norm(g); t=1.0;f=detaf(x+t*p); while f>f0 t=t/2;f=detaf(x+t*p); endx=x+t*pf0,g=detaf(x)End