MATLAB的优化工具箱提供了各种优化函数,这些优化函数可以通过在命令行输入相应的函数名加以调用;此外为了使用方便,MATLAB还提供了图形界面的优化工具(GUI Optimization tool)。
1 GUI优化工具 1.1 GUI优化工具的启动
有两种启动方法:
(1)在命令行输入optimtool;
(2)在MATLAB主界面单击左下角的“Start”按钮,然后依次选择“Toolboxes→Optimization→Optimization tool”
1.2 GUI优化工具的界面
界面分为三大块:
左边(Problem Setup and Results)为优化问题的描述及计算结果显示; 中间(Options)为优化选项的设置;
右边(Quick Reference)为帮助。为了界面的简洁,可以单击右上角“<<”、“>>”的按钮将帮助隐藏或显示。
1、优化问题的描述及计算结果显示
此板块主要包括选择求解器、目标函数描述、约束条件描述等部分。
选择合适的求解器以及恰当的优化算法,是进行优化问题求解的首要工作。 Solver:选择优化问题的种类,每类优化问题对应不同的求解函数。 Algorithm:选择算法,对于不同的求解函数,可用的算法也不同。 Problem框组用于描述优化问题,包括以下内容: Objective function: 输入目标函数。
Derivatives: 选择目标函数微分(或梯度)的计算方式。 Start point: 初始点。
Constraints框组用于描述约束条件,包括以下内容:
Linear inequalities: 线性不等式约束,其中A为约束系数矩阵,b代表约束向量。 Linear equalities: 线性等式约束,其中Aeq为约束系数矩阵,beq代表约束向量。 Bounds: 自变量上下界约束。
Nonlinear Constraints function; 非线性约束函数。
Derivatives: 非线性约束函数的微分(或梯度)的计算方式。 Run solver and view results框组用于显示求解过程和结果。
(对于不同的优化问题类型,此板块可能会不同,这是因为各个求解函数需要的参数个数不一样,如Fminunc函数就没有Constraints框组。)
2、优化选项(Options)
Stopping criteria: 停止准则。
1
Function value check: 函数值检查。
User-supplied derivatives: 用户自定义微分(或梯度)。 Approximated derivatives: 自适应微分(或梯度)。 Algorithm settings: 算法设置。
Inner iteration stopping criteria: 内迭代停止准则。
Plot function: 用户自定义绘图函数。 Output function: 用户自定义输出函数。
Display to command window: 输出到命令行窗口。
对于不同的优化问题类型,此板块也会不同,
3、帮助(Quick Reference)
每选择一个函数求解器,帮助部分都有对这个函数的功能说明,同时还会给出相应的各个输入项说明。
1.3 GUI优化工具的使用步骤
(1)选择求解器Solver和优化算法。 (2)选定目标函数。
(3)设定目标函数的相关参数。 (4)设置优化选项。
(5)单击“Start”按钮,运行求解。 (6)查看求解器的状态和求解结果。
(7)将目标函数、选项和结果导入/导出。(在菜单文件中寻找)
1.4 GUI优化工具的应用实例
1、无约束优化(fminunc求解器)
fminunc求解器可用的算法有两种: Large scale(大规模算法) Medium scale(中等规模算法) 对于一般问题,采用中等规模算法即可。
例1:用优化工具求fxx4x6的极小值,初始点取x=0。
2解:首先在当前MATLAB的工作目录下建立目标函数文件Fununc1.m文件:
function y= FunUnc1(x) % function必须为小写,如果F为大写则不行
2
y=x^2+4*x-6; %平方符号输入时用键盘上数字6上的符合,否则错误 然后启动优化工具:
在Solver下拉选框中选择fminunc; Algorithm下拉选框中选择Medium scale;
目标函数栏输入@FunUnc1; %运算时输入函数不知什么原因老有错误,直接输入目标函数却没有错误 初始点输入0,其余参数默认; 单击“Start”按钮运行。
从求解结果可以看出,函数的极小值为-10,且在x=-2时取到,而且从Current iteration框可以看出迭代的步数。
对于函数形式比较简单的情况,可以直接输入目标函数,而不用建立目标函数文件,在目标函数栏中直接输入@(x)x^2+4*x-6,也可求出结果。
此题能否用进退法和黄金分割法(或二次插值法)求解吗?
不能,要用进退法或黄金分割法得自己先编程序,然后才能调用这样的函数。
2、无约束优化(fminsearch求解器)
fminsearch求解器也可用来求解无约束优化问题,它有时候能求解fminunc不能解决的问题。
2例2:用优化工具求fxx3x2的极小值,初始点取x=-7,比较fminunc和fminsearch求出的结果。
解:通过数学计算,可以得到本例中的极小点有两个x1=1,x2=2。 启动优化工具:
在Solver下拉选框中选择fminunc; Algorithm下拉选框中选择Medium scale; 目标函数栏输入@(x)abs(x^2-3*x+2); 初始点输入-7,其余参数默认; 单击“Start”按钮运行。
Fminunc求得的结果为x=1.5,显然数值不对,它是未加绝对值时函数fxx3x2的极小值。
2 然后在Solver下拉选框中选择fminsearch; Algorithm下拉选框中选择Medium scale; 目标函数栏输入@(x)abs(x^2-3*x+2); 初始点输入-7,其余参数默认; 单击“Start”按钮运行。
fminsearch求得的结果为x=2,显然数值是对的。可为什么不能求出数值x=1呢,因为此时的函数值也是最小的。
3
由此可得结论:对于非光滑优化问题Fminunc可能求不到正确的结果,而fminsearch却能很好地胜任这类问题的求解。
2 MATLAB优化工具箱在一维优化问题中的应用 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=1——fminbnd成功求得最优解,且解的精度为TolX;
exitflag=0——由于目标函数检查步数达到最大或迭代步数达到最大值而推出。 exitflag=-1——用户自定义函数引起的退出。 exitflag=-2——边界条件不协调(x1>x2)。
(5)[x,fval,exitflag,output]= fminbnd(...); %此格式中的输出参数output返回函数fminbnd的求解信息(迭代次数、所用算法等),说明如下: output结构中的字段: output.algorithm: 优化算法 output.iterations: 优化迭代步数
4
output.funcCount: 目标函数检查步数 output.message: 退出信息
例1:用fminbnd求函数fxx4x2x1在区间[-2,1]上的极小值。 解:在MATLAB命令窗口输入
>>[x,fval,exitflag,output]= fminbnd(‘x^4-x^2+x-1’,-2,1) 所得结果为 x =-0.8846 fval =-2.08 exitflag =1
output = iterations: 11 %迭代次数为11次 funcCount: 12 %函数计算了12次
algorithm: 'golden section search, parabolic interpolation' % fminbnd用了黄金分割法和抛物线算法求本例函数的极小值 message: [1x112 char]
要查看结果的精度,可以接着在MATLAB命令窗口中输入 >> output.message 可得如下信息
ans =Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-004
说明求得结果的精度为1.0e-4,如果想提高精度,可以通过option结构来指定,在MATLAB命令窗口输入 >>opt=optimset(‘TolX’,1.0e-6); >>format long;
>>[x,fval,exitflag,output]= fminbnd(‘x^4-x^2+x-1’,-2,1,opt) 所得结果为
x = -0.88461474752 fval = -2.0784062185396 exitflag = 1
output = iterations: 11 funcCount: 12
algorithm: 'golden section search, parabolic interpolation'
5
message: [1x112 char]
这样求得的结果x就有了1.0e-6的精度。
为了理解fminbnd的求解原理,将每一步的迭代过程打印出来,在MATLAB命令窗口中输入 >> opt=optimset(‘display’,’iter’);
>>[x,fval,exitflag,output]= fminbnd(‘x^4-x^2+x-1’,-2,1,opt) 所得结果为
Func-count x f(x) Procedure 1 -0.8102 -2.05144 initial 2 -0.1458 -1.16673 golden 3 -1.2918 -1.17585 golden 4 -0.72025 -1.9699 parabolic 5 -0.853884 -2.05139 parabolic 6 -0.0887 -2.0 parabolic 7 -1.04402 -1.94595 golden 8 -0.884922 -2.078 parabolic 9 -0.88455 -2.078 parabolic 10 -0.8847 -2.078 parabolic 11 -0.884613 -2.078 parabolic 12 -0.88468 -2.078 parabolic Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-004 x = -0.88467002413 fval = -2.0784062184385 exitflag = 1
output = iterations: 11 funcCount: 12
algorithm: 'golden section search, parabolic interpolation' message: [1x112 char]
分析迭代过程可发现,fminbnd首先产生一个迭代的初始点,经过简单的计算可以发现,这个初始点是区间的黄金分割点(-0.8=-2+(1-0.618)*(1+2)),接着再用黄金分割法迭代,直到相连两步迭代得到的f(x)相差不大时,此时用二次插值法迭代一步,如果用二次插值法得到的估计点可以接受的话(和前次黄金分割法得到的f(x)相差不大),则再用二次插值法迭代,如果相连两次二次插值法迭代得到的f(x)相差不大,且自变量
6
的差别很小,则继续直到满足精度要求,否则换用黄金分割法。
x例2:用fminbnd求函数fxe2xsinx在区间[-10,10]上的极小值。
解:在MATLAB命令窗口中输入
>>[x,fval,exitflag]= fminbnd(‘exp(-x^2)*(x+sin(x))’,-10,10) 所得结果为 x = -0.6796 fval = -0.8242 exitflag = 1
x函数fxe2xsinx在区间[-10,10]上的图形如图所示,在此区间上函数有两个极值点,一个极大值,
一个极小值,函数fminbnd成功求得极小值点。
例3:用fminbnd求函数fxsin(2x1)3sin(4x3)5sin(6x5)在区间[-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.40
若在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.40 exitflag =1
例4:用fminbnd求函数fx111在区间[-8,8]上的极小值。 222(x2)33(x5)42(x1)1解:在MATLAB命令窗口中输入
>>[x,fval]= fminbnd(‘-1/((x-2)^2+3)-1/(3*(x-5)^2+4)-1/(2*(x-1)^2+1)’,-8,8) 所得结果为 x =1.0337 fval =-1.2715
例5:用fminbnd求函数fxx1xx2在区间[-2,2]上的极小值。
2 7
解:在MATLAB命令窗口中输入
>>[x,fval]= fminbnd(‘abs(x+1)+x^2+x-2’,-2,2) 所得结果为 x =-1.0000 fval =-2.0000
2.2 应用fminsearch函数
fminsearch函数的主要功能是求多变量的极值问题,当然也就可以求单变量极值问题。 例:用fminsearch函数求函数fxx4x2x1的极小值。 解:在MATLAB命令窗口中输入
>>[x,fval,exitflag,output]= fminsearch(‘x^4-x^2+x-1’,0) 所得结果为 x =-0.8846 fval =-2.08 exitflag =1
output =iterations: 24 funcCount: 48
algorithm: 'Nelder-Mead simplex direct search' message: [1x196 char]
3 MATLAB优化工具箱在无约束优化问题中的应用 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——只有当求解不收敛的时候才显示结果。 检查目标函数值是否可接受:On——当目标函数值为复数或NaN时显示出错信息; Off——不显示任何错误信息。 8 FunValCheck MaxFunEvals MaxIter OutputFcn PlotFcns TolFun TolX 最大的目标函数检查步数 最大的迭代步数 用户自定义的输出函数,它将在每个迭代步调用 用户自定义的绘图函数,它将在每个迭代步调用 目标函数值的精度 自变量的精度。
(3)[x,fval]= fminsearch(…):此格式中的输出参数fval返回目标函数的极小值。
(4)[x,fval,exitflag]= fminsearch(…):此格式中的输出参数exitflag返回函数fminsearch的求解状态(成功或失败),其取值如表所示。 exitflag 1 0 -1 说 明 fminbnd成功求得最优解,且解的精度为TolX 由于目标函数检查步数达到最大或迭代步数达到最大值而退出。 用户自定义函数引起的退出 (5)[x,fval,exitflag,output]= fminsearch(…):此格式中的输出参数output返回函数fminsearch的求解信息(迭代次数、所用算法等),其字段及其含义如表所示: Output结构中的字段 output.algorithm output.iterations output.funcCount output.message 例1:用fminsearch函数求解无约束函数fxsinx1sinx2的极小值。 解:在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函数求解无约束函数fx优化算法 优化迭代步数 目标函数检查步数 退出信息 说明 1x12232x21512的极小值。
解:显然,上式的极值点为(2,-1),最小值为-2/15。 在MATLAB命令窗口中输入
9
>>fx=@(x)-1/((x(1)-2)^2+3)-1/(2*(x(2)+1)^2-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) 所得结果为
Iteration Func-count min f(x) Procedure 0 1 0.190476
1 3 0.190456 initial simplex % 2 5 0.190224 expand % 3 7 0.190067 expand 4 9 0.1526 expand 5 11 0.1844 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.1383 expand 12 25 0.13326 expand 13 27 0.103875 expand 14 29 0.03404 expand 15 31 0.0157881 expand 16 33 -0.03847 expand
17 35 -0.05672 reflect % 18 36 -0.05672 reflect
19 38 -0.05672 contract inside % 20 40 -0.0594596 contract inside 21 41 -0.0594596 reflect
22 43 -0.0599578 contract inside 23 45 -0.0599653 contract outside 24 47 -0.0601014 contract inside 25 49 -0.0601014 contract inside 26 51 -0.0601903 reflect
27 53 -0.0601903 contract inside 28 55 -0.0603234 expand 29 57 -0.0604675 expand 30 59 -0.0607257 expand
10
初始单纯型 扩展 反射 压缩 31 61 -0.0612865 expand 32 63 -0.0617259 expand 33 65 -0.0635127 expand 34 66 -0.0635127 reflect 35 68 -0.0673697 expand 36 69 -0.0673697 reflect 37 71 -0.0740469 expand 38 73 -0.0780703 expand 39 75 -0.09288 expand 40 77 -0.10392 expand 41 79 -0.127078 expand 42 81 -0.130651 reflect 43 82 -0.130651 reflect
44 84 -0.131814 contract inside 45 86 -0.133102 contract inside 46 88 -0.133102 contract inside 47 90 -0.133204 reflect
48 92 -0.133204 contract inside 49 94 -0.13329 contract inside 50 96 -0.133326 contract inside 51 98 -0.133326 contract inside 52 100 -0.133326 contract outside 53 102 -0.133328 contract inside 104 -0.133331 contract outside 55 106 -0.133332 contract inside 56 108 -0.133333 contract inside 57 110 -0.133333 contract outside 58 112 -0.133333 contract inside 59 114 -0.133333 contract inside 60 116 -0.133333 contract inside 61 118 -0.133333 contract inside 62 120 -0.133333 contract inside 63 121 -0.133333 reflect
123 -0.133333 contract inside 65 125 -0.133333 contract outside 66 127 -0.133333 contract inside 67 129 -0.133333 contract inside 68 131 -0.133333 contract inside 69 133 -0.133333 reflect
70 135 -0.133333 contract inside Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-004 and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e-004 xv =2.0000 -1.0000
11
fv =-0.1333
从迭代过程可看出,经过多次扩展、反射、压缩过程,才求得极小值。为了得到每一步优化得到的x值,通过建立相应的m文件可实现。
例3:用fminsearch函数求解无约束函数fxx111x2的极小值。 x1x2解:显然,上式的最小值为4,极值点为(1,1)。 在MATLAB命令窗口中输入
>>fx=@(x)x(1)+1/x(1)+x(2)+1/x(2); %建立函数 >>[xv,fv]=fminsearch(fx,[2,3]) 所得结果为
xv =1.0000 1.0000 fv =4.0000
fminsearch用的算法是单纯形搜索法,由于不需要计算梯度,因此fminsearch函数的运算速度很快,常见的函
数都能立即求出极小值。
3.2 应用fminunc函数
fminunc函数也能求无约束极值问题。常用的调用格式为:
(1)x=fminunc(fun,x0):表示从起始点x0出发,求出fun的一个局部极小点。
(2)x=fminunc(fun,x0,options):按options结构指定的优化参数求函数的极小点,而options结构的参数通过函数optimset来设置,options结构和fminsearch函数一样。
(3)x=fminunc(problem):所需求解的极值问题及选项通过problem结构指定,其字段及其含义如表所示: 字段 objective x0 solver options 说明 目标函数 初始点 求解方法,‘fminunc’ options结构 (4)[x,fval]=fminunc(...):输出参数fval返回目标函数的极小值;
(5)[x,fval,exitflag]=fminunc(...):输出参数exitflag返回函数fminunc的求解状态(成功或失败); (6)[x,fval,exitflag,output]=fminunc(...):输出参数output返回函数fminunc的求解信息(迭代次数,所用
算法等);
12
(7)[x,fval,exitflag,output,grad]=fminunc(...):输出参数grad返回函数fun在极小点x处的梯度。 (8)[x,fval,exitflag,output,grad,hessian]=fminunc(...):输出参数hessian返回函数fun在极小点x处的海森矩阵。
例1:用fminunc函数求解无约束函数fx1x12232x21512的极小值。
解:在MATLAB命令窗口中输入
>> fx=@(x)-1/((x(1)-2)^2+3)-1/(2*(x(2)+1)^2-5);
>>pro.objective=fx; %此处用的是problem结构来求解极值。 >>pro.x0=[0,0]; >>pro.solver=’fminunc’;
>>pro.options=optimset(‘Display’,’iter’)
>>[xv,fv,exitflag,output,grad,hess]=fminunc(pro) 所得结果为
Warning: Gradient must be provided for trust-region method; using line-search method instead. > In fminunc at 265
First-order Iteration Func-count f(x) Step-size optimality 0 3 0.190476 0.444 1 6 0.0784714 1 0.116 2 9 0.0482623 1 0.0945 3 12 -0.0532145 1 0.124 4 18 -0.0761872 0.405817 0.162 5 21 -0.09662 1 0.105 6 24 -0.128396 1 0.0394 7 27 -0.1326 1 0.0141 8 30 -0.133331 1 0.000826 9 33 -0.133333 1 5.13e-006 10 36 -0.133333 1 9.31e-009 Optimization terminated: relative infinity-norm of gradient less than options.TolFun. Computing finite-difference Hessian using user-supplied objective function. xv =2.0000 -1.0000 fv =-0.1333 exitflag = 1
13
output = iterations: 10 funcCount: 36 stepsize: 1
firstorderopt: 9.3132e-009
algorithm: 'medium-scale: Quasi-Newton line search'
message: 'Optimization terminated: relative infinity-norm of gradient less than options.TolFun.' grad = 1.0e-008 * -0.9313 0.1863
hess = 0.2222 0 0 0.1600
注意一开始出现的Warning,fminunc会根据输入自动选择合适的算法,当用户没有提供梯度矩阵的时候,fminunc采用线性搜索算法,而且从后面的输出结果可以得知fminunc求解此题用的是拟牛顿法,当用户提供梯度矩阵的时候,fminunc采用信赖域算法。
和上面用fminsearch函数的求解相比,求解同样问题fminunc用的迭代步数少得多。从输出的梯度矩阵近似为0可以得出[2,-1]是函数的驻点,而再根据海森矩阵的元素特点:对角元素都大于0,非对角元素为0,则可知[2,-1]确实是一个极小值点。
4 MATLAB优化工具箱在线性优化问题中的应用
例1:用linprog函数求解线性规划问题:
minfX4x1x2x12x242x3x122s..t1x1x23x1,x20
解:在MATLAB命令窗口中输入 >> f=[-4;-1]; >> A=[-1 2;2 3;1 -1]; >> b=[4;12;3];
>> [x,fval,exitflag,output,lamda]=linprog(f,A,b,[],[],zeros(2,1)) 所得结果为
Optimization terminated. x = 4.2000 1.2000
14
fval = -18.0000 exitflag = 1
output = iterations: 5
algorithm: 'large-scale: interior point' cgiterations: 0
message: 'Optimization terminated.' lamda = ineqlin: [3x1 double] eqlin: [0x1 double] upper: [2x1 double] lower: [2x1 double]
例2:用linprog函数求解线性规划问题:
5 MATLAB优化工具箱在约束优化问题中的应用
15
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- dfix.cn 版权所有 湘ICP备2024080961号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务