当前位置:文档之家› Matlab优化(求极值)

Matlab优化(求极值)

第七讲 Matlab 优化(求极值)理论介绍:算法介绍、软件求解. 一.线性规划问题1.线性规划问题是在一组线性约束条件的限制下,求一线性目标函数最大或最小值的问题,Matlab 中规定线性规划的标准形式为min s.t.T xc xAx b Aeq x beq lb x ub ≤⎧⎪⋅=⎨⎪≤≤⎩其中c 和x 为n 维列向量,A 、Aeq 为适当维数的矩阵,b 、beq 为适当维数的列向量。

注意:线性规划问题化为Matlab 规定中的标准形式。

求解线性规划问题的Matlab 函数形式为linprog(c,A,b),它返回向量x 的值,它的具体调用形式为:[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,x0,OPTIONS)这里fval 返回目标函数的值,LB 、UB 分别是变量x 的下界和上界,x0是x 的初始值,OPTIONS 是控制参数。

例1 求解线性规划问题123123123123123max 23572510s.t.312,,0z x x x x x x x x x x x x x x x =+-++=⎧⎪-+≥⎪⎨++≤⎪⎪≥⎩ 程序:c=[2;3;5];>> A=[-2,5,-1;1,3,1];b=[-10;12]; >> Aeq=[1,1,1];beq=[7]; >> LB=[0;0;0];(zeros(3,1))>> [x,fval]=linprog(c,A,b,Aeq,beq,LB,[]) 练习与思考:求解线性规划问题12312312123min 23+428s.t.3+26,,0z x x x x x x x x x x x =+++≥⎧⎪≥⎨⎪≥⎩ 注意:若没有不等式:b AX ≤存在,则令A=[ ],b=[ ]. 若没有等式约束, 则令Aeq=[ ], beq=[ ].2.可以转化为线性规划的问题规划问题12min||+||++||s.t.,n x x x Ax b ≤L 其中1=[],T n x x x L ,A b 为相应维数的矩阵和向量。

注意到对任意的i x 存在,>0i i u v 满足=-,||=+i i i i i i x u v x u v ,事实上只要取+||||-=,=22i i i i i i x x x xu v 就可以满足上面的条件。

这样,记11=[],=[],T T n n u u u v v v L L 从而可以把问题变成=1min (+)(-)s.t.,0ni i i u v A u v b u v ≤⎧⎨≥⎩∑例2 求解规划问题min{max||}iii x y ε,其中=-.i i i x y ε对于这个问题,如果取0=lim||ii y x ε,这样,上面的问题就变换成01100min s.t.-,,-n n x x y x x y x ≤≤L这是我们通常的线性规划问题。

练习与思考:规划问题1234123412341234min ||2||+3||+4||--+=0s.t.-+-3=11--2+3=-2z x x x x x x x x x x x x x x x x =+⎧⎪⎪⎨⎪⎪⎩二.非线性一元函数的最小值对于求一元函数的最小值问题,Matlab 提供了一个命令函数fminbnd ,fminbnd 函数的调用格式为:X=fminbnd(fun,x1,x2)和[X,fval]=fminbnd(fun,x1,x2)其中fun 为目标函数,x1,x2为变量的边界约束,即12[,]x x x ∈,X 为返回的满足fun 取得最小值的x 的值,fval 为目标函数值。

例3 计算函数321()x x x x f x e e-+-=+的最小值和f(x)取最小值时x 的值,[5,5].x ∈-程序:>> clear>> fun='(x^3+x^2-1)/(exp(x)+exp(-x))'; >> ezplot(fun,[-5,5]) >> [X,fval]=fminbnd(fun,-5,5)练习与思考:如何求一元函数的最大值 三.无约束非线性多元变量函数的优化对于无约束非线性多元变量函数的优化问题,主要采用命令函数fminsearch 和fminunc ,其中fminsearch 比较适合处理低阶多间断点的函数,fminunc 则对高阶连续函数有效。

1.命令函数fminsearch函数fminsearch 求解目标函数fun 的最小值和fun 取最小值时变量x 的值,调用格式为:X=fminsearch(fun,X0)和[X,fval]=fminsearch(fun,X0)其中X0为声明变量的初始值,X 为返回的x 的值,fval 为返回的fun 的值。

例4 求12[,],x x 使目标函数12()sin cos f x x x =+取得最小值。

程序:>> clear >> X0=[0,0];>> [X,fval]=fminsearch('sin(x(1))+cos(x(2))',X0)说明:声明变量初始值对返回的x 的值的影响。

X0=[100,100] 2.命令函数fminunc函数fminunc 通过计算寻找多变量目标函数fun 的最小值,调用格式为:X=fminunc(fun,X0)和[X,fval]=fminunc(fun,X0)其中X0为优化的初始值,X 为返回的x 的值,fval 为返回的fun 的值。

例5 对函数12212122()(42421)x f x e x x x x x =++++进行最小值优化。

程序:>> clear>> fun='exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1)'; >> x0=[0,0];>> [x,fval]=fminunc(fun,x0)注意:fminunc 函数只能处理实函数的优化问题,目标函数最好是连续函数,给出的解可能只是局部解。

四.有约束非线性多元变量函数的优化1.Matlab 命令函数fmincon 可以处理有约束的非线性多元变量的优化问题,有约束多元变量优化问题的数学模型为:求一组变量xi ,满足在给定的约束条件下,使目标函数f(xi)取得最小值。

目标函数一般为非线性函数,约束条件有线性不等式约束、线性等式约束、变量边界约束和非线性约束。

线性约束:i Ax B ≤,等式约束:i Aeq x Beq ⋅=,边界约束:i i i Lb x Ub ≤≤,fmincon 函数的调用格式为:[x,fval]=fmincon(fun,x0,A,B,Aeq,Beq,Lb,Ub,nonlcon,options)其中,nonlcon 表示非线性约束条件,options 为设置的控制优化过程的优化参数向量(可以用optionset 打开)。

非线性约束的表示形式为:把不等式和等式变换成小于号(或等号)左边是函数表达式右边为0的形式,然后以函数表达式作为元素分别组成不等式约束矩阵和等式约束矩阵。

当约束条件比较复杂时,常常先建立约束条件的M 文件。

例6求12[,],x x 使目标函数12212122()(42421)x f x e x x x x x =++++取得最小值,约束条件为:121212121.5*0;*10,0,0.x x x x x x x x +--≤-≤≥≥程序:(1)建立非线性约束的M 文件 function [c,ceq]=confun(x)c=[+x(1)*x(2)-x(1)-x(2);-x(1)*x(2)-10]; ceq=[];end(2)建立优化命令 >> clear x0=[-1,1];fun='exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1)'; lb=[0,0]; ub=[]; options=[];>> [x,fval,exitflag,output]=fmincon(fun,x0,[],[],[],[],lb,ub,'confun',options) 参数exitflag 有3种情况,exitflag>0表示优化结果收敛于解,exitflag<0表示优化结果不收敛于解,exitflag=0表示优化超过了声明的代入函数值的次数;output 包含优化过程的信息。

2.已知梯度条件的优化(例6的第二种解法)对于复杂的非线性优化问题,利用已知的梯度条件将会取得更加令人满意的结果。

例7利用梯度条件对12212122min ()(42421)x f x e x x x x x =++++进行优化,约束条件为:1212121.5*0;*10.x x x x x x +--≤-≤分析:(1)先写出目标函数和约束条件的梯度函数表达式:目标函数:12212122(42421)x objfun e x x x x x =++++ 目标函数的梯度:11122121221221[(42421)(84);(442)]x x x G e x x x x x e x x e x x =++++++++约束函数:121212[1.5*;*10]confun x x x x x x =+----梯度221111x x CG x x --⎧⎫=⎨⎬--⎩⎭程序:(1)编写目标函数及其梯度M 文件 function [f,G]=objfungrad(x)f=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);t=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);G=[t+exp(x(1))*(8*x(1)+4*x(2)),exp(x(1))*(4*x(1)+4*x(2)+2)];end(2)编写约束函数及其梯度M文件function [c,ceq,dc,dceq]=confungrad(x)c=[+x(1)*x(2)-x(1)-x(2);-x(1)*x(2)-10];ceq=[];dc=[x(2)-1,-x(2);x(1)-1,-x(1)];dceq=[];end(3)编写优化命令>> clear>> x0=[-1,1];>> options=[];[x,fval,exitflag,output]=fmincon('objfungrad',x0,[],[],[],[],[],[],'confungrad',options)。

相关主题