这个例子说明了如何gydF4y2BaGlobalSearchgydF4y2Ba
如何有效地找到全局最小值gydF4y2BaMultiStartgydF4y2Ba
找到更多的局部极小值。gydF4y2Ba
这个例子的目标函数有许多局部极小值和一个唯一的全局极小值。在极坐标下,函数是gydF4y2Ba
fgydF4y2Ba(gydF4y2BargydF4y2Ba,gydF4y2BatgydF4y2Ba) =gydF4y2BaggydF4y2Ba(gydF4y2BargydF4y2Ba)gydF4y2BahgydF4y2Ba(gydF4y2BatgydF4y2Ba),gydF4y2Ba
在哪里gydF4y2Ba
全局最小值是atgydF4y2BargydF4y2Ba= 0gydF4y2Ba,具有目标函数0.功能gydF4y2BaggydF4y2Ba(gydF4y2BargydF4y2Ba)大致线性地增长gydF4y2BargydF4y2Ba,重复锯齿形状。功能gydF4y2BahgydF4y2Ba(gydF4y2BatgydF4y2Ba)有两个局部极小值,其中一个是全局极小值。gydF4y2Ba
编写一个函数文件来计算目标:gydF4y2Ba
函数f = sawtoothxy(x,y) [t r] = cart2pol(x,y);h = cos(2*t - 1/2)/2 + cos(t) + 2;g = (sin (r) -罪(2 * r) / 2 +罪(3 * r) / 3 -罪(4 * r) / 4 + 4)…。* r。^ 2. / (r + 1);f = g。* h;结束gydF4y2Ba
创建问题结构。使用gydF4y2Ba'SQP'gydF4y2Ba
算法gydF4y2BafmincongydF4y2Ba
:gydF4y2Ba
问题= createOptimProblem(“fmincon”,…“客观”,@ (x) sawtoothxy (x(1),(2)),…x0,(100、-50),“选项”,…optimoptions (@fmincon、“算法”、“sqp”,“显示”,“关闭”));gydF4y2Ba
起点是gydF4y2Ba(100、-50)gydF4y2Ba
而不是gydF4y2Ba[0,0]gydF4y2Ba
,所以gydF4y2BaGlobalSearchgydF4y2Ba
并不是从全球解决方案开始。gydF4y2Ba
通过运行验证问题结构gydF4y2BafmincongydF4y2Ba
:gydF4y2Ba
[x,fval] = fmincon(问题)x = 45.7332 -107.6469 fval = 555.5422gydF4y2Ba
创造gydF4y2BaGlobalSearchgydF4y2Ba
对象,并设置迭代显示:gydF4y2Ba
gs = globalsearch('显示','iter');gydF4y2Ba
运行求解器:gydF4y2Ba
rng(14,捻线机)%的再现性[x, fval] = (gs、问题)Num分最佳运行电流阈值当地当地分析F-count f (x)点球点球f (x) exitflag过程0 0初始点200 200 555.5 555.5 1463 1.547 e15汽油1.547 e15汽油1阶段1当地300 1.074 1564 1.547 e15汽油5.858 e + 04第二阶段搜索400 4.16 1664 1.547 e15汽油1.84 e + 05年第二阶段搜索500 11.84 1764 1.547 e15汽油2.683 e + 04第二阶段搜索600 30.95 1864 1.547 e15汽油1.122 e + 04第二阶段搜索700 65.25 1964 1.547 e15汽油1.353 e + 04第二阶段搜索800 163.8 2064 1.547 e15汽油6.249 e + 04第二阶段搜索900 409.2 2164 1.547 e15汽油4.119 e + 04第二阶段搜索e15汽油1.547 950 2356 477 589.7 387当地2阶段2 952 2420 1.547 e15汽油368.4 477 250.7 - 2第二阶段当地1000 530.9 2468 1.547 e15汽油4.031 e + 04第二阶段搜索GlobalSearch停止,因为它所有的试验分析点。4个本地求解程序中有3个运行收敛于一个正的本地求解程序退出标志。fval = 1.5467e-15gydF4y2Ba
你可以得到不同的结果,因为gydF4y2BaGlobalSearchgydF4y2Ba
是随机的。gydF4y2Ba
求解器找到了三个局部最小值,并在附近找到了全局最小值gydF4y2Ba[0,0]gydF4y2Ba
。gydF4y2Ba
编写一个函数文件来计算目标:gydF4y2Ba
函数f = sawtoothxy(x,y) [t r] = cart2pol(x,y);h = cos(2*t - 1/2)/2 + cos(t) + 2;g = (sin (r) -罪(2 * r) / 2 +罪(3 * r) / 3 -罪(4 * r) / 4 + 4)…。* r。^ 2. / (r + 1);f = g。* h;结束gydF4y2Ba
创建问题结构。使用gydF4y2BafminuncgydF4y2Ba
解算器的gydF4y2Ba算法gydF4y2Ba
选项设置为gydF4y2Ba'quasi-newton'gydF4y2Ba
。这些选择的原因是:gydF4y2Ba
这个问题不受约束。因此,gydF4y2BafminuncgydF4y2Ba
是适当的求解器;看到gydF4y2Ba优化决策表gydF4y2Ba。gydF4y2Ba
默认值gydF4y2BafminuncgydF4y2Ba
算法需要梯度;看到gydF4y2Ba选择算法gydF4y2Ba。因此,集合gydF4y2Ba算法gydF4y2Ba
来gydF4y2Ba'quasi-newton'gydF4y2Ba
。gydF4y2Ba
问题= createOptimProblem(“fminunc”,…“客观”,@ (x) sawtoothxy (x(1),(2)),…x0,(100、-50),“选项”,…optimoptions (@fminunc、“算法”、“拟牛顿”,“显示”,“关闭”));gydF4y2Ba
通过运行验证问题结构:gydF4y2Ba
[x,fval] = fminunc(问题)x = 1.7533 -111.9488 fval = 577.6960gydF4y2Ba
创建一个默认的gydF4y2BaMultiStartgydF4y2Ba
目的:gydF4y2Ba
ms = multiStart;gydF4y2Ba
运行求解器50次迭代,记录局部最小值:gydF4y2Ba
% rng(1) % uncomment获得相同的结果[x,fval,eflag,output,manymins] = run(ms,problem,50) MultiStart从起点完成了一些运行。50个本地求解程序中有9个运行收敛于正的本地求解程序退出标志。x = -142.4608 406.8030 fval = 1.2516e+03 eflag = 2 output = struct with fields: funcCount: 8586 localSolverTotal: 50 localSolverSuccess: 9 localSolverIncomplete: 41 localSolverNoSolution: 0 message: 'MultiStart completed some of the run from the start points↵↵50个本地求解程序中有9个运行收敛于正的本地求解程序退出标志。' manymins = 1×9 GlobalOptimSolution数组的属性:X Fval Exitflag输出X0gydF4y2Ba
你可以得到不同的结果,因为gydF4y2BaMultiStartgydF4y2Ba
是随机的。gydF4y2Ba
求职者没有发现全球最小值gydF4y2Ba[0,0]gydF4y2Ba
。它发现了10个明显的局部极小值。gydF4y2Ba
在局部极小值处绘制函数值:gydF4y2Ba
直方图([manymins.Fval], 10)gydF4y2Ba
在三个最佳点绘制函数值:gydF4y2Ba
bestf = [manymins.Fval];直方图(bestf (1:3), 10)gydF4y2Ba
MultiStartgydF4y2Ba
开始gydF4y2BafminuncgydF4y2Ba
从初始点开始,分量均匀分布在-1000到1000之间。gydF4y2BafminuncgydF4y2Ba
经常被困在许多当地最小值之一。gydF4y2BafminuncgydF4y2Ba
超过其迭代限制或函数评估限制40次。gydF4y2Ba