matlab优化工具箱的使用.docx
《matlab优化工具箱的使用.docx》由会员分享,可在线阅读,更多相关《matlab优化工具箱的使用.docx(23页珍藏版)》请在冰点文库上搜索。
matlab优化工具箱的使用
优化工具箱的使用
MATLAB的优化工具箱提供了各种优化函数,这些优化函数可以通过在命令行输入相应的函数名加以调用;此外为了使用方便,MATLAB还提供了图形界面的优化工具(
1GUI优化工具
1.1GUI优化工具的启动有两种启动方法:
(1)在命令行输入optimtool;
(2)在MATLAB主界面单击左下角的“Start”按钮,然后依次选择“
tool”
1.2GUI优化工具的界面
界面分为三大块:
左边(ProblemSetupandResults)为优化问题的描述及计算结果显示;
中间(Options)为优化选项的设置;
右边(QuickReferenee)为帮助。
为了界面的简洁,可以单击右上角"
示。
GUIOptimizationtool)。
ToolboxesOptimizationOptimization
<<”
>>”的按钮将帮助隐藏或显
1、优化问题的描述及计算结果显示
此板块主要包括选择求解器、目标函数描述、约束条件描述等部分。
选择合适的求解器以及恰当的优化算法,是进行优化问题求解的首要工作。
Solver:
选择优化问题的种类,每类优化问题对应不同的求解函数。
Algorithm:
选择算法,对于不同的求解函数,可用的算法也不同。
Problem框组用于描述优化问题,包括以下内容:
Objectivefunction:
输入目标函数。
Derivatives:
选择目标函数微分(或梯度)的计算方式。
Startpoint:
初始点。
Constraints框组用于描述约束条件,包括以下内容:
Linearinequalities:
线性不等式约束,其中A为约束系数矩阵,
Linearequalities:
线性等式约束,其中Aeq为约束系数矩阵,
Bounds:
自变量上下界约束。
NonlinearConstraintsfunction;非线性约束函数。
Derivatives:
非线性约束函数的微分(或梯度)的计算方式。
Runsolverandviewresults框组用于显示求解过程和结果。
(对于不同的优化问题类型,此板块可能会不同,这是因为各个求解函数需要的参数个数不一样,如Fminunc函数就没有Constraints框组。
)
b代表约束向量。
beq代表约束向量。
2、优化选项(Options)
Stoppingcriteria:
停止准则。
Functionvaluecheck:
函数值检查。
User-suppliedderivatives:
用户自定义微分(或梯度)。
Approximatedderivatives:
自适应微分(或梯度)
Algorithmsettings:
算法设置。
Inneriterationstoppingcriteria:
内迭代停止准则。
Plotfunction:
用户自定义绘图函数。
Outputfunction:
用户自定义输岀函数。
Displaytocommandwindow:
输岀到命令行窗口。
对于不同的优化问题类型,此板块也会不同,
3、帮助(QuickReferenee)
每选择一个函数求解器,帮助部分都有对这个函数的功能说明,同时还会给岀相应的各个输入项说明。
1.3GUI优化工具的使用步骤
(1)选择求解器Solver和优化算法。
(2)选定目标函数。
(3)设定目标函数的相关参数。
(4)设置优化选项。
(5)单击"Start"按钮,运行求解。
(6)查看求解器的状态和求解结果。
(7)将目标函数、选项和结果导入/导岀。
(在菜单文件中寻找)
1.4GUI优化工具的应用实例
1、无约束优化(fminunc求解器)
fminunc求解器可用的算法有两种:
Largescale(大规模算法)
Mediumscale(中等规模算法)
对于一般问题,采用中等规模算法即可。
2
例1:
用优化工具求fx=x,4x-6的极小值,初始点取x=o。
解:
首先在当前MATLAB的工作目录下建立目标函数文件Fununc1.m文件:
functiony=FunUnc1(x)%function必须为小写,如果f为大写则不行
y=xA2+4*x-6;%平方符号输入时用键盘上数字6上的符合,否则错误
然后启动优化工具:
在Solver下拉选框中选择fminunc;
Algorithm下拉选框中选择Mediumscale;
目标函数栏输入@FunUnc1;%运算时输入函数不知什么原因老有错误,直接输入目标函数却没有错
误
初始点输入0,其余参数默认;
单击“Start”按钮运行。
从求解结果可以看岀,函数的极小值为-10,且在x=-2时取到,而且从Currentiteration框可以看岀迭代的步
数。
对于函数形式比较简单的情况,可以直接输入目标函数,而不用建立目标函数文件,在目标函数栏中直接输
入@(x)xA2+4*x-6,也可求岀结果。
此题能否用进退法和黄金分割法(或二次插值法)求解吗?
不能,要用进退法或黄金分割法得自己先编程序,然后才能调用这样的函数。
2、无约束优化(fminsearch求解器)
fminsearch求解器也可用来求解无约束优化问题,它有时候能求解fminunc不能解决的问题。
例2:
用优化工具求f(X)=X-3x^2的极小值,初始点取x=-7,比较fminunc和fminsearch求岀的结
果。
解:
通过数学计算,可以得到本例中的极小点有两个x1=1,x2=2。
启动优化工具:
在Solver下拉选框中选择fminunc;
Algorithm下拉选框中选择Mediumscale;
目标函数栏输入@(x)abs(xA2-3*x+2);
初始点输入-7,其余参数默认;
单击“Start”按钮运行。
Fminunc求得的结果为x=1.5,显然数值不对,它是未加绝对值时函数fx=X2—3x2的极小值。
然后在Solver下拉选框中选择fminsearch;
Algorithm下拉选框中选择Mediumscale;
目标函数栏输入@(x)abs(xA2-3*x+2);
初始点输入-7,其余参数默认;
单击“Start”按钮运行。
fminsearch求得的结果为x=2,显然数值是对的。
可为什么不能求岀数值x=1呢,因为此时的函数值也是最小
的。
由此可得结论:
对于非光滑优化问题Fminunc可能求不到正确的结果,而fminsearch却能很好地胜任这类问
题的求解。
2MATLAB优化工具箱在一维优化问题中的应用
2.1应用fminbnd函数
在MATLAB中,fminbnd函数可用来求解一维优化问题,其调用格式为:
(1)x=fminbnd(fun,x1,x2);%求函数fun在区间(x1,x2)上的极小值对应的自变量值。
(2)x=fminbnd(fun,x1,x2,options);%按options结构指定的优化参数求函数fun在区间(x1,x2)上的极小值
对应的自变量值,而options结构的参数可以通过函数optimset来设置,其中options结构中的字段如下:
Display设置结果的显示方式:
off不显示任何结果;iter显示每步迭代后的结果;final只显示最后的结果;notify—
—只有当求解不收敛的时候才显示结果。
FunValCheck检查目标函数值是否可接受:
On――当目标函数值为复数或NaN时显示岀错信息;
Off不显示任何错误信息。
MaxFunEvals最大的目标函数检查步数。
MaxIter最大的迭代步数。
OutputFcn――用户自定义的输岀函数,它将在每个迭代步调用。
PlotFcns――用户自定义的绘图函数。
TolX――自变量的精度。
(3)[x,fval]=fminbnd(...);%此格式中的输岀参数fval返回目标函数的极小值。
(4)[x,fval,exitflag]=fminbnd(...);%此格式中的输岀参数exitflag返回函数fminbnd的求解状态(成功或
失败),说明如下:
exitflag=1fminbnd成功求得最优解,且解的精度为TolX;
exitflag=0由于目标函数检查步数达到最大或迭代步数达到最大值而推岀。
exitflag=-1用户自定义函数引起的退岀。
exitflag=-2边界条件不协调(x1>x2)。
(5)[x,fval,exitflag,output]=fminbnd(...);%此格式中的输岀参数output返回函数fminbnd的求解信息(迭
代次数、所用算法等),说明如下:
output结构中的字段:
output.algorithm:
优化算法
output.iterations:
优化迭代步数
output.funcCount:
目标函数检查步数
output.message:
退岀信息
例1:
用fminbnd求函数fx=X°-X2'XT在区间[-2,1]上的极小值。
解:
在MATLAB命令窗口输入
>>[x,fval,exitflag,output]=fminbnd(xA4-xA2+x-1'2,1)
所得结果为
x=-0.8846fval=-2.0548
exitflag=1
迭代次数为11次
函数计算了12次
output=iterations:
11%
funcCount:
12%
fminbnd用了黄金分割法和
algorithm:
'goldensectionsearch,parabolicinterpolation'%抛物线算法求本例函数的极小值
message:
[1x112char]
要查看结果的精度,可以接着在MATLAB命令窗口中输入
>>output.message
可得如下信息
ans=Optimizationterminated:
thecurrentxsatisfiestheterminationcriteriausingOPTIONS.TolXof1.000000e-004
说明求得结果的精度为1.0e-4,如果想提高精度,可以通过option结构来指定,在MATLAB命令窗口输入
>>opt=optimset(‘TolX',1.0e-6);
>>formatlong;
>>[x,fval,exitflag,output]=fminbnd(‘xA4-xA2+x-1',-2,1,opt)
所得结果为
exitflag=1
output=iterations:
11
funcCount:
12
algorithm:
'goldensectionsearch,parabolicinterpolation'
message:
[1x112char]
这样求得的结果x就有了1.0e-6的精度。
为了理解fminbnd的求解原理,将每一步的迭代过程打印出来,在MATLAB命令窗口中输入>>opt=optimset(‘display','iter');
>>[x,fval,exitflag,output]=fminbnd(‘xA4-xA2+x-1',-2,1,opt)
所得结果为
1
-0.854102
-2.05144
initial
2
-0.145898
-1.16673
golden
3
-1.2918
-1.17585
golden
4
-0.72025
-1.9699
parabolic
5
-0.853884
-2.05139
parabolic
6
-0.890887
-2.05464
parabolic
7
-1.04402
-1.94595
golden
8
-0.884922
-2.05478
parabolic
9
-0.88455
-2.05478
parabolic
10
-0.884647
-2.05478
parabolic
11
-0.884613
-2.05478
parabolic
12
-0.88468
-2.05478
parabolic
Optimizationterminated:
thecurrentxsatisfiestheterminationcriteriausingOPTIONS.ToIXof1.000000e-004
exitflag=1
output=iterations:
11
funcCount:
12
algorithm:
'goldensectionsearch,parabolicinterpolation'
message:
[1x112char]
分析迭代过程可发现,fminbnd首先产生一个迭代的初始点,经过简单的计算可以发现,这个初始点是区间
的黄金分割点(-0.854=-2+(1-0.618)*(1+2)),接着再用黄金分割法迭代,直到相连两步迭代得到的f(x)
相差不大时,此时用二次插值法迭代一步,如果用二次插值法得到的估计点可以接受的话(和前次黄金分割
法得到的f(x)相差不大),则再用二次插值法迭代,如果相连两次二次插值法迭代得到的f(x)相差不大,且自
变量的差别很小,则继续直到满足精度要求,否则换用黄金分割法。
例2:
用fminbnd求函数fx二e,xsinx在区间[-10,10]上的极小值。
解:
在MATLAB命令窗口中输入
>>[x,fval,exitflag]=fminbnd(exp(-xA2)*(x+sin(x))'-10,10)
所得结果为
x=-0.6796
fval=-0.8242exitflag=
函数fx二xsinx在区间[-10,10]上的图形如图所示,在此区间上函数有两个极值点,一个极大值,一个极小值,函数fminbnd成功求得极小值点。
例3:
用fminbnd求函数fx二sin(2x1)-3sin(4x•3)-5sin(6x•5)在区间[-4,4]上的极小值
解:
在MATLAB命令窗口中输入
>>[x,fval]=fminbnd(Sin(2*x+1)+3*sin(4*x+3)+5*sin(6*x+5)'-4,4)
所得结果为
x=-1.1082
fval=-8.8940
若在MATLAB命令窗口中输入
>>[x,fval,exitflag]=fminbnd(sin(2*x+1)+3*sin(4*x+3)+5*sin(6*x+5)',-4,4)
x=-1.1082
fval=-8.8940
exitflag=1
111
2—2—2
(x-2)33(x-5)42(x-1)1
解:
在MATLAB命令窗口中输入
>>[x,fval]=fminbnd(-1/((x-2)A2+3)-1/(3*(x-5)A2+4)-1/(2*(x-1)A2+1)',-8,8)
所得结果为
x=1.0337
fval=-1.2715
例5:
用fminbnd求函数f(x)二x+1+x2+x-2在区间[-2,2]上的极小值
解:
在MATLAB命令窗口中输入
>>[x,fval]=fminbnd(abs(x+1)+xA2+x-2'-2,2)
所得结果为
x=-1.0000fval=-2.00002.2应用fminsearch函数
fminsearch函数的主要功能是求多变量的极值问题,当然也就可以求单变量极值问题。
例:
用fminsearch函数求函数fx=X4-X2'X-1的极小值。
解:
在MATLAB命令窗口中输入
>>[x,fval,exitflag,output]=fminsearch(xA4-xA2+x-1'
所得结果为
x=-0.8846
fval=-2.0548
exitflag=1
output=iterations:
24
funcCount:
48
algorithm:
'Nelder-Meadsimplexdirectsearch'
message:
[1x196char]
3MATLAB优化工具箱在无约束优化问题中的应用
3.1应用fminsearch函数
在MATLAB中,fminsearch函数可用来求解无约束多维极值问题,其调用格式为
(1)x=fminsearch(fun,x0):
从起始点x0岀发,求岀fun的一个局部极小点;
(2)x=fminsearch(fun,x0,options):
按options结构指定的优化参数求函数fun的极小点,而options结构的参
数可以通过函数optimset来设置,options结构中的各个字段及其含义如表所示;
字段
说明
Display
设置结果的显示方式:
off不显示任何结果;iter显示每步迭代后的结果;final
只显示取后的结果;notify只有当求解不收敛的时候才显示结果。
FunValCheck
检查目标函数值是否可接受:
On――当目标函数值为复数或NaN时显示岀错信息;
Off不显示任何错误信息。
MaxFunEvals
最大的目标函数检查步数
MaxIter
最大的迭代步数
OutputFcn
用户自定义的输岀函数,它将在每个迭代步调用
PlotFcns
用户自定义的绘图函数,它将在每个迭代步调用
TolFun
目标函数值的精度
TolX
自变量的精度。
(3)[x,fval]=fminsearch(…):
此格式中的输岀参数fval返回目标函数的极小值。
(4)[x,fval,exitflag]=fminsearch(…):
此格式中的输岀参数exitflag返回函数fminsearch的求解状态(成功或
失败),其取值如表所示。
exitflag
说明
1
fminbnd成功求得最优解,且解的精度为TolX
0
由于目标函数检查步数达到最大或迭代步数达到最大值而退岀。
-1
用户自定义函数引起的退岀
(5)[x,fval,exitflag,output]=fminsearch(…):
此格式中的输岀参数output返回函数fminsearch的求解信息(迭
代次数、所用算法等),其字段及其含义如表所示:
output.algorithm
优化算法
output.iterations
优化迭代步数
output.funcCount
目标函数检查步数
output.message
退出信息
Output结构中的字段
说明
例1:
用fminsearch函数求解无约束多维函数
fxi;=sinx1•sinx2的极小值
解:
在MATLAB命令窗口中输入
>>fx=@(x)sin(x
(1))+sin(x
(2));
>>[xv,fv]=fminsearch(fx,[0,0])
所得结果为
xv=-1.5708-1.5708
fv=-2.0000
%建立函数
例2:
用fminsearch函数求解无约束多维函数
11
2_2
%-2i亠32x21-5
的极小值
解:
显然,上式的极值点为(2,-1),最小值为-2/15。
在MATLAB命令窗口中输入
>>fx=@(x)-1/((x
(1)-2)A2+3)-1/(2*(x
(2)+1)A2-5);
>>[xv,fv]=fminsearch(fx,[0,0])
所得结果为
xv=2.0000-1.0000
fv=-0.1333
为了看清楚fminsearch函数的单纯型搜索过程,采用optimset函数设置options结构,将display字段设为iter,
以显示每次迭代的信息。
在MATLAB命令窗口中输入
>>opt=optimset('display','iter');
>>[xv,fv]=fminsearch(fx,[0,0],opt)
所得结果为
IterationFunc-countminf(x)Procedure
010.190476
0.190456
initialsimplex%
初始单纯型
2
5
0.190224
expand%
扩展
3
7
0.190067
expand
4
9
0.189526
expand
5
11
0.188944
expand
6
13
0.187583
expand
7
15
0.185763
expand
8
17
0.182219
expand
9
19
0.177002
expand
10
21
0.167918
expand
11
23
0.154383
expand
12
25
0.13326
expand
13
27
0.103875
expand
14
29
0.0643404
expand
15
31
0.0157881
expand
16
33
-0.0384754
expand
17
35
-0.0567264
reflect%
反射
18
36
-0.0567264
reflect
19
38
-0.0567264
contractinside%
压缩
20
40
-0.0594596
contractinside
21
41
-0.0594596
reflect
22
43
-0.0599578
contractinside
23
45
-0.0599653
contractoutside
24
47
-0.0601014
contractinside
25
49
-0.0601014
contractinside
26
51
-0.0601903
reflect
27
53
-0.0601903
contractinside
28
55
-0.0603234
expand
29
57
-0.0604675
expand
30
59
-0.0607257
expand
31
61
-0.0612865
ex