数学建模预备知识——非线性规划

非线性规划

非线性规划模型

概念的引入

如果目标函数或者约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。一般来说,解非线性规划要比解线性规划问题困难。而且也不像线性规划有单纯形法这一通用方法,非线性规划目前还没有适用于各种问题的一般算法,各个方法都有自己的适用范围

例:某企业有 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,ii
则总投资金额为 ∑ i = 1 n a i x i \sum\limits_{i=1}^{n}a_ix_i i=1naixi ,投资总收益为 ∑ i = 1 n b i x i \sum\limits_{i=1}^{n}b_ix_i i=1nbixi

由于公司的总投资金额有限,所有有限制条件 0 < ∑ i = 1 n a i x i ≤ A 0<\sum\limits_{i=1}^{n}a_ix_i\leq A 0<i=1naixiA

对于决策变量 x i x_i xi ,因为其只能取 0 o r 1 0or1 0or1,因此增加条件 x i ( 1 − x i ) = 0 x_i(1-x_i)=0 xi(1xi)=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=1naixii=1nbixis.t.0<i=1naixiAxi(1xi)=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求解

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.AxbAeqx=beqc(x)0ceq(x)=0lbxub
其中 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.x12x2+x320x1+x22+x3320x1x22+2=0x2+2x32=3x1,x2,x30
解:

先编写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

无约束问题的Matlab求解

无约束极值问题的符号解

例:求多元函数 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)=x3y3+3x2+3y29x 的极值

解:

先求出偏导数解出驻点
{ 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+6x9=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] [x22fxy2fxy2fy22f]=[6+6x0066y]

如果在某驻点处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工具箱中,求解无约束极小值问题的函数有fminuncfminsearch,基本用法如下

求解函数的极小值
min ⁡ x f ( x ) x 为 标 量 或 向 量 \min \limits _x f(x) \quad x为标量或向量 xminf(x)x

  • Matlab中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)=x3y3+3x2+3y29x 的极值。

解:直接贴代码

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(x2x12)2+(1x1)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)=x3x2+2x3 的零点

    解:

    采用针对于多项式求解的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+y6=0y2+x6=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.AxbAeqx=beqlbxub
其中, 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)=2x124x1x2+4x226x13x2s.t.x1+x234x1+x29x1,x20
解:

%先求解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=1rmax(gi(x),0)Mj=1smax(hj(x),0)+Mm=1tkm(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))+MK(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.x12x20x1x22+2=0x1,x20
解:

先定义增广函数

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中求解约束极值问题

在Matlab优化工具箱中,用于求解约束最优化问题的函数有fminbndfminconquadprogfseminffminimax,之前已经介绍过了fminconquadprog

  • 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)=(x3)21,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.AxbAeqx=beqlbxubc(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 w1wn 为附加变量

    在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 xs 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)=(x10.5)2+(x20.5)2+(x30.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(w150)2sin(w1x3)x31K2(x,w2)=sin(w2x2)cos(w2x1)10001(w250)2sin(w2x3)x311w1100,1w2100
    解:

    先编写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.AxbAeqx=beqc(x)0ceq(x)=0lbxub

    在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+x2248x140x2+304f2(x)=x123x22f3(x)=x1+3x218f4(x)=x1x2f5(x)=x1+x28
    解:

    问题其实就是求解无条件限制下 $\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.{x1x2x1x21.5x1x210
    解:

    目标函数的梯度为
    [ 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中的优化工具箱

Matlab中优化工具箱中的optiomtool命令提供了优化问题的用户图形化界面解法。

数学建模预备知识——非线性规划_第1张图片

你可能感兴趣的:(数学建模预备知识,数学建模,matlab)