如果目标函数或者约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。一般来说,解非线性规划要比解线性规划问题困难。而且也不像线性规划有单纯形法这一通用方法,非线性规划目前还没有适用于各种问题的一般算法,各个方法都有自己的适用范围
例:某企业有 n n n 个项目可供投资选择,并且至少要对其中1个项目投资,已知该企业拥有总资金 A A A 元,投资第 i i i个项目需要花费 a i a_i ai 元,并且预计可以收益 b i b_i bi 元。试选择最佳投资方案。
解:
不妨设投资决策变量为
x i = { 1 , 决 定 投 资 第 i 个 项 目 0 , 决 定 不 投 资 第 i 个 项 目 x_i= \begin{cases} 1,&决定投资第i个项目\\ 0,&决定不投资第i个项目\\ \end{cases} xi={1,0,决定投资第i个项目决定不投资第i个项目
则总投资金额为 ∑ i = 1 n a i x i \sum\limits_{i=1}^{n}a_ix_i i=1∑naixi ,投资总收益为 ∑ i = 1 n b i x i \sum\limits_{i=1}^{n}b_ix_i i=1∑nbixi ,由于公司的总投资金额有限,所有有限制条件 0 < ∑ i = 1 n a i x i ≤ A 0<\sum\limits_{i=1}^{n}a_ix_i\leq A 0<i=1∑naixi≤A
对于决策变量 x i x_i xi ,因为其只能取 0 o r 1 0or1 0or1,因此增加条件 x i ( 1 − x i ) = 0 x_i(1-x_i)=0 xi(1−xi)=0
对于最佳投资方案,有投资收益与投资金额的比值是最大的,因此可以构建数学模型
max Q = ∑ i = 1 n b i x i ∑ i = 1 n a i x i s . t . { 0 < ∑ i = 1 n a i x i ≤ A x i ( 1 − x i ) = 0 , i = 1 , 2 ⋯ , n \max Q=\frac{\sum\limits_{i=1}^{n}b_ix_i}{\sum\limits_{i=1}^{n}a_ix_i} \\ s.t. \begin{cases} 0<\sum\limits_{i=1}^{n}a_ix_i\leq A \\ x_i(1-x_i)=0,\quad i=1,2\cdots,n \end{cases} maxQ=i=1∑naixii=1∑nbixis.t.⎩⎨⎧0<i=1∑naixi≤Axi(1−xi)=0,i=1,2⋯,n
注意到,上述例题是在一组不等式和等式限制条件约束下,求解一个函数的最大值或者最小值,只不过其中包含着非线性函数,因此这类问题称为非线性规划问题。可以将其统一成以下一般形式
min f ( x ) s . t . { h i ( x ) ≤ 0 , i = 1 , 2 , ⋯ , p g j ( x ) = 0 , j = 1 , 2 , ⋯ , q \min f(x) \\ s.t. \begin{cases} h_i(x)\leq 0,&i=1,2,\cdots,p \\ g_j(x)=0,&j=1,2,\cdots ,q \end{cases} minf(x)s.t.{hi(x)≤0,gj(x)=0,i=1,2,⋯,pj=1,2,⋯,q
其中 x = [ x 1 , ⋯ , x n ] T x=[x_1,\cdots,x_n]^T x=[x1,⋯,xn]T 为决策变量, f f f 为目标函数, g i g_i gi 为等式约束条件, h i h_i hi 为不等约束条件
Matlab种非线性规划的数学模型应该统一成以下一般形式
min f ( x ) s . t . { A ⋅ x ≤ b A e q ⋅ x = b e q c ( x ) ≤ 0 c e q ( x ) = 0 l b ≤ x ≤ u b \min f(x) \\ s.t. \begin{cases} A\cdot x\leq b \\ A_{eq} \cdot x = b_{eq} \\ c(x) \leq 0 \\ c_{eq}(x) = 0 \\ lb \leq x \leq ub \end{cases} minf(x)s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧A⋅x≤bAeq⋅x=beqc(x)≤0ceq(x)=0lb≤x≤ub
其中 A , A e q A,Aeq A,Aeq 为矩阵, b , b e q , l b , u b b,b_{eq},lb,ub b,beq,lb,ub 均为列向量, c ( x ) , c e q ( x ) c(x),c_{eq}(x) c(x),ceq(x) 为非线性向量函数
可以调用Matlab中的fmincon
函数进行求解
[ x , f v a l ] = f m i n c o n ( f u n , x 0 , A , b , A e q , b e q , l b , u b , n o n l c o n , o p t i o n s ) [x,fval]=fmincon(fun,x_0,A,b,A_{eq},b_{eq},lb,ub,nonlcon,options) [x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
x x x 为返回的决策向量, f v a l fval fval 为返回的目标函数的最小值, f u n fun fun 是用.m
文件定义的目标函数(也可以定义为匿名函数), x 0 x_0 x0 是决策向量 x x x 的初始值, A , b A,b A,b 用来描述线性不等约束, A e q , b e q A_{eq},b_{eq} Aeq,beq 用来描述线性等式约束,如果没有就用[]
来代替。 l b , u b lb,ub lb,ub 是 x x x 的上下限,如果没有也用[]
来代替。 n o n l c o n nonlcon nonlcon 是用.m
文件定义的非线性向量函数 c ( x ) , c e q ( x ) c(x),c_{eq}(x) c(x),ceq(x)。 o p t i o n s options options 定义了优化参数,可以使用Matlab种默认的参数来设置。
例:求解下列非线性规划
min f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 s . t . { x 1 2 − x 2 + x 3 2 ≥ 0 x 1 + x 2 2 + x 3 3 ≤ 20 − x 1 − x 2 2 + 2 = 0 x 2 + 2 x 3 2 = 3 x 1 , x 2 , x 3 ≥ 0 \min f(x)=x_1^2+x_2^2+x_3^2+8 \\ s.t. \begin{cases} x_1^2-x_2+x_3^2 \geq 0 \\ x_1+x_2^2+x_3^3 \leq 20 \\ -x_1-x_2^2+2 = 0 \\ x_2+2x_3^2 = 3 \\ x_1,x_2,x_3 \geq 0 \end{cases} minf(x)=x12+x22+x32+8s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x12−x2+x32≥0x1+x22+x33≤20−x1−x22+2=0x2+2x32=3x1,x2,x3≥0
解:先编写nonlcon参数的
f2.m
文件function [g,h]=f2(x) g=[-x(1)^2+x(2)-x(3)^2 x(1)+x(2)^2+x(3)^3-20] h=[-x(1)-x(2)^2+2 x(2)+2*x(3)^2-3]
编写主程序
f1=@(x)x(1)^2+x(2)^2+x(3)^2+8 x0=[1;1;1] lb=zeros(3,1) [x,fval]=fmincon(f1,x0,[],[],[],[],lb,[],'f2')
求得结果为:当 x 1 = 0.5522 , x 2 = 1.2033 , x 3 = 0.9487 x_1=0.5522,x_2=1.2033,x_3=0.9487 x1=0.5522,x2=1.2033,x3=0.9487 时,有最小值 f m i n = 10.6511 f_{min}=10.6511 fmin=10.6511
例:求多元函数 f ( x , y ) = x 3 − y 3 + 3 x 2 + 3 y 2 − 9 x f(x,y)=x^3-y^3+3x^2+3y^2-9x f(x,y)=x3−y3+3x2+3y2−9x 的极值
解:
先求出偏导数解出驻点
{ f x ( x , y ) = 3 x 2 + 6 x − 9 = 0 f y ( x , y ) = − 3 y 2 + 6 y = 0 \begin{cases} f_x(x,y)=3x^2+6x-9=0 \\ f_y(x,y)=-3y^2+6y=0 \end{cases} {fx(x,y)=3x2+6x−9=0fy(x,y)=−3y2+6y=0
解出驻点为 ( 1 , 0 ) , ( 1 , 2 ) , ( − 3 , 0 ) , ( − 3 , 2 ) (1,0),(1,2),(-3,0),(-3,2) (1,0),(1,2),(−3,0),(−3,2)再计算出Hessian矩阵,判断驻点是否是极值点
[ ∂ 2 f ∂ x 2 ∂ 2 f ∂ x ∂ y ∂ 2 f ∂ x ∂ y ∂ 2 f ∂ y 2 ] = [ 6 + 6 x 0 0 6 − 6 y ] \left[\begin{matrix} \frac{\partial^2f}{\partial x^2}&\frac{\partial^2f}{\partial x \partial y} \\ \frac{\partial^2f}{\partial x \partial y}&\frac{\partial^2f}{\partial y^2} \end{matrix}\right] = \left[\begin{matrix} 6+6x&0\\ 0&6-6y \end{matrix}\right] [∂x2∂2f∂x∂y∂2f∂x∂y∂2f∂y2∂2f]=[6+6x006−6y]
如果在某驻点处Hessian矩阵正定,则该驻点是极小值点;如果在某驻点处Hessian矩阵负定,则该驻点时极大值点;如果在某驻点处Hessian矩阵半正定或半负定时,则无法判断是极大值点还是极小值点;如果在某驻点处Hessian为不定矩阵,则该驻点不是极值点。
经过验证后, ( 1 , 0 ) (1,0) (1,0) 是极小值点, f m i n = − 5 f_{min}=-5 fmin=−5; ( − 3 , 2 ) (-3,2) (−3,2) 是极大值点, f m a x = 31 f_{max}=31 fmax=31; ( 1 , 2 ) , ( − 3 , 0 ) (1,2),(-3,0) (1,2),(−3,0) 不是极值点。
Matlab具体代码如下
syms x y f=x^3-y^3+3*x^2+3*y^2-9*x df=jacobian(f) %求一阶偏导数 ddf=jacobian(df) %求二阶偏导数 [xx,yy]=slove(df) %求驻点 xx=double(xx),yy=double(yy) %数据类型转化,因为求特征根要求时双精度浮点型 for i=1:length(xx) a=subs(ddf,{x,y},{xx(i),yy(i)}) %计算Hessian矩阵 b=eig(a) %求a矩阵的特征根 fval=subs(f,{x,y},{xx(i),yy(i)}) %计算f的值 if all(b>0) fprintf('(%f,%f)为极小值点,极小值为%f\n',xx(i),yy(i),fval) elseif all(b<0) fprintf('(%f,%f)为极大值点,极大值为%f\n',xx(i),yy(i),fval) elseif any(b>0)&any(b<0) fprintf('(%f,%f)不是极值点\n',xx(i),yy(i)) else fprintf('无法确定(%f,%f)是极大值还是极小值',xx(i),yy(i)) end end
在Matlab工具箱中,求解无约束极小值问题的函数有fminunc
和fminsearch
,基本用法如下
求解函数的极小值
min x f ( x ) x 为 标 量 或 向 量 \min \limits _x f(x) \quad x为标量或向量 xminf(x)x为标量或向量
fminunc
的基本命令为[ x , f v a l ] = f m i n u n c ( f u n , x 0 , o p t i o n s ) [x,fval]=fminunc(fun,x_0,options) [x,fval]=fminunc(fun,x0,options)
Matlab中fminsearch
的基本命令为
[ x , f v a l ] = f m i n s e a r c h ( f u n , x + 0 , o p t i o n s ) [x,fval]=fminsearch(fun,x+0,options) [x,fval]=fminsearch(fun,x+0,options)
返回值: x x x 为所求得极小值点的向量, f v a l fval fval 为函数的极小值。
f u n fun fun 是一个.m
编写的函数文件或者匿名函数,当 f u n fun fun 只有一个返回值的时候,他的返回值是函数 f ( x ) f(x) f(x) ;当 f u n fun fun 有两个返回值的时候,他的第二个返回值为 f ( x ) f(x) f(x) 的梯度向量;当 f u n fun fun 有三个返回值的时候,第三个返回值为 f ( x ) f(x) f(x) 的二阶导数矩阵Hessian矩阵。
x 0 x_0 x0 是 x x x 的初始值
o p t i o n s options options 是优化参数,没有对应实参的时候就使用默认参数
例1:求解多元函数 f ( x , y ) = x 3 − y 3 + 3 x 2 + 3 y 2 − 9 x f(x,y)=x^3-y^3+3x^2+3y^2-9x f(x,y)=x3−y3+3x2+3y2−9x 的极值。
解:直接贴代码
f=@(x) x(1)^3-x(2)^3+3*x(1)^2+3*x(2)^2-9*x(1) g=@(x) -f(x) [xy1,fmin]=fminunc(f,rand(2,1)) [xy2,fmax]=fminsearch(g,rand(2,1))
结果为: ( 1 , 0 ) (1,0) (1,0) 为极小值点, f m i n = − 5 fmin=-5 fmin=−5 ; ( − 3 , 2 ) (-3,2) (−3,2) 为极大值点, f m a x = 31 fmax=31 fmax=31。
例2:求函数 f ( x ) = 100 ( x 2 − x 1 2 ) 2 + ( 1 − x 1 ) 2 f(x)=100(x_2-x_1^2)^2+(1-x_1)^2 f(x)=100(x2−x12)2+(1−x1)2 的极小值
解:
两个返回值的
fun2.m
function [f,grad]=fun2(x); f=100*(x(2)-x(1)^2)^2+(1-x(1))^2 grad=[-400*x(1)*(x(2)-x(1)^2)-2*(1-x(1)) 200*(x(2)-x(1)^2)];
三个返回值的
fun3.m
function [f,grad,ddf]=fun3(x); f=100*(x(2)-x(1)^2)^2+(1-x(1))^2; grad=[-400*x(1)*(x(2)-x(1)^2)-2*(1-x(1)) 200*(x(2)-x(1)^2)]; ddf=[-400*x(1)+1200*x(1)^2+2 , -400*x(1) -400*x(1) , 200];
编写主函数
option2=optimset('GradObj','on') option3=optimset('GradObj','on','Hessian','on') [x2,y2]=fminunc('fun2',rand(2,1),option2) [x3,y3]=fminunc('fun3',rand(2,1),option3)
一般来说,提供的信息越多,计算越快,精度越高
求函数的零点
例:求多项式 f ( x ) = x 3 − x 2 + 2 x − 3 f(x)=x^3-x^2+2x-3 f(x)=x3−x2+2x−3 的零点
解:
采用针对于多项式求解的
roots
p=[1,-1,2,-3] x=roots(p)
还可以采用
solve
,来求解解析解,如果没有解析解,可以采用vpasolve
求解数值解syms x x0=vpasolve(x^3-exp(x)-5)
求解方程组的解
例:求方程组
{ x 2 + y − 6 = 0 y 2 + x − 6 = 0 \begin{cases} x^2+y-6=0 \\ y^2+x-6=0 \end{cases} {x2+y−6=0y2+x−6=0
解:syms x y [x0,y0]=solve(x^2+y-6,y^2+x-6) %%同样可以使用vpasolve求解数值解
带有约束条件的极值问题称为约束极值问题
求解约束极值问题要困难得多。为了简化其优化工作,可以采用以下方法:
若某非线性规划的目标函数为自变量 x x x 的二次函数,约束条件又全是线性的,就称这种规划为二次规划
在Matlab中二次规划的数学模型一般形式为
min 1 2 x T H x + f t x s . t . { A x ≤ b A e q x = b e q l b ≤ x ≤ u b \min \frac{1}{2}x^THx+f^tx \\ s.t. \begin{cases} Ax \leq b \\ A_{eq}x = b_{eq} \\ lb \leq x \leq ub \end{cases} min21xTHx+ftxs.t.⎩⎪⎨⎪⎧Ax≤bAeqx=beqlb≤x≤ub
其中, H H H 为实对称矩阵,是二次型系数矩阵的二倍; f , b , b e q , l b , u b f,b,b_{eq},lb,ub f,b,beq,lb,ub 均为列向量, A , A e q A,A_{eq} A,Aeq 为系数矩阵
Matlab中求解二次规划的命令为
[ x , f v a l ] = q u a d p r o g ( H , f , A , b , A e q , b e q , l b , u b , x 0 , o p t i o n s ) [x,fval]=quadprog(H,f,A,b,A_{eq},b_{eq},lb,ub,x_0,options) [x,fval]=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
例:求解二次规划
min f ( x ) = 2 x 1 2 − 4 x 1 x 2 + 4 x 2 2 − 6 x 1 − 3 x 2 s . t . { x 1 + x 2 ≤ 3 4 x 1 + x 2 ≤ 9 x 1 , x 2 ≥ 0 \min f(x)=2x_1^2-4x_1x_2+4x_2^2-6x_1-3x_2 \\ s.t. \begin{cases} x_1+x_2 \leq 3 \\ 4x_1+x_2 \leq 9 \\ x_1,x_2 \geq 0 \end{cases} minf(x)=2x12−4x1x2+4x22−6x1−3x2s.t.⎩⎪⎨⎪⎧x1+x2≤34x1+x2≤9x1,x2≥0
解:%先求解H syms x y f=2*x^2-4*x*y+4*y^2-6*x-3*y H=hessian(f,[x,y]) %再求解二次规划 f=[-6;-3] A=[1,1;4,1] b=[3;9] [x,fval]=quadprog(H,f,A,b,[],[],zeros(2,1))
解得: x 1 = 1.9500 x_1=1.9500 x1=1.9500, x 2 = 1.0500 x_2=1.0500 x2=1.0500, m i n f ( x ) = − 11.0250 minf(x)=-11.0250 minf(x)=−11.0250 。
利用罚函数法,可以将非线性规划问题的求解转化为一系列无约束极值问题,因而这种方法被称为序列无约束最小化技术**(SUMT)**
罚函数法求解非线性规划问题的思想为:利用问题中的约束函数做出适当的罚函数,由此构造出带参数的增广目标函数,把问题转化为无约束非线性规划问题。主要有两种形式:外罚函数法和内罚函数法
简单介绍外罚函数法
研究问题
min f ( x ) s . t . { g i ( x ) ≤ 0 , i = 1 , ⋯ , r h j ( x ) ≥ 0 , j = 1 , ⋯ , s k m ( x ) = 0 , m = 1 , ⋯ , t \min f(x) \\ s.t. \begin{cases} g_i(x) \leq 0,&i=1,\cdots,r\\ h_j(x) \geq 0,&j=1,\cdots,s\\ k_m(x) = 0,&m=1,\cdots,t\\ \end{cases} minf(x)s.t.⎩⎪⎨⎪⎧gi(x)≤0,hj(x)≥0,km(x)=0,i=1,⋯,rj=1,⋯,sm=1,⋯,t
现取一个充分大的整数 M M M ,构造函数
P ( x , M ) = f ( x ) + M ∑ i = 1 r m a x ( g i ( x ) , 0 ) − M ∑ j = 1 s m a x ( h j ( x ) , 0 ) + M ∑ m = 1 t ∣ k m ( x ) ∣ P(x,M)=f(x)+M\sum\limits_{i=1}^{r}max(g_i(x),0)-M\sum\limits_{j=1}^{s}max(h_j(x),0)+M\sum\limits_{m=1}^{t}|k_m(x)| P(x,M)=f(x)+Mi=1∑rmax(gi(x),0)−Mj=1∑smax(hj(x),0)+Mm=1∑t∣km(x)∣
或者写成
P ( x , M ) = f ( x ) + M s u m ( m a x ( G ( x ) 0 ) ) − M s u m ( m i n ( H ( x ) 0 ) ) + M ∥ K ( x ) ∥ P(x,M)=f(x)+Msum(max(\begin{matrix}G(x)\\0\end{matrix}))-Msum(min(\begin{matrix}H(x)\\0\end{matrix}))+M\|K(x)\| P(x,M)=f(x)+Msum(max(G(x)0))−Msum(min(H(x)0))+M∥K(x)∥
其中 G ( x ) = [ g 1 ( x ) , ⋯ , g r ( x ) ] G(x)=[g_1(x),\cdots,g_r(x)] G(x)=[g1(x),⋯,gr(x)], H ( x ) = [ h 1 ( x ) , ⋯ , h s ( x ) ] H(x)=[h_1(x),\cdots,h_s(x)] H(x)=[h1(x),⋯,hs(x)], K ( x ) = [ k 1 ( x ) , ⋯ , k m ( x ) ] K(x)=[k_1(x),\cdots,k_m(x)] K(x)=[k1(x),⋯,km(x)]
例:求解下列非线性规划
min f ( x ) = x 1 2 + x 2 2 + 8 s . t . { x 1 2 − x 2 ≥ 0 − x 1 − x 2 2 + 2 = 0 x 1 , x 2 ≥ 0 \min f(x)=x_1^2+x_2^2+8 \\ s.t. \begin{cases} x_1^2-x_2\geq0 \\ -x_1-x_2^2+2=0 \\ x_1,x_2 \geq 0 \end{cases} minf(x)=x12+x22+8s.t.⎩⎪⎨⎪⎧x12−x2≥0−x1−x22+2=0x1,x2≥0
解:先定义增广函数
function P=test(x); M=10^9; f=x(1)^2+x(2)^2+8; P=f-M*sum(min([x';zeros(size(x'))]))-M*min([x(1)^2-x(2),0])+M*abs(-x(1)-x(2)^2+2);
在主函数中只需要调用
fminsearch
即可求解[x,fval]=fminsearch('test',rand(2,1))
P.S. 这种方法只能求得局部最优解,很难得到全局最优解,所以可能每次运行的结果都不相同
在Matlab优化工具箱中,用于求解约束最优化问题的函数有fminbnd
,fmincon
,quadprog
,fseminf
,fminimax
,之前已经介绍过了fmincon
和quadprog
fminbnd
函数
求解单变量非线性函数在区间上的极小值
min x f ( x ) , x ∈ [ x 1 , x 2 ] \min \limits _x f(x),\quad x \in [x_1,x_2] xminf(x),x∈[x1,x2]
在Matlab中的命令为
[ x , f v a l ] = f m i n b n d ( f u n , x 1 , x 2 , o p t i o n s ) [x,fval]=fminbnd(fun,x_1,x_2,options) [x,fval]=fminbnd(fun,x1,x2,options)
例:求函数 f ( x ) = ( x − 3 ) 2 − 1 , x ∈ [ 0 , 5 ] f(x)=(x-3)^2-1,x \in [0,5] f(x)=(x−3)2−1,x∈[0,5] 的最小值
解:
先编写
fun.m
文件function f=fun(x); f=(x-3)^2-1;
在编写主函数
[x,y]=fminbnd('fun',0,5);
fseminf
函数
其一般形式为
min f ( x ) s . t . { A ⋅ x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b c ( x ) ≤ 0 c e q ( x ) = 0 K i ( x , w i ) ≤ 0 , i = 1 , ⋯ , n \min f(x)\\ s.t. \begin{cases} A\cdot x \leq b \\ A_{eq}\cdot x =b_{eq} \\ lb \leq x \leq ub \\ c(x) \leq 0 \\ c_{eq}(x) = 0 \\ K_i(x,w_i)\leq 0,\quad i=1,\cdots ,n \end{cases} minf(x)s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧A⋅x≤bAeq⋅x=beqlb≤x≤ubc(x)≤0ceq(x)=0Ki(x,wi)≤0,i=1,⋯,n
其中: K i ( x , w i ) K_i(x,w_i) Ki(x,wi) 为标量函数, w 1 ⋯ w n w_1\cdots w_n w1⋯wn 为附加变量
在Matlab中的命令为
[ x , f v a l ] = f s e m i n f ( f u n , x 0 , n t h e t a , s e m i n f c o n , A , b , A e q , b e q , l b , u b ) [x,fval]=fseminf(fun,x_0,ntheta,seminfcon,A,b,A_{eq},b_{eq},lb,ub) [x,fval]=fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub)
其中: n t h e t a ntheta ntheta 是半无穷约束 K i ( x , w i ) K_i(x,w_i) Ki(x,wi) 的个数;函数 s e m i n f c o n seminfcon seminfcon 用于顶i有非线性不等式约束 c ( x ) c(x) c(x)、非线性等式约束 c e q ( x ) c_{eq}(x) ceq(x) 和半无穷约束 K i ( x , w i ) K_i(x,w_i) Ki(x,wi) 的函数, s e m i n f c o n seminfcon seminfcon 函数拥有两个输入参数 x 、 s x、s x、s , s s s 为推荐的取样步长,可以不适用
例:求函数 f ( x ) = ( x 1 − 0.5 ) 2 + ( x 2 − 0.5 ) 2 + ( x 3 − 0.5 ) 2 f(x)=(x_1-0.5)^2+(x_2-0.5)^2+(x_3-0.5)^2 f(x)=(x1−0.5)2+(x2−0.5)2+(x3−0.5)2 取得最小值时的 x x x 值,约束条件为
K 1 ( x , w 1 ) = s i n ( w 1 x 1 ) c o s ( w 1 x 2 ) − 1 1000 ( w 1 − 50 ) 2 − s i n ( w 1 x 3 ) − x 3 ≤ 1 K 2 ( x , w 2 ) = s i n ( w 2 x 2 ) c o s ( w 2 x 1 ) − 1 1000 ( w 2 − 50 ) 2 − s i n ( w 2 x 3 ) − x 3 ≤ 1 1 ≤ w 1 ≤ 100 , 1 ≤ w 2 ≤ 100 K_1(x,w_1)=sin(w_1x_1)cos(w_1x_2)-\frac{1}{1000}(w_1-50)^2-sin(w_1x_3)-x_3 \leq 1\\ K_2(x,w_2)=sin(w_2x_2)cos(w_2x_1)-\frac{1}{1000}(w_2-50)^2-sin(w_2x_3)-x_3 \leq 1\\ 1 \leq w_1 \leq 100, \quad 1 \leq w_2 \leq 100 K1(x,w1)=sin(w1x1)cos(w1x2)−10001(w1−50)2−sin(w1x3)−x3≤1K2(x,w2)=sin(w2x2)cos(w2x1)−10001(w2−50)2−sin(w2x3)−x3≤11≤w1≤100,1≤w2≤100
解:先编写
fun.m
function f=fun(x,s); f=sun((x-0.5).^2);
再编写
seminfcon.m
function [c,ceq,k1,k2,s]=seminfcon(x,s); c=[]; ceq=[]; if isnan(s(1,1)) s=[0.2 0;0.2 0]; end w1=0:s(1,1):100; w2=0:s(2,1):100; k1=sin(w1*x(1)).*cos(w1*x(2))-1/1000*(w1-50).^2-sin(w1*x(3))-x(3)-1; k2=sin(w2*x(2)).*cos(w2*x(1))-1/1000*(w2-50).^2-sin(w2*x(3))-x(3)-1; plot(w1,k1,'-',w2,k2,'+')
编写主函数
x0=[0.5;0.2;0.3]; [x,y]=seminfcon('fun',x0,2,'seminfcon')
最终结果为: x 1 = 0.6675 , x 2 = 0.3012 , x 3 = 0.4022 x_1=0.6675,x_2=0.3012,x_3=0.4022 x1=0.6675,x2=0.3012,x3=0.4022,对应的最小值为 f ( x ) m i n = 0.0771 f(x)_{min}=0.0771 f(x)min=0.0771。
fminimax
函数
当遇到求解极小-极大值问题时,其一般形式为
min x max i F i ( x ) s . t . { A ⋅ x ≤ b A e q ⋅ x = b e q c ( x ) ≤ 0 c e q ( x ) = 0 l b ≤ x ≤ u b \min \limits _x \max \limits _i F_i(x) \\ s.t. \begin{cases} A \cdot x \leq b \\ A_{eq} \cdot x = b_{eq} \\ c(x) \leq 0 \\ c_{eq}(x) = 0 \\ lb \leq x \leq ub \\ \end{cases} xminimaxFi(x)s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧A⋅x≤bAeq⋅x=beqc(x)≤0ceq(x)=0lb≤x≤ub
在Matlab中的命令为
[ x , f v a l ] = f m i n i m a x ( f u n , x 0 , A , b , A e q , b e q , l b , u b , n o n l c o n , o p t i o n s ) [x,fval]=fminimax(fun,x_0,A,b,A_{eq},b_{eq},lb,ub,nonlcon,options) [x,fval]=fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
例:求函数族 { f 1 ( x ) , f 2 ( x ) , f 3 ( x ) , f 4 ( x ) , f 5 ( x ) } \{f_1(x),f_2(x),f_3(x),f_4(x),f_5(x)\} {f1(x),f2(x),f3(x),f4(x),f5(x)} 取极小-极大值的时候, x x x 的值,其中
{ f 1 ( x ) = 2 x 1 2 + x 2 2 − 48 x 1 − 40 x 2 + 304 f 2 ( x ) = − x 1 2 − 3 x 2 2 f 3 ( x ) = x 1 + 3 x 2 − 18 f 4 ( x ) = − x 1 − x 2 f 5 ( x ) = x 1 + x 2 − 8 \begin{cases} f_1(x)=2x_1^2+x_2^2-48x_1-40x_2+304 \\ f_2(x)=-x_1^2-3x_2^2 \\ f_3(x)=x_1+3x_2-18 \\ f_4(x)=-x_1-x_2 \\ f_5(x)=x_1+x_2-8 \\ \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧f1(x)=2x12+x22−48x1−40x2+304f2(x)=−x12−3x22f3(x)=x1+3x2−18f4(x)=−x1−x2f5(x)=x1+x2−8
解:问题其实就是求解无条件限制下 $\min \limits _x \max \limits _i f_i(x) $,因此先编写
fun.m
文件function f=fun(x); f=[2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304 -x(1)^2-3*x(2)^2 x(1)+3*x(2) -x(1)-x(2) x(1)+x(2)-8]
在主函数中调用
fminimax
[x,y]=fminimax('fun',rand(2,1))
得到结果为: x 1 = 4 , x 2 = 4 x_1=4,x_2=4 x1=4,x2=4,此时 f 1 ( x ) = 0 f_1(x)=0 f1(x)=0, f 2 ( x ) = − 64 f_2(x)=-64 f2(x)=−64, f 3 ( x ) = − 2 f_3(x)=-2 f3(x)=−2, f 4 ( x ) = − 8 f_4(x)=-8 f4(x)=−8, f 5 ( x ) = 0 f_5(x)=0 f5(x)=0。
如果想要求极大-极小值问题,可以将问题进行如下变形
max x min i F i ( x ) = − min x max i [ − F ( x ) ] \max _x \min _i F_i(x)=-\min _x \max _i [-F(x)] xmaximinFi(x)=−xminimax[−F(x)]
可以通过设置options
中的MinAbsMax
属性来使fminimax
函数适用于求解极大-极小值问题
利用梯度求解约束优化问题
使用梯度求解约束机制问题的时候,效率更高且结果更加准确
例:已知函数 f ( x ) = e x 1 ( 4 x 1 2 + 2 x 2 2 + 4 x 1 x 2 + 2 x 2 + 1 ) f(x)=e^{x_1}(4x_1^2+2x_2^2+4x_1x_2+2x_2+1) f(x)=ex1(4x12+2x22+4x1x2+2x2+1),求
min f ( x ) s . t . { x 1 x 2 − x 1 − x 2 ≤ − 1.5 x 1 x 2 ≥ − 10 \min f(x) \\ s.t. \begin{cases} x_1x_2-x_1-x_2 \leq -1.5 \\ x_1x_2 \geq -10 \end{cases} minf(x)s.t.{x1x2−x1−x2≤−1.5x1x2≥−10
解:目标函数的梯度为
[ e x 1 ( 4 x 1 2 + 2 x 2 2 + 4 x 1 x 2 + 8 x 1 + 6 x 2 + 1 ) e x 1 ( 4 x 1 + 4 x 2 + 2 ) ] \left[\begin{matrix} e^{x_1}(4x_1^2+2x_2^2+4x_1x_2+8x_1+6x_2+1)\\ e^{x_1}(4x_1+4x_2+2) \end{matrix}\right] [ex1(4x12+2x22+4x1x2+8x1+6x2+1)ex1(4x1+4x2+2)]
先编写fun.m
定义目标函数和梯度函数function [f,df]=fun(x); f=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1) df=[exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+8*x(1)+6*x(2)+1) exp(x(1))*(4*x(1)+4*x(2)+2)]
编写
nonlcon.m
来定义约束条件以及约束条件梯度函数function [c,ceq,dc,dceq]=nonlcon(x); c=[x(1)*x(2)-x(1)-x(2)+1.5;-x(1)*x(2)-10]; dc=[x(2)-1,-x(2);x(1)-1,-x(1)]; ceq=[],dceq=[];
在主函数中调用
fmincon
函数options=optimset('GradObj','on','GradConstr','on'); [x,y]=fmincon('fun',rand(2,1),[],[],[],[],[],[],'nonlcon',options)
求得 x 1 = − 9.5474 , x 2 = 1.0474 x_1=-9.5474,x_2=1.0474 x1=−9.5474,x2=1.0474,对应的极小值为 y = 0.0236 y=0.0236 y=0.0236。
Matlab中优化工具箱中的optiomtool
命令提供了优化问题的用户图形化界面解法。