一.非线性规划模型
1.概念:
如果目标函数或约束条件中包含非线性函数,就称该规划问题为非线性规划问题.一般来说,求解非线性规划问题要比求解线性规划问题困难得多,也不像线性规划问题那样有单纯形法这一通用方法,各个方法都有自己的适用范围
注意:如果线性规划的最优解存在,则其最优解只可能在其可行域的边界上(特别是顶点上);而如果非线性规划的最优解存在,其最优解可能在其可行域的任意位置
2.一般形式:
非线性规划问题的一般形式为: m i n f ( x ) s . t . { h j ( x ) ≤ 0 ( j = 1 , 2... q ) g i ( x ) = 0 ( i = 1 , 2... p ) ( 3.1 ) min\,\:f(x)\\s.t.\begin{cases}h_j(x)≤0\,(j=1,2...q)\\g_i(x)=0\,(i=1,2...p)\end{cases}\qquad(3.1) minf(x)s.t.{hj(x)≤0(j=1,2...q)gi(x)=0(i=1,2...p)(3.1)其中 x = [ x 1 , x 2 . . . x n ] T x=[x_1,x_2...x_n]^T x=[x1,x2...xn]T称为模型式 ( 3.1 ) (3.1) (3.1)的决策变量, f f f为目标函数, g i , h j g_i,h_j gi,hj为约束函数, g i ( x ) = 0 g_i(x)=0 gi(x)=0为等式约束, h j ( x ) ≤ 0 h_j(x)≤0 hj(x)≤0为不等式约束,目标函数和所有约束函数中至少有1个为非线性函数
某企业有 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,投资第i个项目0,不投资第i个项目则投资总额为 ∑ i = 1 n a i x i \displaystyle\sum_{i=1}^na_ix_i i=1∑naixi,总收益为 ∑ i = 1 n b i x i \displaystyle\sum_{i=1}^nb_ix_i i=1∑nbixi.由于至少要投资1个项目,且总资金为 A A A,故 0 < ∑ i = 1 n a i x i ≤ A 0<\displaystyle\sum_{i=1}^na_ix_i≤A 0<i=1∑naixi≤A另外,由于 x i x_i xi只能取 0 0 0或 1 1 1,故 x i ( 1 − x i ) = 0 x_i(1-x_i)=0 xi(1−xi)=0最佳方案应使投资额尽可能小而总收益尽可能大,故该问题的数学模型为 m a x 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 max\,\:Q=\frac{\displaystyle\sum_{i=1}^nb_ix_i}{\displaystyle\sum_{i=1}^na_ix_i}\\s.t.\begin{cases}0<\displaystyle\sum_{i=1}^na_ix_i≤A\\x_i(1-x_i)=0\end{cases} maxQ=i=1∑naixii=1∑nbixis.t.⎩⎪⎨⎪⎧0<i=1∑naixi≤Axi(1−xi)=0
3.MATLAB解法
(1)标准形式:
MATLAB中非线性规划的数学模型的标准形式为 m i n 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 ( 3.1 ) min\,\:f(x)\\s.t.\begin{cases}Ax≤b\\Aeq·x=beq\\c(x)≤0\\ceq(x)=0\\lb≤x≤ub\end{cases}\qquad(3.1) minf(x)s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧Ax≤bAeq⋅x=beqc(x)≤0ceq(x)=0lb≤x≤ub(3.1)其中 f ( x ) f(x) f(x)为标量函数, A , b , A e q , b e q , l b , u b A,b,Aeq,beq,lb,ub A,b,Aeq,beq,lb,ub为相应维数的矩阵和向量, c ( x ) , c e q ( x ) c(x),ceq(x) c(x),ceq(x)为非线性向量函数
(2)求解:
MATLAB中使用
[x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,option)
求解非线性规划问题.例如求解下述问题: m i n 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≥0\\x_1+x_2^2+x_3^3≤20\\-x_1-x_2^2+2=0\\x_2+2x_3^2=3\\x_1,x_2,x_3≥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计算代码为:
#func.mlx中:
function f=func(x);
f=sum(x.^2)+8;
end
#nonlcon.mlx中:
function [g,h]=nonlcon(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]%非线性等式约束
end
#命令行中:
>> [x,y]=fmincon('func',rand(3,1),[],[],[],[],zeros(3,1),[],'nonlcon');
>> x,y
x =
0.5522
1.2033
0.9478
y =
10.6511
二.无约束问题
1.无约束极值问题
(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的极值.计算代码为:
>> syms x y
>> f=x^3-y^3+3*x^2+3*y^2-9*x;
>> df=jacobian(f);%求1阶偏导数
>> d2f=jacobian(df);%求2阶偏导数
>> [xx,yy]=solve(df);%求驻点
>> xx=double(xx);
>> yy=double(yy);
>> for i=1:length(xx)
a=subs(d2f,{x,y},{xx(i),yy(i)});
b=eig(a);%求矩阵的特征值
r=subs(f,{x,y},{xx(i),yy(i)});
r=double(r);
if all(b>0)
fprintf('极小值点(%f,%f),极小值%f\n',xx(i),yy(i),r);
elseif all(b<0)
fprintf('极大值点(%f,%f),极大值%f\n',xx(i),yy(i),r);
elseif any(b>0)&any(b<0)
fprintf('(%f,%f)非极值点\n',xx(i),yy(i));
else
fprintf('无法判断(%f,%f)\n',xx(i),yy(i))
end
end
极小值点(1.000000,0.000000),极小值-5.000000
(-3.000000,0.000000)非极值点
(1.000000,2.000000)非极值点
极大值点(-3.000000,2.000000),极大值31.000000
(2)数值解:
在MATLAB中,使用
[x,fval]=fminunc(fun,x0,options)
或[x,fval]=fminsearch(fun,x0,options)
来求函数的极小值
求多元函数 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,z1]=fminunc(f,rand(2,1))
Local minimum found.
Optimization completed because the size of the gradient is less than
the default value of the optimality tolerance.
<stopping criteria details>
xy1 =
1.0000
-0.0000
z1 =
-5.0000
>> [xy2,z2]=fminsearch(g,rand(2,1));
>> xy2,-z2
xy2 =
-3.0000
2.0000
ans =
31.0000
求函数 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的极小值.计算代码为:
#fun.mlx中:
function [f,g]=fun(x);
f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
g=[-400*x(1)*(x(2)-x(1)^2)-2*(1-x(1));200*(x(2)-x(1)^2)];%返回梯度向量
end
#命令行中:
>> options=optimset('GradObj','on');
>> [x,y]=fminunc('fun',rand(1,2),options)
Local minimum found.
Optimization completed because the size of the gradient is less than
the default value of the optimality tolerance.
<stopping criteria details>
x =
1.0000 1.0000
y =
7.3005e-17
求函数 f ( x ) = sin ( x ) + 3 f(x)=\sin{(x)}+3 f(x)=sin(x)+3的极小值.计算代码为:
>> f=@(x) sin(x)+3;
>> [x,y]=fminsearch(f,2)
x =
4.7124
y =
2.0000
2.函数的零点:
求多项式 f ( x ) = x 3 − x 2 + 2 x − 3 f(x)=x^3-x^2+2x-3 f(x)=x3−x2+2x−3的零点.计算代码为:
>> a=[1,-1,2,-3];
>> x0=roots(a)
x0 =
-0.1378 + 1.5273i
-0.1378 - 1.5273i
1.2757 + 0.0000i
################################################################################################################################
>> syms x
>> x0=solve(x^3-x^2+2*x-3)%求零点的符号解
x0 =
root(z^3 - z^2 + 2*z - 3, z, 1)
root(z^3 - z^2 + 2*z - 3, z, 2)
root(z^3 - z^2 + 2*z - 3, z, 3)
>> x0=vpa(x0,5)%转换为小鼠格式
x0 =
1.2757
- 0.13784 + 1.5273i
- 0.13784 - 1.5273i
################################################################################################################################
>> y=@(x) x^3-x^2+2*x-3;
>> x=fsolve(y,rand)%求给定值附近的1个解
Equation solved.
fsolve completed because the vector of function values is near zero
as measured by the default value of the function tolerance, and
the problem appears regular as measured by the gradient.
<stopping criteria details>
x =
1.2757
3.方程组的解:
如如下方程组的解: { 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
>> [x,y]=solve(x^2+y-6,y^2+x-6)
x =
2
-3
21^(1/2)/2 + 1/2
1/2 - 21^(1/2)/2
y =
2
-3
1/2 - 21^(1/2)/2
21^(1/2)/2 + 1/2
################################################################################################################################
>> f=@(x) [x(1)^2+x(2)-6,x(2)^2+x(1)-6];
>> xy=fsolve(f,rand(2,1))
Equation solved.
fsolve completed because the vector of function values is near zero
as measured by the default value of the function tolerance, and
the problem appears regular as measured by the gradient.
<stopping criteria details>
xy =
2.0000
2.0000
三.约束极值问题
1.概念:
带有约束条件的极值问题称为约束极值问题,也叫规划问题.求解约束极值问题要比求解无约束极值问题困难得多,通常采用将约束问题转换为无约束问题,非线性规划问题转换为线性规划问题的方法进行简化
库恩·塔克条件是非线性规划领域中的重要理论成果,是确定某点为最优点的必要条件(对凸规划,也是充分条件)
2.二次规划
(1)概念:
若某非线性规划的目标函数为二次函数,且约束条件均为线性约束条件,就称该规划为二次规划
(2)MATLAB中的标准形式:
MATLAB中二次规划问题的标准形式为: m i n 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≤b\\Aeq\,·x=beq\\lb≤x≤ub\end{cases} min21xTHx+fTxs.t.⎩⎪⎨⎪⎧Ax≤bAeq⋅x=beqlb≤x≤ub其中 H H H为实对称矩阵, f , b , b e q , l b , u b f,b,beq,lb,ub f,b,beq,lb,ub为列向量, A , A e q A,Aeq A,Aeq为相应维数的矩阵
(3)求解:
MATLAB中使用
[x,fval]=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
求解二次规划问题
求解下述二次规划问题: m i n 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≤3\\4x_1+x_2≤9\\x_1,x_2≥0\end{cases} minf(x)=2x12−4x1x2+4x22−6x1−3x2s.t.⎩⎪⎨⎪⎧x1+x2≤34x1+x2≤9x1,x2≥0
>> h=[4,-4;-4,8];
>> f=[-6;-3];
>> a=[1,1;4,1];
>> b=[3;9];
>> [x,value]=quadprog(h,f,a,b,[],[],zeros(2,1))
Minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
x =
1.9500
1.0500
value =
-11.0250
3.罚函数法
(1)概念:
罚函数法又称序列无约束最小化技术(Sequential Unconstrained Minization Technique;SUMT).其基本思想是利用问题中的约束函数作出适当的罚函数,由此构造出带参数的增广目标函数,从而把问题转化为无约束非线性规划问题.该方法又分为外罚函数法和内罚函数法
(2)求解:
考虑问题 m i n f ( x ) s . t . { g i ( x ) ≤ 0 ( i = 1 , 2... r ) h j ( x ) ≥ 0 ( j = 1 , 2... s ) k m ( x ) = 0 ( m = 1 , 2... t ) min\,\:f(x)\\s.t.\begin{cases}g_i(x)≤0\,(i=1,2...r)\\h_j(x)≥0\,(j=1,2...s)\\k_m(x)=0\,(m=1,2...t)\end{cases} minf(x)s.t.⎩⎪⎨⎪⎧gi(x)≤0(i=1,2...r)hj(x)≥0(j=1,2...s)km(x)=0(m=1,2...t)取1个充分大的数 M > 0 M>0 M>0,构造函数 P ( x , M ) = f ( x ) + M ∑ i = 1 r m a x ( g i ( x ) , 0 ) − M ∑ j = 1 s m i n ( h j ( x ) , 0 ) + M ∑ m = 1 t ∣ k m ( x ) ∣ P(x,M)=f(x)+M\displaystyle\sum_{i=1}^rmax(g_i(x),0)-M\displaystyle\sum_{j=1}^smin(h_j(x),0)+M\displaystyle\sum_{m=1}^t|\,k_m(x)\,| P(x,M)=f(x)+Mi=1∑rmax(gi(x),0)−Mj=1∑smin(hj(x),0)+Mm=1∑t∣km(x)∣则以增广目标函数 P ( x , M ) P(x,M) P(x,M)为目标函数的无约束极值问题 m i n P ( x , M ) min\,\:P(x,M) minP(x,M)的最优解也是原问题的最优解
求解下述非线性规划问题 m i n 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≥0\\-x_1-x_2^2+2=0\\x_1,x_2≥0\end{cases} minf(x)=x12+x22+8s.t.⎩⎪⎨⎪⎧x12−x2≥0−x1−x22+2=0x1,x2≥0
#test.mlx中:
function g=test(x);
M=50000;
f=x(1)^2+x(2)^2+8;
g=f-M*min(x(1),0)-M*min(x(2),0)-M*min(x(1)^2-x(2),0)+M*abs(-x(1)-x(2)^2+2);
end
#命令行中:
>> [x,y]=fminsearch('test',rand(2,1))
x =
1.9991
0.0296
y =
11.9977
由于是非线性问题,很难求得全局最优解,只能求得1个局部最优解,且每次结果均不同
(3)适用:
①如果要求实时算法,可使用罚函数法,但精度较低
②如果不要求实时算法,但要求高精度,可使用Lingo或MATLAB中的fmincon()
求解
3.其他方法
(1)有限区间上单变量非线性函数的最小值:
MATLAB使用
[x,fval]=fminbnd(fun,x1,x2,options)
来求解这类问题
求 f ( x ) = ( x − 3 ) 2 − 1 ( 0 ≤ x ≤ 5 ) f(x)=(x-3)^2-1\,(0≤x≤5) f(x)=(x−3)2−1(0≤x≤5)的最小值
#fun.mlx中:
function f=fun(x);
f=(x-3)^2-1
end
#命令行中:
>> [x,y]=fminbnd('fun',0,5)
f =
0.1885
f =
-0.9919
f =
-0.3282
f =
-1
f =
-1.0000
f =
-1.0000
x =
3
y =
-1
(2)存在非线性约束:
MATLAB中的标准形式为 m i n 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 ( 1 ≤ i ≤ n ) min\,\:f(x)\\s.t.\begin{cases}Ax≤b\\Aeq\,·x=beq\\lb≤x≤ub\\c(x)≤0\\ceq(x)=0\\K_i(x,w_i)≤0\,(1≤i≤n)\end{cases} minf(x)s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧Ax≤bAeq⋅x=beqlb≤x≤ubc(x)≤0ceq(x)=0Ki(x,wi)≤0(1≤i≤n)其中 x , b , b e q , l b , u b x,b,beq,lb,ub x,b,beq,lb,ub为向量, A , A e q A,Aeq A,Aeq为矩阵, c ( x ) , c e q ( x ) c(x),ceq(x) c(x),ceq(x)为向量函数, K ( x , w i ) K(x,w_i) K(x,wi)为标量函数, w i w_i wi为附加的变量
MATLAB中使用
[x,fval]=fseminf(fun,x,ntheta,seminfcon,A,b,Aeq,beq,lb,ub)
进行求解
求 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的最小值,约束为 K 1 ( x , w 1 ) = sin ( w 1 x 1 ) cos ( w 1 x 2 ) − ( w 1 − 50 ) 2 1000 − sin ( w 1 x 3 ) − x 3 ≤ 1 ( 1 ≤ w 1 ≤ 100 ) K 2 ( x , w 2 ) = sin ( w 2 x 2 ) cos ( w 2 x 1 ) − ( w 2 − 50 ) 2 1000 − sin ( w 2 x 3 ) − x 3 ≤ 1 ( 1 ≤ w 2 ≤ 100 ) K_1(x,w_1)=\sin{(w_1x_1)}\cos{(w_1x_2)}-\frac{(w_1-50)^2}{1000}-\sin{(w_1x_3)}-x_3≤1\,(1≤w_1≤100)\\K_2(x,w_2)=\sin{(w_2x_2)}\cos{(w_2x_1)}-\frac{(w_2-50)^2}{1000}-\sin{(w_2x_3)}-x_3≤1\,(1≤w_2≤100) K1(x,w1)=sin(w1x1)cos(w1x2)−1000(w1−50)2−sin(w1x3)−x3≤1(1≤w1≤100)K2(x,w2)=sin(w2x2)cos(w2x1)−1000(w2−50)2−sin(w2x3)−x3≤1(1≤w2≤100)
#fun.mlx中:
function f=fun(x,s);
f=sum((x-0.5).^2);
end
#fun2.mlx中:
function [c,ceq,k1,k2,s]=fun2(x,s);
c=[];
ceq=[];
if isnan(s(1,1))
s=[0.2,0;0.2,0];
end
w1=1:s(1,1):100;
w2=1:s(2,1):100;
k1=sin(w1*x(1)).*cos(w1*x(2))-((w1-50).^2)/1000-sin(w1*x(3))-x(3)-1;
k2=sin(w2*x(2)).*cos(w2*x(1))-((w2-50).^2)/1000-sin(w2*x(3))-x(3)-1;
plot(w1,k1,'-',w2,k2,'+');#见下图
end
#命令行中:
>> [x,y]=fseminf(@fun,x0,2,@fun2)
Local minimum possible. Constraints satisfied.
fseminf stopped because the size of the current search direction is less than
twice the default value of the step size tolerance and constraints are
satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
x =
0.6675
0.3012
0.4022
y =
0.0771
(3)双重最值:
求解 m i n x m a x 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 \underset{x}{min}\,\underset{i}{max}\,F_i(x)\\s.t.\begin{cases}Ax≤b\\Aeq\,·x=beq\\c(x)≤0\\ceq(x)=0\\lb≤x≤ub\end{cases} xminimaxFi(x)s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧Ax≤bAeq⋅x=beqc(x)≤0ceq(x)=0lb≤x≤ub的MATLAB命令为
[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
#fun.mlx中:
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)-18
-x(1)-x(2)
x(1)+x(2)-8];
end
#命令行中:
>> [x,y]=fminimax(@fun,rand(2,1))
Local minimum possible. Constraints satisfied.
fminimax stopped because the size of the current search direction is less than
twice the default value of the step size tolerance and constraints are
satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
x =
4.0000
4.0000
y =
0.0000
-64.0000
-2.0000
-8.0000
-0.0000
(4)利用梯度求解约束优化问题:
已知 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),求 m i n 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≤-1.5\\x_1x_2≥-10\end{cases} minf(x)s.t.{x1x2−x1−x2≤−1.5x1x2≥−10
#fun.mlx中:
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(2)+4*x(1)+2)];%梯度
end
#fun2.mlx中:
function [c,ceq,dc,dceq]=fun2(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=[];%等式约束条件的梯度
end
#命令行中:
>> options=optimset('GradObj','on','GradConstr','on');
>> [x,y]=fmincon(@fun,rand(2,1),[],[],[],[],[],[],@fun2,options)
Local minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
x =
-9.5474
1.0474
y =
0.0236
四.飞行管理问题
1.问题叙述:
在 10 k m 10km 10km高空处某边长为 D = 160 k m D=160km D=160km的正方形区域(记为 Ω Ω Ω)中,经常有若干架飞机作水平飞行.当1架欲进入该区域的飞机到达区域边缘时,应立即记录其位置及速度,并判断其是否会与区域内其他飞机发生碰撞.如果会发生碰撞,则应计算如何调整各架飞机飞行的方向角(即飞行方向与x轴之间的夹角;记为 θ i 0 θ_i^0 θi0)以避免碰撞.要求如下:
①不碰撞的标准为任意2架飞机的距离均大于 8 k m 8km 8km
②飞机飞行的方向角调整的幅度(记为 Δ θ i Δθ_i Δθi)不应超过 30 ° 30° 30°,新方向角记为 θ i θ_i θi
③所有飞机的速度均为 a = 800 k m / h a=800km/h a=800km/h
④进入该区域的飞机在到达区域边缘时,与区域内飞机的距离应大于 60 k m 60km 60km
⑤最多考虑6架飞机
⑥不必考虑飞机离开此区域后的状况
⑦该区域的4个顶点的坐标分别为 ( 0 , 0 ) , ( 160 , 0 ) , ( 160 , 160 ) , ( 0 , 160 ) (0,0),(160,0),(160,160),(0,160) (0,0),(160,0),(160,160),(0,160)
⑧即第 i i i架飞机的初始位置为 ( x i 0 , y i 0 ) (x_i^0,y_i^0) (xi0,yi0),在 t t t时刻的位置为 ( x i ( t ) , y i ( t ) ) (x_i(t),y_i(t)) (xi(t),yi(t))
⑨初始飞行数据如下表:
飞机编号 | 横坐标 x i 0 x_i^0 xi0 | 纵坐标 y i 0 y_i^0 yi0 | 方向角 / ° |
---|---|---|---|
1 | 150 | 140 | 243 |
2 | 85 | 85 | 236 |
3 | 150 | 155 | 220.5 |
4 | 145 | 50 | 159 |
5 | 130 | 150 | 230 |
6(新进入) | 0 | 0 | 52 |
2.模型1: