1、MATLAB6.0 数学手册176第 5 章 优化问题5.1 线性规划问题线性规划问题是目标函数和约束条件均为线性函数的问题,MATLAB6.0 解决的线性规划问题的标准形式为:min nRxfsub.to: bAequl其中 f、x、b、beq、lb、ub 为向量,A 、Aeq 为矩阵。其它形式的线性规划问题都可经过适当变换化为此标准形式。在 MATLAB6.0 版中,线性规划问题( Linear Programming)已用函数 linprog 取代了MATLAB5.x 版中的 lp 函数。当然,由于版本的向下兼容性,一般说来,低版本中的函数在 6.0 版中仍可使用。函数 linprog格
2、式 x = linprog(f,A,b) %求 min f *x sub.to 线性规划的最优解。bxAx = linprog(f,A,b,Aeq,beq) %等式约束 ,若没有不等式约束eq,则 A= ,b= 。bxAx = linprog(f,A,b,Aeq,beq,lb,ub) %指定 x 的范围 ,若没有等式约束ubxl,则 Aeq= , beq= eqx = linprog(f,A,b,Aeq,beq,lb,ub,x0) %设置初值 x0x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options) % options 为指定的优化参数x,fval = lin
3、prog() % 返回目标函数最优值,即 fval= f *x。x,lambda,exitflag = linprog() % lambda 为解 x 的 Lagrange 乘子。x, lambda,fval,exitflag = linprog() % exitflag 为终止迭代的错误条件。x,fval, lambda,exitflag,output = linprog() % output 为关于优化的一些信息说明 若 exitflag0 表示函数收敛于解 x,exitflag=0 表示超过函数估值或迭代的最大数字,exitflagf = -5; -4; -6;A = 1 -1 1;3
4、2 4;3 2 0;b = 20; 42; 30;lb = zeros(3,1);x,fval,exitflag,output,lambda = linprog(f,A,b,lb)结果为:x = %最优解0.000015.00003.0000fval = %最优值-78.0000exitflag = %收敛1output = iterations: 6 %迭代次数cgiterations: 0algorithm: lipsol %所使用规则lambda = ineqlin: 3x1 doubleeqlin: 0x1 doubleupper: 3x1 doublelower: 3x1 doubl
5、e lambda.ineqlinans =0.00001.50000.5000 lambda.lowerans =1.00000.00000.0000表明:不等约束条件 2 和 3 以及第 1 个下界是有效的5.2 foptions 函数对于优化控制,MATLAB 提供了 18 个参数,这些参数的具体意义为:options(1)-参数显示控制(默认值为 0) 。等于 1 时显示一些结果。options(2)-优化点 x 的精度控制(默认值为 1e-4)。options(3)-优化函数 F 的精度控制(默认值为 1e-4)。options(4)-违反约束的结束标准(默认值为 1e-6)。MATL
6、AB6.0 数学手册178options(5)-算法选择,不常用。options(6)-优化程序方法选择,为 0 则为 BFCG 算法,为 1 则采用 DFP 算法。 options(7)-线性插值算法选择,为 0 则为混合插值算法,为 1 则采用立方插算法。options(8)-函数值显示 (目标达到问题中的 Lambda )options(9)-若需要检测用户提供的梯度,则设为 1。options(10)-函数和约束估值的数目。options(11)-函数梯度估值的个数。options(12)-约束估值的数目。options(13)-等约束条件的个数。options(14)-函数估值的最大
7、次数(默认值是 100变量个数) options(15)-用于目标 达到问题中的特殊目标。 options(16)-优化过程中变量的最小有限差分梯度值。options(17)- 优化过程中变量的最大有限差分梯度值。options(18)-步长设置 (默认为 1 或更小) 。Foptions 已经被 optimset 和 optimget 代替,详情请查函数 optimset 和 optimget。5.3 非线性规划问题5.3.1 有约束的一元函数的最小值单变量函数求最小值的标准形式为 sub.to )x(fmin21x在 MATLAB5.x 中使用 fmin 函数求其最小值。函数 fminbn
8、d格式 x = fminbnd(fun,x1,x2) %返回自变量 x 在区间 上函数 fun 取最小值21x时 x 值,fun 为目标函数的表达式字符串或MATLAB 自定义函数的函数柄。x = fminbnd(fun,x1,x2,options) % options 为指定优化参数选项x,fval = fminbnd() % fval 为目标函数的最小值x,fval,exitflag = fminbnd() %xitflag 为终止迭代的条件x,fval,exitflag,output = fminbnd() % output 为优化信息说明 若参数 exitflag0,表示函数收敛于 x
9、,若 exitflag=0,表示超过函数估计值或迭代的最大数字,exitflag x,fval,exitflag,output=fminbnd(x3+cos(x)+x*log(x)/exp(x),0,1)x =0.5223fval =0.3974exitflag =1output = iterations: 9funcCount: 9algorithm: golden section search, parabolic interpolation例 5-3 在0 ,5 上求下面函数的最小值 1)3x()f解:先自定义函数:在 MATLAB 编辑器中建立 M 文件为:function f = m
10、yfun(x)f = (x-3).2 - 1;保存为 myfun.m,然后在命令窗口键入命令: x=fminbnd(myfun,0,5)则结果显示为:x =35.3.2 无约束多元函数最小值多元函数最小值的标准形式为 )x(fmin其中:x 为向量,如 ,x21在 MATLAB5.x 中使用 fmins 求其最小值。命令 利用函数 fminsearch 求无约束多元函数最小值函数 fminsearch格式 x = fminsearch(fun,x0) %x0 为初始点,fun 为目标函数的表达式字符串或MATLAB 自定义函数的函数柄。x = fminsearch(fun,x0,options
11、) % options 查 optimsetx,fval = fminsearch() %最优点的函数值x,fval,exitflag = fminsearch() % exitflag 与单变量情形一致x,fval,exitflag,output = fminsearch() %output 与单变量情形一致注意:fminsearch 采用了 Nelder-Mead 型简单搜寻法。例 5-4 求 的最小值点21321x0x4y解:X=fminsearch(2*x(1)3+4*x(1)*x(2)3-10*x(1)*x(2)+x(2)2, 0,0)结果为X =1.0016 0.8335或在 MA
12、TLAB 编辑器中建立函数文件MATLAB6.0 数学手册180function f=myfun(x)f=2*x(1)3+4*x(1)*x(2)3-10*x(1)*x(2)+x(2)2;保存为 myfun.m,在命令窗口键入 X=fminsearch (myfun, 0,0) 或 X=fminsearch(myfun, 0,0)结果为:X =1.0016 0.8335命令 利用函数 fminunc 求多变量无约束函数最小值函数 fminunc格式 x = fminunc(fun,x0) %返回给定初始点 x0 的最小函数值点x = fminunc(fun,x0,options) % optio
13、ns 为指定优化参数x,fval = fminunc() %fval 最优点 x 处的函数值x,fval,exitflag = fminunc() % exitflag 为终止迭代的条件,与上同。x,fval,exitflag,output = fminunc() %output 为输出优化信息x,fval,exitflag,output,grad = fminunc() % grad 为函数在解 x 处的梯度值x,fval,exitflag,output,grad,hessian = fminunc() %目标函数在解 x 处的海赛(Hessian)值注意:当函数的阶数大于 2 时,使用 f
14、minunc 比 fminsearch 更有效,但当所选函数高度不连续时,使用 fminsearch 效果较好。例 5-5 求 的最小值。212x3)x(f fun=3*x(1)2+2*x(1)*x(2)+x(2)2; x0=1 1; x,fval,exitflag,output,grad,hessian=fminunc(fun,x0)结果为:x =1.0e-008 *-0.7591 0.2665fval =1.3953e-016exitflag =1output = iterations: 3funcCount: 16stepsize: 1.2353firstorderopt: 1.6772
15、e-007algorithm: medium-scale: Quasi-Newton line searchgrad =1.0e-006 *-0.16770.0114hessian =6.0000 2.00002.0000 2.0000或用下面方法: fun=inline(3*x(1)2+2*x(1)*x(2)+x(2)2)fun =Inline function:fun(x) = 3*x(1)2+2*x(1)*x(2)+x(2)2 x0=1 1; x=fminunc(fun,x0)x =1.0e-008 *-0.7591 0.26655.3.3 有约束的多元函数最小值非线性有约束的多元函数的
16、标准形式为: )x(fminsub.to 0C)(eqbAxul其中:x、b、beq、lb、ub 是向量,A、Aeq 为矩阵,C(x)、Ceq(x)是返回向量的函数,f(x)为目标函数,f(x) 、C(x) 、 Ceq(x)可以是非线性函数。在 MATLAB5.x 中,它的求解由函数 constr 实现。函数 fmincon格式 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,nonlco
17、n)x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)x,fval = fmincon()x,fval,exitflag = fmincon()x,fval,exitflag,output = fmincon()x,fval,exitflag,output,lambda = fmincon()x,fval,exitflag,output,lambda,grad = fmincon()x,fval,exitflag,output,lambda,grad,hessian = fmincon()参数说明:fun 为目标函数,它可用前面的方法定义
18、;x0 为初始值;A、b 满足线性不等式约束 ,若没有不等式约束,则取 A= ,b= ;bxAAeq、beq 满足等式约束 ,若没有,则取 Aeq= ,beq= ;eqMATLAB6.0 数学手册182lb、ub 满足 ,若没有界,可设 lb= ,ub= ;ubxlnonlcon 的作用是通过接受的向量 x 来计算非线性不等约束 和等式0)x(C约束 分别在 x 处的估计 C 和 Ceq,通过指定函数柄来使0)(Ceq用,如:x = fmincon(myfun,x0,A,b,Aeq,beq,lb,ub,mycon),先建立非线性约束函数,并保存为 mycon.m:function C,Ceq
19、= mycon(x)C = % 计算 x 处的非线性不等约束 的函数值。0)x(Ceq = % 计算 x 处的非线性等式约束 的函数值。Ceqlambda 是 Lagrange 乘子,它体现哪一个约束有效。output 输出优化信息;grad 表示目标函数在 x 处的梯度;hessian 表示目标函数在 x 处的 Hessiab 值。例 5-6 求下面问题在初始点( 0,1)处的最优解min 221215xsub.to )(632解:约束条件的标准形式为sub.to 0x)1(2x2先在 MATLAB 编辑器中建立非线性约束函数文件:function c, ceq=mycon (x)c=(x(
20、1)-1)2-x(2);ceq= ; %无等式约束然后,在命令窗口键入如下命令或建立 M 文件:fun=x(1)2+x(2)2-x(1)*x(2)-2*x(1)-5*x(2); %目标函数x0=0 1;A=-2 3; %线性不等式约束b=6;Aeq= ; %无线性等式约束beq= ;lb= ; %x 没有下、上界ub= ;x,fval,exitflag,output,lambda,grad,hessian=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,mycon)则结果为x =3 4fval =-13exitflag = %解收敛1output = iterations:
21、2funcCount: 9stepsize: 1algorithm: medium-scale: SQP, Quasi-Newton, line-searchfirstorderopt: cgiterations: lambda = lower: 2x1 double %x 下界有效情况,通过 lambda.lower 可查看。upper: 2x1 double %x 上界有效情况,为 0 表示约束无效。eqlin: 0x1 double %线性等式约束有效情况,不为 0 表示约束有效。eqnonlin: 0x1 double %非线性等式约束有效情况。ineqlin: 2.5081e-008
22、 %线性不等式约束有效情况。ineqnonlin: 6.1938e-008 %非线性不等式约束有效情况。grad = %目标函数在最小值点的梯度1.0e-006 *-0.17760hessian = %目标函数在最小值点的 Hessian 值1.0000 -0.0000-0.0000 1.0000例 5-7 求下面问题在初始点 x=(10, 10, 10)处的最优解。Min 321x)(fSub.to 70解:约束条件的标准形式为sub.to 0321 fun= -x(1)*x(2)*x(3); x0=10,10,10; A=-1 -2 -2;1 2 2; b=0;72; x,fval=fmi
23、ncon(fun,x0,A,b)结果为:x =24.0000 12.0000 12.0000fval =-34565.3.4 二次规划问题二次规划问题(quadratic programming)的标准形式为: xfH21minsub.to bAeqxul其中,H、A、Aeq 为矩阵,f 、b、beq 、lb、ub、x 为向量其它形式的二次规划问题都可转化为标准形式。MATLAB6.0 数学手册184MATLAB5.x 版中的 qp 函数已被 6.0 版中的函数 quadprog 取代。函数 quadprog格式 x = quadprog(H,f,A,b) %其中 H,f,A,b 为标准形中的
24、参数, x 为目标函数的最小值。x = quadprog(H,f,A,b,Aeq,beq) %Aeq,beq 满足等约束条件 。beqAx = quadprog(H,f,A,b,Aeq,beq,lb,ub) % lb,ub 分别为解 x 的下界与上界。x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0) %x0 为设置的初值x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options) % options 为指定的优化参数x,fval = quadprog() %fval 为目标函数最优值x,fval,exitflag = quadprog
25、() % exitflag 与线性规划中参数意义相同x,fval,exitflag,output = quadprog() % output 与线性规划中参数意义相同x,fval,exitflag,output,lambda = quadprog() % lambda 与线性规划中参数意义相同例 5-8 求解下面二次规划问题 21221x6x)x(fminsub.to 213x210,解: fH)(f则 , ,21621x在 MATLAB 中实现如下:H = 1 -1; -1 2 ;f = -2; -6;A = 1 1; -1 2; 2 1;b = 2; 2; 3;lb = zeros(2,1
26、);x,fval,exitflag,output,lambda = quadprog(H,f,A,b, , ,lb)结果为:x = %最优解0.66671.3333fval = %最优值-8.2222exitflag = %收敛1output = iterations: 3algorithm: medium-scale: active-setfirstorderopt: cgiterations: lambda = lower: 2x1 doubleupper: 2x1 doubleeqlin: 0x1 doubleineqlin: 3x1 double lambda.ineqlinans =
27、3.11110.44440 lambda.lowerans =00说明 第 1、2 个约束条件有效,其余无效。例 5-9 求二次规划的最优解max f (x1, x2)=x1x2+3sub.to x1+x2-2=0解:化成标准形式: 3x)0,(01)x(3)(fmin 2121221 sub.to x1+x2=2在 Matlab 中实现如下:H=0,-1;-1,0;f=0;0;Aeq=1 1;b=2;x,fval,exitflag,output,lambda = quadprog(H,f, , ,Aeq,b)结果为:x =1.00001.0000fval =-1.0000exitflag =1output = firstorderopt: 0iterations: 1cgiterations: 1algorithm: 1x58 charlambda = eqlin: 1.0000ineqlin: lower: upper: