一、实验目的
了解Matlab的优化工具箱,利用Matlab求解非线性优化问题。
二、相关知识
非线性优化包括相当丰富的内容,我们这里就Matlab提供的一些函数来介绍相关函数的用法及其所能解决的问题。
(一)非线性一元函数的最小值
Matlab函数为fminbnd(),其使用格式为:
X=fminbnd(fun,x1,x2)
[X,fval,exitflag,output]= fminbnd(fun,x1,x2)
其中:fun为目标函数,x1,x2为变量的边界约束,即x1≤x≤x2,X为返回的满足fun取得最小值的x的值,而fval则为此时的目标函数值。exitflag>0表示计算收敛,exitflag=0表示超过了最大的迭代次数,exitflag<0表示计算不收敛,返回值output有3个分量,其中iterations是优化过程中迭代次数,funcCount是代入函数值的次数,algorithm是优化所采用的算法。
例1:求函数
在区间
的最小值和相应的
值。
解决此问题的Matlab程序为:
clear
fun='(x^5+x^3+x^2-1)/(exp(x^2)+sin(-x))'
ezplot(fun,[-2,2])
[X,fval,exitflag,output]= fminbnd(fun,-2,2)
结果为:
X = 0.2176
fval =-1.1312
exitflag = 1
output = iterations: 13
funcCount: 13
algorithm: 'golden section search, parabolic interpolation'
(二)无约束非线性多变量优化问题
这里我们介绍两个命令:fminsearch()和fminunc(),前者适合处理阶次低但是间断点多的函数,后者则对于高阶连续的函数比较有效。
命令fminsearch()的格式为:
X= fminsearch(fun,X0)
[X,fval,exitflag,output]= fminsearch(fun,X0,options)
该命令求解目标函数fun的最小值和相应的x值,X0为x的初始值,fval为返回的函数值,exitflag=1表示优化结果收敛,exitflag=0表示超过了最大迭代次数。返回值output有3个分量,其中iterations是优化过程中的迭代次数,funcCount是代入函数值的次数,algorithm是优化所采用的算法。options是一个结构,里面有控制优化过程的各种参数,参考optimset()命令来设置,一般情况下我们不必改动它,即使用缺省设置就可以了。
例2:求函数
的最小值以及最小值点。
完成该计算的Matlab程序如下:
clear
fun1='sin(x)+cos(y)'
fun2='sin(x(1))+cos(x(2))'
ezmesh(fun1)
[X,fval]=fminsearch(fun2,[0,0])
X = -1.5708 3.1416
fval = -2.0000
其中语句ezmesh()是为了画出函数的图形,注意这里fun1和fun2的不同,考虑如果用相同的是否可行。
命令fminunc()的格式为:
X=fminunc(fun,X0)
[X,fval,exitflag,output,grad,hessian]=fminunc(fun,X0,options)
命令fminunc()通过计算寻找多变量目标函数fun的最小值,X0为优化的初始值,X为返回的变量的值,grad返回解点的梯度,hessian返回解点的汉森矩阵。其它参数的意义和命令fminsearch()相同。
例3:求函数
的最小值。
解:Matlab程序为
clear
fun='exp(x(1))*(2*x(1)^2+3*x(2)^2+2*x(1)*x(2)+3*x(2)+1)';
x0=[0,0];
options=optimset('largescale','off','display','iter','tolx',1e-8,'tolfun',1e-8);
[x,fval,exitflag,output,grad,hessian]=fminunc(fun,x0,options)
运行结果为:
|
Iteration |
Func-count |
f(x) |
Step-size |
Directional derivative |
|
1 |
2 |
1 |
0.2 |
-10 |
|
2 |
8 |
0.369471 |
0.134277 |
-0.0203 |
|
3 |
14 |
0.154419 |
0.459778 |
-0.0696 |
|
4 |
20 |
0.134704 |
0.746874 |
-2.28e-005 |
|
5 |
26 |
0.132961 |
0.63991 |
-1.1e-007 |
|
6 |
32 |
0.132961 |
0.897232 |
-7.32e-009 |
Optimization terminated successfully:
Current search direction is a descent direction, and magnitude of
directional derivative in search direction less than 2*options.TolFun
x = 0.2695 -0.5898
fval = 0.1330
exitflag = 1
output = iterations: 6
funcCount: 33
stepsize: 1.0000
firstorderopt: 1.6892e-005
algorithm: 'medium-scale: Quasi-Newton line search'
grad = 1.0e-004 * ( -0.1689, 0.0074)
hessian = 5.1110 2.6437
2.6437 8.0539
本例的程序对参数options进行了设置,'largescale','off',关闭了大规模方式,'display',用来控制计算过程的显示,'iter'表示显示优化过程的每次计算结果,'off'表示不显示所有输出,'final'仅输出最后结果,'tolx'用来控制输入变量x的允许误差精度,本例设置为1e-8,'tolfun'是控制目标函数的允许误差精度,缺省值是1e-4,本例为1e-8。
(三)有约束非线性多变量优化问题
由线性规划我们看到优化要处理各种约束条件,在非线性规划中问题就更加复杂,除了线性规划中的那些约束外,还要增加非线性约束。Matlab的命令函数fmincon()可以处理有约束的非线性多元函数的优化问题。
有约束多变量优化问题的数学模型为:求一组变量
,满足在给定的约束条件下,使目标函数
最小。目标函数一般为非线性函数,约束条件分为线性不等式约束、线性等式约束、变量边界约束和非线性约束几部分。除了非线性约束以外,表示方法与线性规划相同。函数fmincon()的具体格式为:
X=fmincon(fun,x0,A,b)
X=fmincon(fun,x0,A,b,Aeq,Beq,Lb,Ub)
X=fmincon(fun,x0,A,b,Aeq,Beq,Lb,Ub,nonlcon,options)
[X,fval,exitflag,output]=fmincon(fun,x0,…)
[X,fval,exitflag,output,lambda,grad,Hessian]=fmincon(fun,x0,…)
参数中fun为目标函数,x0为变量的初始值,x为返回的满足要求的变量的值。A和b表示线性不等式约束,Aeq,Beq表示线性等式约束,Lb和Ub分别为变量的下界和上界约束,nonlcon表示非线性约束条件,options为控制优化过程的优化参数向量。
返回值fval为目标函数。exitflag>0表示优化结果收敛于解,exitflag=0表示优化超过了函数值的计算次数,exitflag<0表示优化不收敛。lambda是拉格朗日乘子,显示那个约束条件有效。grad表示梯度,hessian表示汉森矩阵。
例4:求
,使得目标函数
在约束条件
,
下取得最小值。
我们设计的程序如下:
先把目标函数和约束条件分别编写成独立的m文件,注意,这样的m文件必须用function开头,并且文件名一定要和函数名一致。目标函数的文件为:
function f=objfun(x)
f=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
约束条件的文件为:
function [c,ceq]=confun(x)
c=[1.5+x(1)*x(2)-x(1)-x(2);-x(1)*x(2)-10]; %表示不等式非线性约束
ceq=[]; %表示等式非线性约束
接着,编写完成优化的程序如下:
clear
x0=[-1 1];
options=optimset('largescale','off','display','iter');
[x,fval,exitflag,output]=fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options)
运行结果为:
|
Iter |
F-count |
f(x) |
constraint |
max Step-size |
Directional derivative |
Procedure |
|
1 |
3 |
1.8394 |
0.5 |
1 |
0.0486 |
|
|
2 |
7 |
1.85127 |
-0.09197 |
1 |
-0.556 |
Hessian modified twice |
|
3 |
11 |
0.300167 |
9.33 |
1 |
0.17 |
|
|
4 |
15 |
0.529834 |
0.9209 |
1 |
-0.965 |
|
|
5 |
20 |
0.186965 |
-1.517 |
0.5 |
-0.168 |
|
|
6 |
24 |
0.0729085 |
0.3313 |
1 |
-0.0518 |
|
|
7 |
28 |
0.0353322 |
-0.03303 |
1 |
-0.0142 |
|
|
8 |
32 |
0.0235566 |
0.003184 |
1 |
-6.22e-006 |
|
|
9 |
36 |
0.0235504 |
9.032e-008 |
1 |
1.76e-010 |
Hessian modified |
Optimization terminated successfully:
Search direction less than 2*options.TolX and
maximum constraint violation is less than options.TolCon
Active Constraints:
1
2
x = -9.5474 1.0474
fval = 0.0236
exitflag = 1
output = iterations: 9
funcCount: 38
stepsize: 1
algorithm: 'medium-scale: SQP, Quasi-Newton, line-search'
firstorderopt: []
cgiterations: []
例5:在上例的基础上,再加上边界约束条件,即加上
,
,则我们仅需要修改上面的第三个程序为:
clear
x0=[-1 1];
lb=[0,0];
ub=[];
options=optimset('largescale','off','display','iter');
[x,fval,exitflag,output]=fmincon(@objfun,x0,[],[],[],[],lb,ub,@confun,options)
现在得到的结果为:
|
Iter |
F-count |
f(x) |
constraint |
max Step-size |
Directional derivative |
Procedure |
|
1 |
3 |
5.0009 |
0.5 |
1 |
3 |
|
|
2 |
7 |
8.5004 |
1.355e-020 |
1 |
-0.0004 |
|
|
3 |
11 |
8.5 |
3.04e-013 |
1 |
2.43e-012 |
Hessian modified |
Optimization terminated successfully:
Search direction less than 2*options.TolX and
maximum constraint violation is less than options.TolCon
Active Constraints:
1
3
x = 0 1.5000
fval = 8.5000
exitflag = 1
output = iterations: 3
funcCount: 13
stepsize: 1
algorithm: 'medium-scale: SQP, Quasi-Newton, line-search'
firstorderopt: []
cgiterations: []
三、实验内容
1.将例1中x的范围改为[-5,5]你将得到怎样的结果,你认为正确吗?应该如何解决?
2.求函数
的最小值。
3.在区间
上,求函数
的最小值。
4.求有约束的非线性优化问题:
![]()
约束条件为: 
5.求有约束的非线性优化问题:
![]()
约束条件为:
6.完成实验报告。