实验十五  用MATLAB求解非线性优化问题

 

一、实验目的

了解Matlab的优化工具箱,利用Matlab求解非线性优化问题。

 

二、相关知识

非线性优化包括相当丰富的内容,我们这里就Matlab提供的一些函数来介绍相关函数的用法及其所能解决的问题。

(一)非线性一元函数的最小值

Matlab函数为fminbnd(),其使用格式为:

X=fminbnd(fun,x1,x2)

[X,fval,exitflag,output]= fminbnd(fun,x1,x2)

其中:fun为目标函数,x1x2为变量的边界约束,即x1xx2X为返回的满足fun取得最小值的x的值,而fval则为此时的目标函数值。exitflag>0表示计算收敛,exitflag=0表示超过了最大的迭代次数,exitflag<0表示计算不收敛,返回值output3个分量,其中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值,X0x的初始值,fval为返回的函数值,exitflag=1表示优化结果收敛,exitflag=0表示超过了最大迭代次数。返回值output3个分量,其中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()是为了画出函数的图形,注意这里fun1fun2的不同,考虑如果用相同的是否可行。

命令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为返回的满足要求的变量的值。Ab表示线性不等式约束,AeqBeq表示线性等式约束,LbUb分别为变量的下界和上界约束,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.将例1x的范围改为[-5,5]你将得到怎样的结果,你认为正确吗?应该如何解决?

2.求函数的最小值。

3.在区间上,求函数的最小值。

4.求有约束的非线性优化问题:

       

约束条件为: 

5.求有约束的非线性优化问题:

              

约束条件为:

6.完成实验报告。